Java实现根据模板读取PDF并替换指定内容

 更新时间:2025年02月10日 09:22:28   作者:五行星辰  
在实际开发里,经常会遇到需要根据 PDF 模板文档生成特定 PDF 的需求,本文将利用Java中的iText实现读取 PDF 模板文档并替换指定内容,最后重新生成新PDF,感兴趣的可以了解下

在实际开发里,经常会遇到需要根据 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 代码实现

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");
            // 创建一个输出流,用于保存新生成的 PDF
            FileOutputStream 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 和 reader
            stamper.close();
            reader.close();
            outputStream.close();
 
            System.out.println("新的 PDF 文档生成成功!");
        } catch (IOException | DocumentException e) {
            e.printStackTrace();
            System.out.println("生成新的 PDF 文档失败:" + e.getMessage());
        }
    }
}

4. 代码解释

1.读取 PDF 模板文件

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 内容。

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

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 方法创建一个支持中文的字体,并添加到表单中。

3.准备要替换的数据

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

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

4.替换表单中的占位符

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

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

5.关闭表单编辑并保存新 PDF

stamper.setFormFlattening(true);
stamper.close();
reader.close();
outputStream.close();

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

以上就是Java实现根据模板读取PDF并替换指定内容的详细内容,更多关于Java读取PDF的资料请关注脚本之家其它相关文章!

相关文章

  • Springboot中如何自动转JSON输出

    Springboot中如何自动转JSON输出

    这篇文章主要介绍了Springboot中如何自动转JSON输出,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-06-06
  • Java开发之Spring连接数据库方法实例分析

    Java开发之Spring连接数据库方法实例分析

    这篇文章主要介绍了Java开发之Spring连接数据库方法,以实例形式较为详细的分析了Java Spring开发中针对数据库的相关操作技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-10-10
  • Mybatis之如何拦截慢SQL日志记录

    Mybatis之如何拦截慢SQL日志记录

    这篇文章主要介绍了Mybatis之如何拦截慢SQL日志记录问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-05-05
  • Mybatis Mapper接口和xml绑定的多种方式、内部实现原理和过程解析

    Mybatis Mapper接口和xml绑定的多种方式、内部实现原理和过程解析

    在Mybatis中,我们需要创建一个与实体类对应的Mapper接口,然后在该接口上添加方法,这些方法对应着SQL语句,这篇文章主要介绍了Mybatis Mapper接口和xml绑定的多种方式、内部实现原理和过程,需要的朋友可以参考下
    2023-11-11
  • JAVA Integer类常用方法解析

    JAVA Integer类常用方法解析

    这篇文章主要介绍了JAVA Integer类常用方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-03-03
  • 解读JVM的生命周期是怎么样的

    解读JVM的生命周期是怎么样的

    JVM的生命周期包括启动、运行和终止三个阶段,启动阶段包括创建JVM实例、加载和初始化核心类库、加载main方法所在的类和初始化类,运行阶段包括执行main方法、类加载、字节码执行、内存管理、线程管理和异常处理,终止阶段包括正常终止、异常终止和外部终止
    2025-03-03
  • Java通过httpclient比较重定向和请求转发

    Java通过httpclient比较重定向和请求转发

    这篇文章主要介绍了Java通过httpclient比较重定向和请求转发,HttpClient 4.x 版本,get请求方法会自动进行重定向,而post请求方法不会自动进行重定向,需要的朋友可以参考下
    2023-04-04
  • 浅试仿 mapstruct实现微服务编排框架详解

    浅试仿 mapstruct实现微服务编排框架详解

    这篇文章主要为大家介绍了浅试仿 mapstruct实现微服务编排框架详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-08-08
  • 深入了解java NIO之Selector(选择器)

    深入了解java NIO之Selector(选择器)

    这篇文章主要介绍了java NIO之Selector(选择器)的相关资料,文中讲解非常详细,实例代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下
    2020-07-07
  • java二维数组遍历的2种代码

    java二维数组遍历的2种代码

    这篇文章主要介绍了java二维数组遍历的2种代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-07-07

最新评论