当前位置: 代码网 > it编程>编程语言>Java > Java自动读取和填写PDF中的交互式表单字段

Java自动读取和填写PDF中的交互式表单字段

2026年07月26日 Java 我要评论
pdf 表单常用于信息登记、申请表、调查问卷、合同确认和业务审批等场景。与普通 pdf 不同,表单型 pdf 中包含可交互的文本框、复选框、单选按钮、下拉列表等控件,可以通过程序自动填写。在需要批量生

pdf 表单常用于信息登记、申请表、调查问卷、合同确认和业务审批等场景。与普通 pdf 不同,表单型 pdf 中包含可交互的文本框、复选框、单选按钮、下拉列表等控件,可以通过程序自动填写。

在需要批量生成申请表、自动回填客户资料或从业务系统导出 pdf 表单时,手动逐个填写显然效率较低。通过 java 读取 pdf 表单域并写入数据,可以将这类操作集成到后台服务、桌面程序或批处理流程中。

本文将介绍如何:

  • 读取 pdf 中的表单域
  • 填写文本框
  • 选择单选按钮
  • 设置复选框状态
  • 选择列表框和下拉框选项
  • 根据字段名称填写不同内容
  • 保存填写后的 pdf 文件

本文方法适用于包含可交互表单域的 pdf 文件。如果 pdf 只是扫描图片、普通文本页面,或者表单已经被扁平化,则无法直接通过表单字段 api 进行填写。

一、安装所需的 java 库

java 标准库本身不提供 pdf 表单读取和填写功能,因此需要引入第三方 pdf 处理库。

本文示例使用 spire.pdf for java 读取 pdf 表单域,并填写不同类型的表单控件。

方式一:手动添加 jar 包

可以从以下页面下载安装包:​​下载 spire.pdf for java​

解压后,将 ​​spire.pdf.jar​​ 添加到 java 项目的构建路径中。

在 intellij idea 中,可以依次打开:

file > project structure > modules > dependencies

然后添加对应的 jar 文件。

在 eclipse 中,可以右键项目并依次选择:

build path > configure build path > libraries

然后添加 jar 文件。

方式二:通过 maven 添加依赖

如果项目使用 maven,可以在 ​​pom.xml​​ 中添加以下仓库和依赖配置:

<repositories>
    <repository>
        <id>com.e-iceblue</id>
        <name>e-iceblue</name>
        <url>https://repo.e-iceblue.cn/repository/maven-public/</url>
    </repository>
</repositories>
<dependencies>
    <dependency>
        <groupid>e-iceblue</groupid>
        <artifactid>spire.pdf</artifactid>
        <version>12.6.4</version>
    </dependency>
</dependencies>

二、常见 pdf 表单字段类型

pdf 表单中可能包含多种控件。程序需要先判断字段的具体类型,再调用对应的方法写入内容。

表单类型对应类常用设置方法
文本框​pdftextboxfieldwidget​​settext()​
单选按钮组​pdfradiobuttonlistfieldwidget​​setselectedindex()​
列表框​pdflistboxwidgetfieldwidget​​setselectedindex()​
复选框​pdfcheckboxwidgetfieldwidget​​setchecked()​
下拉框​pdfcomboboxwidgetfieldwidget​​setselectedindex()​

其中,列表框、下拉框和单选按钮通常通过选项索引进行设置。

需要注意,选项索引从 ​​0​​ 开始:

  • 索引 ​​0​​ 表示第一个选项
  • 索引 ​​1​​ 表示第二个选项
  • 索引 ​​2​​ 表示第三个选项

三、填写 pdf 中的所有表单字段

下面的示例会读取 pdf 中的所有表单字段,并根据字段类型填写内容。

实现步骤

  1. 创建 ​​pdfdocument​​ 对象。
  2. 使用 ​​loadfromfile()​​ 加载包含表单的 pdf。
  3. 通过 ​​getform()​​ 获取 pdf 表单。
  4. 获取表单字段集合。
  5. 遍历字段集合并判断字段类型。
  6. 为不同类型的控件设置对应值。
  7. 保存填写后的 pdf。
  8. 关闭文档并释放资源。

