Java给PDF文件添加水印

谁借莪1个温暖的怀抱¢ 2024-03-16 20:08 239阅读 0赞

Java给PDF文件添加水印


文章目录

  • Java给PDF文件添加水印
  • 前言
  • 一、pdfbox
      • 1、介绍
      • 2、添加依赖
      • 3、测试代码
      • 4、效果
      • 5、注意点
  • 二、 iText
      • 1、介绍
      • 2、添加依赖
      • 3、测试代码
      • 4、效果
      • 5、注意点:
  • 三、Free Spire.PDF for Java
      • 1、介绍
      • 2、添加依赖
      • 3、测试代码
  • 总结

前言

现在很多pdf文件都需要添加水印,特别是政府网站的pdf,像发票等等。
本文基于SpringBoot来实现给pdf文件添加水印。


一、pdfbox

1、介绍

官网:https://pdfbox.apache.org/
Apache PDFBox是一个开源Java库,支持PDF文档的开发和转换。
使用此库,您可以开发用于创建,转换和操作PDF文档的Java程序。
除此之外,PDFBox还包括一个命令行实用程序,用于使用可用的Jar文件对PDF执行各种操作。

2、添加依赖

  1. <!-- pdfbox -->
  2. <dependency>
  3. <groupId>org.apache.pdfbox</groupId>
  4. <artifactId>pdfbox</artifactId>
  5. <version>2.0.28</version>
  6. </dependency>

3、测试代码

  1. File file = ResourceUtils.getFile("classpath:pdf/源文件.pdf");
  2. PDDocument document = PDDocument.load(file);
  3. // 循环所有页面、给每一页都添加水印
  4. for (int i = 0; i < document.getNumberOfPages(); i++) {
  5. PDPage page = document.getPage(i);
  6. PDPageContentStream contentStream = new PDPageContentStream(document, page, PDPageContentStream.AppendMode.APPEND, true, true);
  7. // 设置中文字体
  8. File fontFile = ResourceUtils.getFile("classpath:font/simfang.ttf");
  9. PDType0Font font = PDType0Font.load(document, fontFile);
  10. contentStream.setFont(font, 20);
  11. // 设置透明度
  12. contentStream.setNonStrokingColor(200, 200, 200);
  13. // 添加文本水印
  14. contentStream.beginText();
  15. // 设置水印位置
  16. contentStream.newLineAtOffset(100, 100);
  17. // 设置水印内容
  18. contentStream.showText("测试水印");
  19. contentStream.endText();
  20. contentStream.close();
  21. }
  22. // 保存修改后的 PDF 文件
  23. document.save(new File("pdf/output.pdf"));
  24. document.close();

4、效果

在这里插入图片描述

5、注意点

1、如果水印内容是中文,需要添加中文字体,否则会出现
U+6D4B ('.notdef') is not available in the font Helvetica-Bold错误
2、在打包的时候没有在pom中配置对字体文件的过滤会导致字体文件被编译,出现'head' table is mandatory错误,需要配置打包的时候过滤对应的文件

  1. <build>
  2. <plugins>
  3. <plugin>
  4. <groupId>org.apache.maven.plugins</groupId>
  5. <artifactId>maven-resources-plugin</artifactId>
  6. <version>2.7</version>
  7. <configuration>
  8. <nonFilteredFileExtensions>
  9. // 过滤字体文件
  10. <nonFilteredFileExtension>ttf</nonFilteredFileExtension>
  11. </nonFilteredFileExtensions>
  12. </configuration>
  13. <dependencies>
  14. <dependency>
  15. <groupId>org.apache.maven.shared</groupId>
  16. <artifactId>maven-filtering</artifactId>
  17. <version>1.3</version>
  18. </dependency>
  19. </dependencies>
  20. </plugin>
  21. </plugins>
  22. </build>

3、部署在linux上时候要安装对应的中文字体

二、 iText

1、介绍

