近期项目中需要实现PDF文件添加水印的功能,在此记录下实现过程。
主要使用pdfbox实现该功能。
项目环境:
JDK>=1.8
maven
IDE:IDEA
pdfbox:2.0.25
<dependency> <groupId>org.apache.pdfbox</groupId> <artifactId>pdfbox-app</artifactId> <version>2.0.25</version> </dependency>
为文件添加水印,水印字体需要指定并加载到程序,以下程序中使用到的水印字体是我从网上随意找的一个免费字体。
此处将文件及字体文件均放在D:\\pdf
路径下。
程序如下:
package waterMark; import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.pdmodel.PDPage; import org.apache.pdfbox.pdmodel.PDPageContentStream; import org.apache.pdfbox.pdmodel.font.PDFont; import org.apache.pdfbox.pdmodel.font.PDType0Font; import org.apache.pdfbox.pdmodel.graphics.state.PDExtendedGraphicsState; import org.apache.pdfbox.util.Matrix; import java.io.File; import java.io.FileInputStream; /** * @author :czc * @date :Created in 2022/6/6 * @description :为PDF文件添加水印 */ public class WaterMarkUtil { public static void main(String[] args) { File file=new File("D:\\pdf\\测试文档.pdf"); String waterMark="测试水印"; float fontSize=13; int[] color={0,200,0}; int rowSize=150; int colSpace=150; try{ pdfWaterMark(file,waterMark,fontSize,color,rowSize,colSpace); }catch (Exception e){ System.out.println("为PDF文件添加水印失败:"+e); } } /** * @Author czc * @Description 为pdf文件添加水印 * @Date 2022/6/6 * @Param [tempFile, waterMark, fontSize, color, rowSpace, colSpace] * tempFile 需要添加水印的文件 * watermark 水印文字 * fontSize 水印字体大小 * color 字体颜色{r,g,b} * rowSpace 行间距,大中小分别对应150/100/50 * colSpace 列间距,大中小分别对应150/100/50 * @return void **/ public static void pdfWaterMark(File tempFile,String waterMark,float fontSize,int[] color,int rowSpace,int colSpace) throws Exception{ PDDocument document = PDDocument.load(tempFile); document.setAllSecurityToBeRemoved(true); // 遍历PDF文件,在每一页加上水印 for (PDPage page : document.getPages()) { PDPageContentStream stream = new PDPageContentStream(document, page, PDPageContentStream.AppendMode.APPEND, true, true); // 加载水印字体 PDFont font = PDType0Font.load(document, new FileInputStream("D://pdf//汉仪花木兰 W.ttf"), true); PDExtendedGraphicsState r = new PDExtendedGraphicsState(); // 设置透明度 r.setNonStrokingAlphaConstant(0.2f); r.setAlphaSourceFlag(true); stream.setGraphicsStateParameters(r); // 设置水印字体颜色 if (color.length == 3) { stream.setNonStrokingColor(color[0], color[1], color[2]); } stream.beginText(); stream.setFont(font, fontSize); stream.newLineAtOffset(0, -15); // 获取PDF页面大小 float pageHeight = page.getMediaBox().getHeight(); float pageWidth = page.getMediaBox().getWidth(); // 根据纸张大小添加水印,30度倾斜 for (int h = 10; h < pageHeight; h = h + rowSpace) { for (int w = - 10; w < pageWidth; w = w + colSpace) { stream.setTextMatrix(Matrix.getRotateInstance(0.3, w, h)); stream.showText(waterMark); } } // 结束渲染,关闭流 stream.endText(); stream.restoreGraphicsState(); stream.close(); } document.save(tempFile); } }
效果图如下:
以上测试文件及字体如有需要,以下百度网盘链接自取:
链接:https://pan.baidu.com/s/1vIviqmsQ7Tq9CL33NUapLQ
提取码:0318
本篇文章参考了以下博客,谨以此表示感谢:
- Java针对不同文件加水印,https://blog.csdn.net/jllion/article/details/123394328
- 利用PDFBOX给PDF文件添加水印,https://blog.csdn.net/Alan_1024/article/details/118524084