欢迎来到徐庆高(Tea)的个人博客网站
磨难很爱我,一度将我连根拔起。从惊慌失措到心力交瘁,我孤身一人,但并不孤独无依。依赖那些依赖我的人,信任那些信任我的人,帮助那些给予我帮助的人。如果我愿意,可以分裂成无数面镜子,让他们看见我,就像看见自己。察言观色和模仿学习是我的领域。像每个深受创伤的人那样,最终,我学会了随遇而安。
当前位置: 日志文章 > 详细内容

Java实现PDF模板动态赋值与文档生成的多种方式

2025年07月10日 Java
1. apache pdfboxapache pdfbox 是一个开源的 java 库,可用于创建、操作和提取 pdf 文档中的内容。它提供了丰富的 api 来处理 pdf 表单,能够实现从 pdf

1. apache pdfbox

apache pdfbox 是一个开源的 java 库,可用于创建、操作和提取 pdf 文档中的内容。它提供了丰富的 api 来处理 pdf 表单,能够实现从 pdf 模板生成新文档并动态赋值的功能。

添加依赖

如果你使用 maven 项目,在 ​​pom.xml​​ 中添加以下依赖:

<dependency>
    <groupid>org.apache.pdfbox</groupid>
    <artifactid>pdfbox</artifactid>
    <version>3.0.0</version>
</dependency>

示例代码

import org.apache.pdfbox.pdmodel.pddocument;
import org.apache.pdfbox.pdmodel.pdpage;
import org.apache.pdfbox.pdmodel.interactive.form.pdacroform;
import org.apache.pdfbox.pdmodel.interactive.form.pdfield;

import java.io.file;
import java.io.ioexception;
import java.util.hashmap;
import java.util.map;

public class pdfboxtemplategenerator {

    public static void main(string[] args) {
        string templatepath = "template.pdf";
        string outputpath = "output.pdf";
        map<string, string> values = new hashmap<>();
        values.put("name", "李四");
        values.put("age", "30");

        try {
            generatepdffromtemplate(templatepath, outputpath, values);
            system.out.println("pdf 文档生成成功,路径为: " + outputpath);
        } catch (ioexception e) {
            system.err.println("生成 pdf 文档时出现错误: " + e.getmessage());
            e.printstacktrace();
        }
    }

    public static void generatepdffromtemplate(string templatepath, string outputpath, map<string, string> values) throws ioexception {
        // 加载 pdf 模板文档
        try (pddocument document = pddocument.load(new file(templatepath))) {
            // 获取文档中的表单
            pdacroform acroform = document.getdocumentcatalog().getacroform();
            if (acroform != null) {
                // 遍历动态赋值的键值对
                for (map.entry<string, string> entry : values.entryset()) {
                    // 获取表单字段
                    pdfield field = acroform.getfield(entry.getkey());
                    if (field != null) {
                        // 设置字段的值
                        field.setvalue(entry.getvalue());
                    }
                }
            }

            // 保存修改后的文档
            document.save(outputpath);
        }
    }
}

代码解释

  • ​pddocument.load​​:用于加载 pdf 模板文件。
  • ​document.getdocumentcatalog().getacroform()​​:获取 pdf 文档中的表单。
  • ​acroform.getfield​​:通过字段名称获取表单字段。
  • ​field.setvalue​​:设置表单字段的值。
  • ​document.save​​:保存修改后的文档。

2. flying saucer

flying saucer 是一个用于将 html/css 转换为 pdf 的 java 库。你可以先创建 html 模板,然后将其转换为 pdf 文档,并在 html 中使用占位符进行动态赋值。

添加依赖

如果你使用 maven 项目,在 ​​pom.xml​​ 中添加以下依赖:

<dependency>
    <groupid>org.xhtmlrenderer</groupid>
    <artifactid>flying-saucer-pdf-itext5</artifactid>
    <version>9.1.22</version>
</dependency>

示例代码

import org.xhtmlrenderer.pdf.itextrenderer;

import java.io.file;
import java.io.fileoutputstream;
import java.io.ioexception;
import java.io.outputstream;
import java.nio.file.files;
import java.nio.file.paths;
import java.util.hashmap;
import java.util.map;

public class flyingsaucertemplategenerator {

    public static void main(string[] args) {
        string templatepath = "template.html";
        string outputpath = "output.pdf";
        map<string, string> values = new hashmap<>();
        values.put("${name}", "王五");
        values.put("${age}", "35");

        try {
            generatepdffromtemplate(templatepath, outputpath, values);
            system.out.println("pdf 文档生成成功,路径为: " + outputpath);
        } catch (exception e) {
            system.err.println("生成 pdf 文档时出现错误: " + e.getmessage());
            e.printstacktrace();
        }
    }

    public static void generatepdffromtemplate(string templatepath, string outputpath, map<string, string> values) throws exception {
        // 读取 html 模板文件内容
        string htmlcontent = new string(files.readallbytes(paths.get(templatepath)));

        // 替换 html 中的占位符
        for (map.entry<string, string> entry : values.entryset()) {
            htmlcontent = htmlcontent.replace(entry.getkey(), entry.getvalue());
        }

        // 创建输出流
        try (outputstream outputstream = new fileoutputstream(new file(outputpath))) {
            // 创建 itextrenderer 对象
            itextrenderer renderer = new itextrenderer();
            // 设置 html 内容
            renderer.setdocumentfromstring(htmlcontent);
            // 布局渲染
            renderer.layout();
            // 生成 pdf
            renderer.createpdf(outputstream);
        }
    }
}

代码解释

  • ​files.readallbytes​​:读取 html 模板文件的内容。
  • ​htmlcontent.replace​​:替换 html 中的占位符。
  • ​itextrenderer.setdocumentfromstring​​:设置 html 内容。
  • ​renderer.layout​​:进行布局渲染。
  • ​renderer.createpdf​​:生成 pdf 文档。

各库的优缺点比较

库名称优点缺点
itext功能强大,支持复杂的 pdf 操作,有丰富的文档和社区支持部分高级功能需要付费许可证
apache pdfbox开源免费,易于使用,适合处理简单的 pdf 表单对于复杂的 pdf 布局处理能力相对较弱
flying saucer可以利用 html/css 的优势进行模板设计,灵活性高性能相对较低,对于复杂的 pdf 效果实现可能有一定难度

到此这篇关于java实现pdf模板动态赋值与文档生成的多种方式的文章就介绍到这了,更多相关java pdf模板动态赋值内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!