当前位置: 代码网 > it编程>编程语言>Java > Java实现根据模板读取PDF并替换指定内容

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

2025年02月13日 Java 我要评论
在实际开发里,经常会遇到需要根据 pdf 模板文档生成特定 pdf 的需求,比如合同、证书等。咱们可以借助 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的资料请关注代码网其它相关文章!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2026  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com