Java实现PDF文件添加水印
引入
近期项目中需要实现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);
// 加载水印字体
PDFont font = PDType0Font.load(document, new FileInputStream("D://pdf//汉仪花木兰 W.ttf"), true);
// 遍历PDF文件,在每一页加上水印
for (PDPage page : document.getPages()) {
PDPageContentStream stream = new PDPageContentStream(document, page, PDPageContentStream.AppendMode.APPEND, true, 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);
document.close();
}
}
效果图如下:
以上测试文件及字体如有需要,以下百度网盘链接自取:
链接: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