Java给PDF文件添加水印

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去设置,这里不详细说名。

Java Jacob 是一个 Java 与 Microsoft Office 交互的开源项目。它可以实现 Java 与 Office 应用程序(如 Word、Excel、PowerPoint)之间的互操作,包括打开、读取、编辑和保存文档。如果您需要对 PDF 文件添加水印,可以使用 iText 库。下面是一个简单的示例代码: ```java import java.io.File; import java.io.FileOutputStream; import com.itextpdf.text.Document; import com.itextpdf.text.Element; import com.itextpdf.text.Font; import com.itextpdf.text.PageSize; import com.itextpdf.text.Paragraph; import com.itextpdf.text.pdf.PdfContentByte; import com.itextpdf.text.pdf.PdfWriter; public class AddWatermark { public static void main(String[] args) { try { // 创建文档对象 Document document = new Document(PageSize.A4, 50, 50, 50, 50); PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(new File("test.pdf"))); document.open(); // 添加水印 PdfContentByte content = writer.getDirectContent(); Font font = new Font(Font.FontFamily.HELVETICA, 40); Paragraph watermark = new Paragraph("Confidential", font); watermark.setAlignment(Element.ALIGN_CENTER); content.beginText(); float width = PageSize.A4.getWidth(); float height = PageSize.A4.getHeight(); content.showTextAligned(Element.ALIGN_CENTER, watermark, width / 2, height / 2, 45); content.endText(); // 关闭文档 document.close(); } catch (Exception e) { e.printStackTrace(); } } } ``` 上述代码使用 iText 库创建了一个名为 "test.pdf" 的 PDF 文件,并在其中添加了一个名为 "Confidential" 的水印。如果您需要更改水印的样式或位置,请修改上述代码中的相应参数即可。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值