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

 更新时间:2025年07月10日 10:38:57   作者:自由的疯  
除了 iText 库,在 Java 中还有其他一些库可以用于处理 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模板动态赋值内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java实现按照大小写字母顺序排序的方法

    Java实现按照大小写字母顺序排序的方法

    这篇文章主要介绍了Java实现按照大小写字母顺序排序的方法,涉及java数组遍历、编码转换、判断等相关操作技巧,需要的朋友可以参考下
    2017-12-12
  • SpringBoot整合Web开发之Json数据返回的实现

    SpringBoot整合Web开发之Json数据返回的实现

    这篇文章主要介绍了SpringBoot整合Web开发其中Json数据返回的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-08-08
  • Java中的函数式编程

    Java中的函数式编程

    这篇文章介绍Java中的函数式编程,函数式编程是一种编程范式,其中程序是通过应用和组合函数来构造的。它是一种声明式编程范式,其中函数定义是表达式树,每个表达式树返回一个值,而不是一系列改变程序状态的命令语句,具体情况请看下文,希望对你有所帮助
    2021-10-10
  • springboot集成redis之字典缓存详解

    springboot集成redis之字典缓存详解

    Redis的字典缓存是支撑其高性能的一个关键因素,它使得Redis能够以极快的速度处理大量的数据,这篇文章主要介绍了springboot集成redis之字典缓存,需要的朋友可以参考下
    2024-07-07
  • java实现将域名解析成ip示例

    java实现将域名解析成ip示例

    这篇文章主要介绍了java实现将域名解析成ip示例,需要的朋友可以参考下
    2014-04-04
  • SpringBoot整合Logback日志框架及高并发下的性能优化

    SpringBoot整合Logback日志框架及高并发下的性能优化

    在现代的Java应用开发中,日志记录是不可或缺的一部分,Spring Boot作为目前最流行的Java开发框架之一,默认集成了Logback作为日志框架,Logback是Log4j的继任者,具有更高的性能和更丰富的功能,本文将详细介绍如何在Spring Boot中整合Logback日志框架
    2025-03-03
  • java实现入栈push和出栈pop过程

    java实现入栈push和出栈pop过程

    文章详细介绍了栈的概念、特点以及如何使用数组和链表实现栈,通过入栈(push)和出栈(pop)操作,展示了栈的数据处理过程,并提供了具体的代码实现
    2024-12-12
  • java排序算法图文详解

    java排序算法图文详解

    这篇文章主要为大家详细介绍了Java经典排序算法之归并排序,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望可以对你有所帮助
    2021-07-07
  • Java类的访问权限关键字用法说明

    Java类的访问权限关键字用法说明

    这篇文章主要介绍了Java类的访问权限关键字用法说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-09-09
  • Java实现各种文件类型转换方式(收藏)

    Java实现各种文件类型转换方式(收藏)

    这篇文章主要介绍了Java 各种文件类型转换的方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-03-03

最新评论