官网:https://itextpdf.com/
iText 是一个非常著名的能够快速产生 PDF 文件的 Java 类库。支持文本,表格,图形的操作,可以方便的跟 Servlet 进行结合。

2、添加依赖

  1. <!-- itextpdf -->
  2. <dependency>
  3. <groupId>com.itextpdf</groupId>
  4. <artifactId>itextpdf</artifactId>
  5. <version>5.5.13.3</version>
  6. </dependency>

3、测试代码

  1. File file = ResourceUtils.getFile("classpath:pdf/源文件.pdf");
  2. File fontFile = ResourceUtils.getFile("classpath:font/simfang.ttf");
  3. InputStream inputStream=new FileInputStream(file);
  4. // 读取原始 PDF 文件
  5. PdfReader reader = new PdfReader(inputStream);
  6. PdfStamper stamper = new PdfStamper(reader, new FileOutputStream("pdf/IText.pdf"));
  7. // 获取 PDF 中的页数
  8. int pageCount = reader.getNumberOfPages();
  9. // 添加水印
  10. for (int i = 1; i <= pageCount; i++) {
  11. PdfContentByte contentByte = stamper.getUnderContent(i);
  12. contentByte.beginText();
  13. // 设置中文字体
  14. contentByte.setFontAndSize(BaseFont.createFont(fontFile.getAbsolutePath(),BaseFont.IDENTITY_H,BaseFont.NOT_EMBEDDED), 36f);
  15. // 设置样式
  16. contentByte.setColorFill(BaseColor.LIGHT_GRAY);
  17. contentByte.showTextAligned(Element.ALIGN_CENTER, "IText测试水印", 300, 400, 45);
  18. contentByte.endText();
  19. }
  20. // 保存修改后的 PDF 文件并关闭文件流
  21. stamper.close();
  22. 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、添加依赖

  1. <!-- itextpdf -->
  2. <dependency>
  3. <groupId>com.itextpdf</groupId>
  4. <artifactId>itextpdf</artifactId>
  5. <version>5.5.13.3</version>
  6. </dependency>

3、测试代码

  1. // 读取原始 PDF 文件
  2. PdfDocument pdf = new PdfDocument();
  3. pdf.loadFromFile("classpath:pdf/源文件.pdf");
  4. // 遍历 PDF 中的所有页面
  5. for (int i = 0; i < pdf.getPages().getCount(); i++) {
  6. PdfPageBase page = pdf.getPages().get(i);
  7. // 添加文本水印
  8. PdfWatermark watermark = new PdfWatermark("测试水印");
  9. watermark.setFont(new PdfFont(PdfFontFamily.Helvetica, 36));
  10. watermark.setOpacity(0.5f);
  11. page.getWatermarks().add(watermark);
  12. // 添加图片水印
  13. // PdfWatermark watermark = new PdfWatermark("watermark.png");
  14. // watermark.setOpacity(0.5f);
  15. // page.getWatermarks().add(watermark);
  16. }
  17. // 保存修改后的 PDF 文件
  18. pdf.saveToFile("测试水印.pdf");
  19. pdf.close();

总结

上面就举例较为常用的第一个和第二个,除了上面的方案还有 Aspose.PDF for Java、 Ghostscript 命令行等等,需要的可以自行研究。

代码放到gitee、需要自取,能点个star就更好了。
https://gitee.com/xyzissj/pdfwartermark

给pdf添加水印的方式有很多种,根据自己的需要选择,这里只是实例怎么添加水印,以及相应的注意点,至于水印的大小、颜色、方向、角度等等,就需要根据对应的api去设置,这里不详细说名。

发表评论

表情:
评论列表 (有 0 条评论,239人围观)

还没有评论,来说两句吧...

相关阅读

    相关 C# PDF文件添加水印

    水印种类及功能介绍 PDF水印分为两种:文本水印和图片水印。文本水印一般被用在商业领域,提醒读者该文档是受版权保护的,其他人不能抄袭或者免费使用。除了这个特征,水印还可以用来