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

embedded/2025/2/12 20:00:39/

朋友们!在实际开发里,经常会遇到需要根据 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/embedded/161677.html

相关文章

Failed to build mysqlclient

​​​​​​​Links for mysqlclient 在上述链接下载对应版本即可。 Installing build dependencies ... done Getting requirements to build wheel ... done Preparing metadata (pyproject.toml) ... done Building wheels for collected packages: mysqlclient Bui…

制药行业 BI 可视化数据分析方案

一、行业背景 随着医药行业数字化转型的深入&#xff0c;企业积累了海量的数据&#xff0c;包括销售数据、生产数据、研发数据、市场数据等。如何利用这些数据&#xff0c;挖掘其价值&#xff0c;为企业决策提供支持&#xff0c;成为医药企业面临的重大挑战。在当今竞争激烈的…

阿里 Java 岗个人面经分享(技术三面 + 技术 HR 面):Java 基础 +Spring+JVM+ 并发编程 + 算法 + 缓存

技术一面 20 分钟 1、自我介绍 说了很多遍了&#xff0c;很流畅捡重点介绍完。 2、问我数据结构算法好不好 挺好的&#xff08;其实心还是有点虚&#xff0c;不过最近刷了很多题也只能壮着胆子充胖子了&#xff09; 3、找到单链表的三等分点&#xff0c;如果单链表是有环的…

Hyperledger Fabric 入门笔记(十七)Fabric V2.5 测试网络部署补充 - 手动为已加入通道的组织增加Peer节点

文章目录 一、手动为已加入通道的组织增加Peer节点1.1. 准备工作1.2. 流程1.2.1. 为新增Peer节点生成加密材料1.2.2. 启动新增的Peer节点1.2.3. 将新增Peer节点加入现有通道 一、手动为已加入通道的组织增加Peer节点 1.1. 准备工作 本节通过向已加入应用通道的组织Org1增加Pe…

HTML 左右联动高亮示例

HTML 左右联动高亮示例 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>左右联动高亮示例</titl…

【C/C++】每日温度 [ 栈的应用 ] 蓝桥杯/ACM备赛

数据结构考点&#xff1a;栈 题目描述&#xff1a; 给定一个整数数组 temperatures &#xff0c;表示每天的温度&#xff0c;返回一个数组 answer &#xff0c;其中 answer[i] 是指对于第 i 天&#xff0c;下一个更高温度出现在几天后。如果气温在这之后都不会升高&#xff0…

LS-MDMTSP:粒子群优化算法PSO求解大规模多仓库多旅行商问题(LS-MDMTSP),MATLAB代码

一、问题定义 大规模多仓库多旅行商问题&#xff08;Large - Scale Multi - Depot Multi - Traveling Salesman Problem&#xff0c;简称 LS - MDMTSP&#xff09;是在经典旅行商问题基础上拓展而来的复杂组合优化问题。与单仓库情形不同&#xff0c;该问题设定了多个仓库&…

【设计模式】【行为型模式】命令模式(Command)

&#x1f44b;hi&#xff0c;我不是一名外包公司的员工&#xff0c;也不会偷吃茶水间的零食&#xff0c;我的梦想是能写高端CRUD &#x1f525; 2025本人正在沉淀中… 博客更新速度 &#x1f4eb; 欢迎V&#xff1a; flzjcsg2&#xff0c;我们共同讨论Java深渊的奥秘 &#x1f…