当前位置: 首页 > article >正文

Java 读取 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. 代码解释

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

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

准备要替换的数据

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

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

替换表单中的占位符

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

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

关闭表单编辑并保存新 PDF

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

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

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


http://www.kler.cn/a/542514.html

相关文章:

  • 华为openEuler部署docker
  • 计算机毕业设计——Springboot的旅游管理
  • 模块的加载机制
  • Visual Studio 使用 “Ctrl + /”键设置注释和取消注释
  • 云原生时代的后端开发:架构、工具与最佳实践
  • 【算法学习】拓扑排序(Topological Sorting)
  • CES Asia 2025:科技盛宴助力中国数字经济腾飞
  • 中间件-安装Minio-集成使用(ubantu-docker)
  • Vue项目--动画效果的改变
  • Swift的方法派发机制
  • 模块化的基本概念
  • docker 安装 Prometheus、Node Exporter 和 Grafana
  • 【如何掌握CSP-J 信奥赛中的排序算法】
  • oracle执行grant授权sql被阻塞问题处理
  • 【PromptCoder + Bolt.new】自动生成页面和路由——提升开发效率的利器
  • 简述C#多线程
  • Zookeeper 作注册中心 和nacos 和eruka 有什么差异 ?基于什么理论选择?
  • 第七节 文件与流
  • spring cloud 使用 webSocket
  • SpringCloud - Gateway 网关
  • 常用电路(过压保护、电流/电压采集)
  • 开源AI智能名片2+1链动模式S2B2C商城小程序在实体店与线上营销中的应用探索
  • 教程 | MySQL 基本指令指南(附MySQL软件包)
  • 最新PHP盲盒商城系统源码 晒图+免签+短信验证+在线回收 ThinkPHP框架
  • MySQL——CRUD
  • Java爬虫:高效获取1688商品详情的“数字猎人”