Maven
<dependency> <groupId>org.apache.pdfbox</groupId> <artifactId>pdfbox</artifactId> <version>2.0.24</version> <!-- 请检查并使用最新版本 --> </dependency>
Main方法 只添加一个水印
public static void main(String[] args) {
try {
// 加载PDF文档
PDDocument document = PDDocument.load(new File("C:\\Users\\JIANDIQ\\Desktop\\file\\template\\合同台账\\合同台账文件备份zxht-a366-2013-035-c.pdf"));
// 加载字体 可自行下载不然中文会报错
PDFont font = PDType0Font.load(document, new File("/opt/quotations/Alibaba_PuHuiTi_2.0_45_Light_45_Light.ttf"));
// 水印文字
String watermarkText = "JIANGDIQING";
// 水印大小
float fontSize = 16;
PDExtendedGraphicsState r0 = new PDExtendedGraphicsState();
// 水印透明度
r0.setNonStrokingAlphaConstant(0.1f);
r0.setAlphaSourceFlag(true);
// 遍历每一页
for (PDPage page : document.getPages()) {
// 这里一定要有两个true 不然有事不会覆盖成功 导致水印打失败
PDPageContentStream contentStream = new PDPageContentStream(document, page, PDPageContentStream.AppendMode.APPEND, true, true);
// 设置字体和颜色
// 默认的 中文会报错
contentStream.setFont(PDType1Font.HELVETICA_BOLD, fontSize);
// 自定义的字体
contentStream.setFont(font, fontSize);
// 黑色
contentStream.setNonStrokingColor(0, 0, 0);
// 水印透明度
contentStream.setGraphicsStateParameters(r0);
contentStream.beginText();
for (int i = 0; i <= 10; i++) {
// 获取旋转实例
contentStream.setTextMatrix(Matrix.getRotateInstance(-150, i * 70, 0));
contentStream.showText(watermarkText);
for (int j = 0; j < 20; j++) {
contentStream.setTextMatrix(Matrix.getRotateInstance(-150, i * 70, j * watermarkText.length() * fontSize / 2 ));
contentStream.showText(watermarkText);
}
}
contentStream.endText();
contentStream.restoreGraphicsState();
contentStream.close();
}
// 保存带有水印的PDF
document.save("C:\\Users\\JIANDIQ\\Desktop\\file\\template\\合同台账\\水印.pdf");
document.close();
System.out.println("Watermark added successfully!");
} catch (Exception e) {
e.printStackTrace();
}
}