Java给PDF文件添加水印
文章目录
前言
现在很多pdf文件都需要添加水印,特别是政府网站的pdf,像发票等等。
本文基于SpringBoot来实现给pdf文件添加水印。
一、pdfbox
1、介绍
官网:https://pdfbox.apache.org/
Apache PDFBox是一个开源Java库,支持PDF文档的开发和转换。
使用此库,您可以开发用于创建,转换和操作PDF文档的Java程序。
除此之外,PDFBox还包括一个命令行实用程序,用于使用可用的Jar文件对PDF执行各种操作。
2、添加依赖
<!-- pdfbox -->
<dependency>
<groupId>org.apache.pdfbox</groupId>
<artifactId>pdfbox</artifactId>
<version>2.0.28</version>
</dependency>
3、测试代码
File file = ResourceUtils.getFile("classpath:pdf/源文件.pdf");
PDDocument document = PDDocument.load(file);
// 循环所有页面、给每一页都添加水印
for (int i = 0; i < document.getNumberOfPages(); i++) {
PDPage page = document.getPage(i);
PDPageContentStream contentStream = new PDPageContentStream(document, page, PDPageContentStream.AppendMode.APPEND, true, true);
// 设置中文字体
File fontFile = ResourceUtils.getFile("classpath:font/simfang.ttf");
PDType0Font font = PDType0Font.load(document, fontFile);
contentStream.setFont(font, 20);
// 设置透明度
contentStream.setNonStrokingColor(200, 200, 200);
// 添加文本水印
contentStream.beginText();
// 设置水印位置
contentStream.newLineAtOffset(100, 100);
// 设置水印内容
contentStream.showText("测试水印");
contentStream.endText();
contentStream.close();
}
// 保存修改后的 PDF 文件
document.save(new File("pdf/output.pdf"));
document.close();
4、效果
5、注意点
1、如果水印内容是中文,需要添加中文字体,否则会出现
U+6D4B ('.notdef') is not available in the font Helvetica-Bold
错误
2、在打包的时候没有在pom中配置对字体文件的过滤会导致字体文件被编译,出现'head' table is mandatory
错误,需要配置打包的时候过滤对应的文件
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>2.7</version>
<configuration>
<nonFilteredFileExtensions>
// 过滤字体文件
<nonFilteredFileExtension>ttf</nonFilteredFileExtension>
</nonFilteredFileExtensions>
</configuration>
<dependencies>
<dependency>
<groupId>org.apache.maven.shared</groupId>
<artifactId>maven-filtering</artifactId>
<version>1.3</version>
</dependency>
</dependencies>
</plugin>
</plugins>
</build>
3、部署在linux上时候要安装对应的中文字体
二、 iText
1、介绍
官网:https://itextpdf.com/
iText 是一个非常著名的能够快速产生 PDF 文件的 Java 类库。支持文本,表格,图形的操作,可以方便的跟 Servlet 进行结合。
2、添加依赖
<!-- itextpdf -->
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itextpdf</artifactId>
<version>5.5.13.3</version>
</dependency>
3、测试代码
File file = ResourceUtils.getFile("classpath:pdf/源文件.pdf");
File fontFile = ResourceUtils.getFile("classpath:font/simfang.ttf");
InputStream inputStream=new FileInputStream(file);
// 读取原始 PDF 文件
PdfReader reader = new PdfReader(inputStream);
PdfStamper stamper = new PdfStamper(reader, new FileOutputStream("pdf/IText.pdf"));
// 获取 PDF 中的页数
int pageCount = reader.getNumberOfPages();
// 添加水印
for (int i = 1; i <= pageCount; i++) {
PdfContentByte contentByte = stamper.getUnderContent(i);
contentByte.beginText();
// 设置中文字体
contentByte.setFontAndSize(BaseFont.createFont(fontFile.getAbsolutePath(),BaseFont.IDENTITY_H,BaseFont.NOT_EMBEDDED), 36f);
// 设置样式
contentByte.setColorFill(BaseColor.LIGHT_GRAY);
contentByte.showTextAligned(Element.ALIGN_CENTER, "IText测试水印", 300, 400, 45);
contentByte.endText();
}
// 保存修改后的 PDF 文件并关闭文件流
stamper.close();
reader.close();
4、效果
5、注意点:
1、水印内容是中文、需要添加对应的字体文件,没有字体文件的话中文不会显示
2、同上,打包需要配置
三、Free Spire.PDF for Java
1、介绍
官网:https://www.e-iceblue.cn/Downloads/Free-Spire-PDF-JAVA.html
Free Spire.PDF for Java 是一款免费的 Java PDF 库,它提供了一个简单易用的 API,用于创建、读取、修改和提取 PDF 内容。Free Spire.PDF for Java 也支持添加文本水印以及图片水印。
2、添加依赖
<!-- itextpdf -->
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itextpdf</artifactId>
<version>5.5.13.3</version>
</dependency>
3、测试代码
// 读取原始 PDF 文件
PdfDocument pdf = new PdfDocument();
pdf.loadFromFile("classpath:pdf/源文件.pdf");
// 遍历 PDF 中的所有页面
for (int i = 0; i < pdf.getPages().getCount(); i++) {
PdfPageBase page = pdf.getPages().get(i);
// 添加文本水印
PdfWatermark watermark = new PdfWatermark("测试水印");
watermark.setFont(new PdfFont(PdfFontFamily.Helvetica, 36));
watermark.setOpacity(0.5f);
page.getWatermarks().add(watermark);
// 添加图片水印
// PdfWatermark watermark = new PdfWatermark("watermark.png");
// watermark.setOpacity(0.5f);
// page.getWatermarks().add(watermark);
}
// 保存修改后的 PDF 文件
pdf.saveToFile("测试水印.pdf");
pdf.close();
总结
上面就举例较为常用的第一个和第二个,除了上面的方案还有 Aspose.PDF for Java、 Ghostscript 命令行等等,需要的可以自行研究。
代码放到gitee、需要自取,能点个star就更好了。
https://gitee.com/xyzissj/pdfwartermark
给pdf添加水印的方式有很多种,根据自己的需要选择,这里只是实例怎么添加水印,以及相应的注意点,至于水印的大小、颜色、方向、角度等等,就需要根据对应的api去设置,这里不详细说名。