完整代码

import com.spire.pdf.fileformat;
import com.spire.pdf.pdfdocument;
import com.spire.pdf.fields.pdffield;
import com.spire.pdf.widget.pdfcheckboxwidgetfieldwidget;
import com.spire.pdf.widget.pdfcomboboxwidgetfieldwidget;
import com.spire.pdf.widget.pdfformfieldwidgetcollection;
import com.spire.pdf.widget.pdfformwidget;
import com.spire.pdf.widget.pdflistboxwidgetfieldwidget;
import com.spire.pdf.widget.pdfradiobuttonlistfieldwidget;
import com.spire.pdf.widget.pdftextboxfieldwidget;

public class fillformfields {

    public static void main(string[] args) {

        string inputpath = "forms.pdf";
        string outputpath = "fillformfields.pdf";

        // 创建 pdfdocument 对象
        pdfdocument document = new pdfdocument();

        try {
            // 加载包含表单域的 pdf 文件
            document.loadfromfile(inputpath);

            // 获取 pdf 表单
            pdfformwidget form =
                (pdfformwidget) document.getform();

            // 获取表单字段集合
            pdfformfieldwidgetcollection fields =
                form.getfieldswidget();

            // 遍历并填写所有表单字段
            for (int i = 0; i < fields.getcount(); i++) {

                pdffield field = fields.get(i);

                // 填写文本框
                if (field instanceof pdftextboxfieldwidget) {
                    pdftextboxfieldwidget textbox =
                        (pdftextboxfieldwidget) field;

                    textbox.settext("kaila smith");
                }

                // 选择单选按钮组中的第二项
                else if (
                    field instanceof pdfradiobuttonlistfieldwidget
                ) {
                    pdfradiobuttonlistfieldwidget radiobutton =
                        (pdfradiobuttonlistfieldwidget) field;

                    radiobutton.setselectedindex(1);
                }

                // 选择列表框中的第一项
                else if (
                    field instanceof pdflistboxwidgetfieldwidget
                ) {
                    pdflistboxwidgetfieldwidget listbox =
                        (pdflistboxwidgetfieldwidget) field;

                    listbox.setselectedindex(0);
                }

                // 根据字段名称勾选复选框
                else if (
                    field instanceof pdfcheckboxwidgetfieldwidget
                ) {
                    pdfcheckboxwidgetfieldwidget checkbox =
                        (pdfcheckboxwidgetfieldwidget) field;

                    switch (checkbox.getname()) {
                        case "checkbox1":
                        case "checkbox2":
                            checkbox.setchecked(true);
                            break;

                        default:
                            break;
                    }
                }

                // 选择下拉框中的第二项
                else if (
                    field instanceof pdfcomboboxwidgetfieldwidget
                ) {
                    pdfcomboboxwidgetfieldwidget combobox =
                        (pdfcomboboxwidgetfieldwidget) field;

                    combobox.setselectedindex(1);
                }
            }

            // 保存填写后的 pdf
            document.savetofile(
                outputpath,
                fileformat.pdf
            );

            system.out.println(
                "pdf 表单填写完成,输出文件:"
                + outputpath
            );
        } finally {
            // 关闭文档并释放资源
            document.close();
        }
    }
}

四、代码说明

1. 加载 pdf 表单

pdfdocument document = new pdfdocument();
document.loadfromfile("forms.pdf");

​pdfdocument​​ 用于表示和处理 pdf 文档。​​loadfromfile()​​ 方法从指定路径加载文件。

2. 获取 pdf 表单对象

pdfformwidget form =
    (pdfformwidget) document.getform();

​getform()​​ 用于获取 pdf 中的表单对象。

由于需要访问表单控件集合,因此将返回结果转换为 ​​pdfformwidget​​。

3. 获取所有表单字段

pdfformfieldwidgetcollection fields =
    form.getfieldswidget();

​getfieldswidget()​​ 返回 pdf 中所有可交互表单字段的集合。

可以通过以下方法获取字段数量:

