Java 读取 PDF 模板文档并替换内容重新生成 PDF

ops/2025/2/11 1:19:14/

朋友们!在实际开发里,经常会遇到需要根据 PDF 模板文档生成特定 PDF 的需求,比如合同、证书等。咱们可以借助 iText 库来实现读取 PDF 模板文档、替换指定内容,最后重新生成新 PDF 的功能。下面我就详细给大家讲讲具体怎么做。

1. 引入依赖

如果你用 Maven 管理项目,在 pom.xml 里添加以下依赖:

 
<dependencies><dependency><groupId>com.itextpdf</groupId><artifactId>itextpdf</artifactId><version>5.5.13.3</version></dependency><dependency><groupId>com.itextpdf</groupId><artifactId>itext-asian</artifactId><version>5.2.0</version></dependency>
</dependencies>

itext-asian 这个依赖是为了支持中文等亚洲文字的显示。

2. 创建 PDF 模板

首先,得有一个 PDF 模板文件 template.pdf,在模板里用特定的占位符来表示需要替换的内容。可以使用 Adobe Acrobat 等工具在 PDF 里添加文本域作为占位符,比如添加一个名为 name 的文本域来表示姓名。

3. Java 代码实现

 
java">import com.itextpdf.text.DocumentException;
import com.itextpdf.text.pdf.*;import java.io.*;
import java.util.HashMap;
import java.util.Map;public class PdfTemplateProcessor {public static void main(String[] args) {try {// 读取 PDF 模板文件PdfReader reader = new PdfReader("template.pdf");// 创建一个输出流,用于保存新生成的 PDFFileOutputStream outputStream = new FileOutputStream("output.pdf");// 创建一个 PdfStamper 对象,用于操作 PDF 内容PdfStamper stamper = new PdfStamper(reader, outputStream);// 获取 PDF 表单AcroFields form = stamper.getAcroFields();// 设置支持中文BaseFont baseFont = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);form.addSubstitutionFont(baseFont);// 准备要替换的数据Map<String, String> data = new HashMap<>();data.put("name", "张三");data.put("date", "2024-10-01");// 替换表单中的占位符for (Map.Entry<String, String> entry : data.entrySet()) {String fieldName = entry.getKey();String fieldValue = entry.getValue();form.setField(fieldName, fieldValue);}// 关闭表单编辑stamper.setFormFlattening(true);// 关闭 stamper 和 readerstamper.close();reader.close();outputStream.close();System.out.println("新的 PDF 文档生成成功!");} catch (IOException | DocumentException e) {e.printStackTrace();System.out.println("生成新的 PDF 文档失败:" + e.getMessage());}}
}

4. 代码解释

读取 PDF 模板文件

 
java">PdfReader reader = new PdfReader("template.pdf");
FileOutputStream outputStream = new FileOutputStream("output.pdf");
PdfStamper stamper = new PdfStamper(reader, outputStream);

通过 PdfReader 读取 template.pdf 文件,使用 FileOutputStream 创建一个输出流,用于保存新生成的 PDF 文件。PdfStamper 是 iText 里用于操作 PDF 内容的重要类,它能让我们在不改变原文件结构的情况下修改 PDF 内容。

获取 PDF 表单并设置中文支持

 
java">AcroFields form = stamper.getAcroFields();
BaseFont baseFont = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
form.addSubstitutionFont(baseFont);

AcroFields 表示 PDF 中的表单域,通过 stamper.getAcroFields() 获取表单。为了支持中文显示,使用 BaseFont.createFont 方法创建一个支持中文的字体,并添加到表单中。

准备要替换的数据

 
java">Map<String, String> data = new HashMap<>();
data.put("name", "张三");
data.put("date", "2024-10-01");

创建一个 Map 对象,将占位符(表单域名称)和要替换的内容进行映射。

替换表单中的占位符

 
java">for (Map.Entry<String, String> entry : data.entrySet()) {String fieldName = entry.getKey();String fieldValue = entry.getValue();form.setField(fieldName, fieldValue);
}

遍历 Map,使用 form.setField 方法将表单域中的占位符替换为实际内容。

关闭表单编辑并保存新 PDF

 
java">stamper.setFormFlattening(true);
stamper.close();
reader.close();
outputStream.close();

stamper.setFormFlattening(true) 用于将表单域扁平化,防止表单域被再次编辑。最后关闭 stamperreader 和输出流,保存新生成的 PDF 文件。

朋友们!按照上面的步骤,你就可以使用 Java 读取 PDF 模板文档并替换指定内容,重新生成新的 PDF 文档啦。赶紧动手试试吧!


http://www.ppmy.cn/ops/157405.html

相关文章

全志A133 android10 thermal温控策略配置调试

一&#xff0c;功能介绍 Thermal简称热控制系统&#xff0c;其功能是通过temperature sensor&#xff08;温度传感器&#xff09;测量当前CPU、GPU等设备的温度值&#xff0c;然后根据此温度值&#xff0c;影响CPU、GPU等设备的调频策略&#xff0c;对CPU、GPU等设备的最大频率…

网络安全警示录:.wex勒索病毒的独特特性与应对之道

在数字化时代&#xff0c;网络安全威胁层出不穷&#xff0c;其中勒索病毒已成为企业和个人用户面临的一大挑战。近年来&#xff0c;.wex勒索病毒以其独特的加密方式和广泛的传播手段&#xff0c;给全球网络安全带来了严重威胁。本文将深入探讨.wex勒索病毒的独特特性&#xff0…

graylog初体验

最近graylog比较火&#xff0c;部署了一个来测试下&#xff0c;看下后续能不能代替目前占用资源比较多的elk&#xff0c;目前未对graylog性能进行深入测试&#xff0c;只是简单体验了下&#xff0c;graylog的UI比较简陋&#xff0c;但是在报警以及权限方面优于ELK&#xff0c;整…

信息安全、网络安全和数据安全的区别和联系

一、区别 1.信息安全 定义 信息安全是指为数据处理系统建立和采用的技术和管理的安全保护&#xff0c;保护计算机硬件、软件和数据不因偶然和恶意的原因而遭到破坏、更改和泄露。它的范围比较广泛&#xff0c;涵盖了信息的保密性、完整性和可用性等多个方面。 侧重点 更强…

瑞芯微 Rockchip 系列 RK3588 主流深度学习框架模型转成 rknn 模型教程

前言 在瑞芯微 Rockchip 芯片上进行 NPU 推理&#xff0c;需要先将模型文件转换成 rknn 模型文件&#xff0c;才能执行各种推理任务。本文将介绍如何安装各种工具&#xff0c;并最终实现将各种深度学习框架的模型文件转换成 rknn 文件。 本教程不仅适合 RK3588 平台&#xff…

windows phpstudy python cgi配置

修改apache配置文件:httpd.conf 搜索’Define SRVROOT’&#xff0c; 查看cgi根目录&#xff0c;python脚本需要放在该 Define SRVROOT "D:/Program/phpstudy_pro/Extensions/Apache2.4.39解决中文乱码 文件最后添加AddDefaultCharset gbk 重启apache python脚本: #!py…

SickOs 1.2靶机(超详细教学)

靶机地址&#xff1a;https://www.vulnhub.com/entry/sickos-12,144/ 一、主机发现 使用 arp-scan -l查找靶机ip地址 靶机ip地址为192.168.55.146 攻击机的ip地址为192.168.55.129 二、进行端口扫描、目录枚举、指纹识别 1.端口扫描 nmap 192.168.55.146发现靶机只有22和…

Git―分支管理

Git ⛅创建&切换&合并分支⛅删除分支⛅合并冲突⛅合并模式⛅Bug 分支⛅强制删除分支 master → 主分支 # 查看本地所有分支 git branch分支前面的*, 代表当前所在的分支 图中当前所在的分支为master ⛅创建&切换&合并分支 # 创建分支 git branch "bra…