使用pdfbox 为 PDF增加水印https://www.jylt.cc/#/detail?activityIndex=2&id=bd410851b0a72dad3105f9d50787f914
引入依赖
<dependency>
<groupId>org.apache.pdfbox</groupId>
<artifactId>pdfbox</artifactId>
<version>3.0.1</version>
</dependency>
<!--下面操作图片的时候需要用到该工具类-->
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-core</artifactId>
<version>5.8.25</version>
</dependency>
具体代码实现
public static void main(String[] args) throws Exception {
// 读取原始 PDF 文件
PDDocument document = PDDocument.load(new File("/Users/a58/Downloads/test.pdf"));
File file = new File("/Users/picture/Downloads/waterMark.png");
BufferedOutputStream outputStream = FileUtil.getOutputStream(file);
FileImageOutputStream fileImageOutputStream = new FileImageOutputStream(file);
// 创建文字图片
Font font = new Font("宋体", Font.PLAIN, 12);
Color fontColor = new Color(100, 100, 100, 60);
ImgUtil.createImage("水印", font, null, fontColor, fileImageOutputStream);
// 旋转图片,使水印倾斜
ImgUtil.rotate(file, -20, file);
// 遍历 PDF 中的所有页面
for (int i = 0; i < document.getNumberOfPages(); i++) {
PDPage page = document.getPage(i);
PDPageContentStream contentStream = new PDPageContentStream(document, page, PDPageContentStream.AppendMode.APPEND, true, true);
// PDF页面宽度
float pageWidth = page.getMediaBox().getWidth();
// PDF页面高度
float pageHeight = page.getMediaBox().getHeight();
// 4:每页有4列水印
int xBegin = (int) (pageWidth / 4);
// 8:每页有8行水印
int yBegin = (int) (pageHeight / 8);
// 加载图片
PDImageXObject pdImageXObject = PDImageXObject.createFromFile(file.getAbsolutePath(), document);
float width = pdImageXObject.getWidth();
float height = pdImageXObject.getHeight();
for (int yIndex = 0; yIndex < 8; yIndex++) {
for (int xIndex = 0; xIndex < 4; xIndex++) {
contentStream.drawImage(pdImageXObject, (xBegin * xIndex) + 5, (yBegin * yIndex), width, height);
}
yIndex++;
}
contentStream.close();
}
// 保存修改后的 PDF 文件
document.save(new File("/Users/picture/Downloads/testout.pdf"));
document.close();
System.out.println("完成");
}