int fieldcount = fields.getcount();

并根据索引获取指定字段:

pdffield field = fields.get(i);

4. 判断字段类型

每个字段都继承或关联于 ​​pdffield​​,但实际类型可能不同,因此需要使用 ​​instanceof​​ 判断。

例如:

if (field instanceof pdftextboxfieldwidget) {
    pdftextboxfieldwidget textbox =
        (pdftextboxfieldwidget) field;

    textbox.settext("kaila smith");
}

对于不同类型的字段,应转换为对应的 widget 类,再调用专用设置方法。

5. 保存填写后的文件

document.savetofile(
    "fillformfields.pdf",
    fileformat.pdf
);

填写完成后,将文档保存为新的 pdf 文件,避免直接覆盖源文件。

五、根据字段名称填写不同内容

前面的代码会为所有文本框填写相同的值:

textbox.settext("kaila smith");

但在实际业务中,不同文本框通常对应姓名、地址、电话、邮箱等不同信息。此时应根据字段名称写入不同内容。

示例代码

if (field instanceof pdftextboxfieldwidget) {

    pdftextboxfieldwidget textbox =
        (pdftextboxfieldwidget) field;

    string fieldname = textbox.getname();

    switch (fieldname) {
        case "name":
            textbox.settext("kaila smith");
            break;

        case "email":
            textbox.settext("kaila@example.com");
            break;

        case "phone":
            textbox.settext("13800000000");
            break;

        case "address":
            textbox.settext(
                "no. 100, example road"
            );
            break;

        default:
            break;
    }
}

这种方式比按照字段索引填写更可靠。

原因是表单设计发生变化后,字段顺序可能改变,但只要字段名称不变,程序仍然可以正确识别目标字段。

六、查看 pdf 中所有表单字段的名称和类型

在编写填写逻辑之前,通常需要先了解 pdf 中有哪些字段,以及每个字段的名称和类型。

可以使用以下代码打印表单字段信息:

pdfformwidget form =
    (pdfformwidget) document.getform();

pdfformfieldwidgetcollection fields =
    form.getfieldswidget();

for (int i = 0; i < fields.getcount(); i++) {

    pdffield field = fields.get(i);

    system.out.println(
        "字段索引:" + i
    );

    system.out.println(
        "字段名称:" + field.getname()
    );

    system.out.println(
        "字段类型:"
        + field.getclass().getsimplename()
    );

    system.out.println("--------------------");
}

输出结果可能类似:

字段索引:0
字段名称:name
字段类型:pdftextboxfieldwidget
--------------------
字段索引:1
字段名称:gender
字段类型:pdfradiobuttonlistfieldwidget
--------------------
字段索引:2
字段名称:checkbox1
字段类型:pdfcheckboxwidgetfieldwidget
--------------------

根据这些信息,可以更准确地编写字段填写规则。

七、分别填写不同类型的 pdf 表单字段

填写文本框

pdftextboxfieldwidget textbox =
    (pdftextboxfieldwidget) field;

textbox.settext("kaila smith");

文本框通常用于填写:

  • 姓名
  • 地址
  • 电话
  • 邮箱
  • 备注
  • 申请说明

选择单选按钮

pdfradiobuttonlistfieldwidget radiobutton =
    (pdfradiobuttonlistfieldwidget) field;

radiobutton.setselectedindex(1);

单选按钮组只能选择其中一个选项。

如果索引为 ​​1​​,表示选择第二个选项。

设置复选框状态

pdfcheckboxwidgetfieldwidget checkbox =
    (pdfcheckboxwidgetfieldwidget) field;

checkbox.setchecked(true);

取消勾选时,将参数设置为 ​​false​​:

checkbox.setchecked(false);

选择列表框项目

pdflistboxwidgetfieldwidget listbox =
    (pdflistboxwidgetfieldwidget) field;

listbox.setselectedindex(0);

索引 ​​0​​ 表示选择列表中的第一项。

选择下拉框项目

pdfcomboboxwidgetfieldwidget combobox =
    (pdfcomboboxwidgetfieldwidget) field;

combobox.setselectedindex(1);

索引 ​​1​​ 表示选择下拉列表中的第二项。

八、实际使用建议

1. 先确认 pdf 是否包含表单域

并非所有看起来像“表格”或“申请表”的 pdf 都包含可交互表单。

以下文件通常不能直接通过表单字段 api 填写:

  • 扫描生成的 pdf
  • 由图片组成的申请表
  • 普通文本和线条绘制的表格
  • 已经扁平化的 pdf 表单

可以先检查表单字段数量:

pdfformwidget form =
    (pdfformwidget) document.getform();

pdfformfieldwidgetcollection fields =
    form.getfieldswidget();

if (fields.getcount() == 0) {
    system.out.println(
        "当前 pdf 中未检测到可填写的表单域。"
    );
}

2. 不要假设字段索引固定

以下写法依赖字段顺序:

pdffield field = fields.get(0);

如果表单经过修改,字段顺序可能发生变化。

对于业务系统,建议优先通过字段名称匹配:

if ("email".equals(field.getname())) {
    // 填写邮箱
}

3. 检查选项索引范围

单选按钮、列表框和下拉框均通过索引选择项目。如果索引超出实际选项数量,可能导致异常或无法正确选择。

使用前应确认:

  • 表单中有多少个选项
  • 目标选项对应哪个索引
  • 索引是否从 ​​0​​ 开始

4. 将结果保存为新文件

建议不要覆盖原始模板:

document.savetofile(
    "forms_filled.pdf",
    fileformat.pdf
);

这样可以保留未填写的原始表单,便于重复使用。

5. 及时释放资源

无论填写是否成功,都应关闭 ​​pdfdocument​​:

pdfdocument document =
    new pdfdocument();

try {
    document.loadfromfile("forms.pdf");

    // 填写和保存操作
} finally {
    document.close();
}

对于批量处理任务,这一点尤其重要。

九、常见问题

为什么程序没有找到任何表单字段?

可能原因包括:

  • pdf 只是扫描图片
  • 页面中的输入框只是绘制出来的矩形
  • 表单已被扁平化
  • 文件使用了特殊表单结构
  • pdf 中并不存在交互式表单域

可以先打印 ​​fields.getcount()​​,确认表单字段数量。

为什么所有文本框都被填写成相同内容?

因为示例代码对每个 ​​pdftextboxfieldwidget​​ 都执行了相同的:

textbox.settext("kaila smith");

实际项目中应根据字段名称分别设置内容。

如何只填写某一个字段?

通过字段名称判断:

if (
    field instanceof pdftextboxfieldwidget
    && "name".equals(field.getname())
) {
    pdftextboxfieldwidget textbox =
        (pdftextboxfieldwidget) field;

    textbox.settext("kaila smith");
}

为什么下拉框选择的内容不正确?

​setselectedindex()​​ 使用从 ​​0​​ 开始的索引。

例如:

combobox.setselectedindex(0);

表示选择第一项,而不是第二项。

如何取消复选框勾选?

将 ​​setchecked()​​ 参数设置为 ​​false​​:

checkbox.setchecked(false);

是否可以批量填写多个 pdf 表单?

可以。可以遍历文件夹中的 pdf 文件,为每个文件创建独立的 ​​pdfdocument​​ 对象,填写后分别保存。

批量处理时应注意:

  • 每次处理后关闭文档
  • 为输出文件生成唯一名称
  • 记录处理失败的文件
  • 不要直接覆盖原始模板

总结

通过 java 可以自动读取和填写 pdf 中的交互式表单字段。

在实际项目中,建议先输出字段名称和类型,再根据字段名称分别填写内容。相比依赖字段索引,这种方式在表单模板发生调整后更加稳定。

同时需要确认源 pdf 确实包含可交互表单域。对于扫描件、普通页面或已扁平化表单,需要使用其他方式识别和写入内容。

以上就是java自动读取和填写pdf中的交互式表单字段的详细内容,更多关于java自动填充pdf表单的资料请关注代码网其它相关文章!

(0)

相关文章:

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

发表评论

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