最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java自動讀取和填寫PDF中的交互式表單字段

 更新時間:2026年07月26日 08:21:50   作者:用戶372157426135  
本文詳細講解如何使用Java讀取和填寫PDF中的交互式表單,包括文本框、復(fù)選框、單選按鈕、列表框和下拉框等控件,通過引入Spire.PDF for Java庫,您可以輕松實現(xiàn)批量表單填充、業(yè)務(wù)數(shù)據(jù)回填等場景,并了解如何根據(jù)字段名稱穩(wěn)定填寫內(nèi)容

PDF 表單常用于信息登記、申請表、調(diào)查問卷、合同確認和業(yè)務(wù)審批等場景。與普通 PDF 不同,表單型 PDF 中包含可交互的文本框、復(fù)選框、單選按鈕、下拉列表等控件,可以通過程序自動填寫。

在需要批量生成申請表、自動回填客戶資料或從業(yè)務(wù)系統(tǒng)導(dǎo)出 PDF 表單時,手動逐個填寫顯然效率較低。通過 Java 讀取 PDF 表單域并寫入數(shù)據(jù),可以將這類操作集成到后臺服務(wù)、桌面程序或批處理流程中。

本文將介紹如何:

  • 讀取 PDF 中的表單域
  • 填寫文本框
  • 選擇單選按鈕
  • 設(shè)置復(fù)選框狀態(tài)
  • 選擇列表框和下拉框選項
  • 根據(jù)字段名稱填寫不同內(nèi)容
  • 保存填寫后的 PDF 文件

本文方法適用于包含可交互表單域的 PDF 文件。如果 PDF 只是掃描圖片、普通文本頁面,或者表單已經(jīng)被扁平化,則無法直接通過表單字段 API 進行填寫。

一、安裝所需的 Java 庫

Java 標準庫本身不提供 PDF 表單讀取和填寫功能,因此需要引入第三方 PDF 處理庫。

本文示例使用 Spire.PDF for Java 讀取 PDF 表單域,并填寫不同類型的表單控件。

方式一:手動添加 JAR 包

可以從以下頁面下載安裝包:??下載 Spire.PDF for Java??

解壓后,將 ??Spire.Pdf.jar?? 添加到 Java 項目的構(gòu)建路徑中。

在 IntelliJ IDEA 中,可以依次打開:

File > Project Structure > Modules > Dependencies

然后添加對應(yīng)的 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 表單中可能包含多種控件。程序需要先判斷字段的具體類型,再調(diào)用對應(yīng)的方法寫入內(nèi)容。

表單類型對應(yīng)類常用設(shè)置方法
文本框??PdfTextBoxFieldWidget????setText()??
單選按鈕組??PdfRadioButtonListFieldWidget????setSelectedIndex()??
列表框??PdfListBoxWidgetFieldWidget????setSelectedIndex()??
復(fù)選框??PdfCheckBoxWidgetFieldWidget????setChecked()??
下拉框??PdfComboBoxWidgetFieldWidget????setSelectedIndex()??

其中,列表框、下拉框和單選按鈕通常通過選項索引進行設(shè)置。

需要注意,選項索引從 ??0?? 開始:

  • 索引 ??0?? 表示第一個選項
  • 索引 ??1?? 表示第二個選項
  • 索引 ??2?? 表示第三個選項

三、填寫 PDF 中的所有表單字段

下面的示例會讀取 PDF 中的所有表單字段,并根據(jù)字段類型填寫內(nèi)容。

實現(xiàn)步驟

  1. 創(chuàng)建 ??PdfDocument?? 對象。
  2. 使用 ??loadFromFile()?? 加載包含表單的 PDF。
  3. 通過 ??getForm()?? 獲取 PDF 表單。
  4. 獲取表單字段集合。
  5. 遍歷字段集合并判斷字段類型。
  6. 為不同類型的控件設(shè)置對應(yīng)值。
  7. 保存填寫后的 PDF。
  8. 關(guān)閉文檔并釋放資源。

完整代碼

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";

        // 創(chuàng)建 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);
                }

                // 根據(jù)字段名稱勾選復(fù)選框
                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 {
            // 關(guān)閉文檔并釋放資源
            document.close();
        }
    }
}

四、代碼說明

1. 加載 PDF 表單

PdfDocument document = new PdfDocument();
document.loadFromFile("Forms.pdf");

??PdfDocument?? 用于表示和處理 PDF 文檔。??loadFromFile()?? 方法從指定路徑加載文件。

2. 獲取 PDF 表單對象

PdfFormWidget form =
    (PdfFormWidget) document.getForm();

??getForm()?? 用于獲取 PDF 中的表單對象。

由于需要訪問表單控件集合,因此將返回結(jié)果轉(zhuǎn)換為 ??PdfFormWidget??。

3. 獲取所有表單字段

PdfFormFieldWidgetCollection fields =
    form.getFieldsWidget();

??getFieldsWidget()?? 返回 PDF 中所有可交互表單字段的集合。

可以通過以下方法獲取字段數(shù)量:

int fieldCount = fields.getCount();

并根據(jù)索引獲取指定字段:

PdfField field = fields.get(i);

4. 判斷字段類型

每個字段都繼承或關(guān)聯(lián)于 ??PdfField??,但實際類型可能不同,因此需要使用 ??instanceof?? 判斷。

例如:

if (field instanceof PdfTextBoxFieldWidget) {
    PdfTextBoxFieldWidget textBox =
        (PdfTextBoxFieldWidget) field;

    textBox.setText("Kaila Smith");
}

對于不同類型的字段,應(yīng)轉(zhuǎn)換為對應(yīng)的 Widget 類,再調(diào)用專用設(shè)置方法。

5. 保存填寫后的文件

document.saveToFile(
    "FillFormFields.pdf",
    FileFormat.PDF
);

填寫完成后,將文檔保存為新的 PDF 文件,避免直接覆蓋源文件。

五、根據(jù)字段名稱填寫不同內(nèi)容

前面的代碼會為所有文本框填寫相同的值:

textBox.setText("Kaila Smith");

但在實際業(yè)務(wù)中,不同文本框通常對應(yīng)姓名、地址、電話、郵箱等不同信息。此時應(yīng)根據(jù)字段名稱寫入不同內(nèi)容。

示例代碼

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;
    }
}

這種方式比按照字段索引填寫更可靠。

原因是表單設(shè)計發(fā)生變化后,字段順序可能改變,但只要字段名稱不變,程序仍然可以正確識別目標字段。

六、查看 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("--------------------");
}

輸出結(jié)果可能類似:

字段索引:0
字段名稱:name
字段類型:PdfTextBoxFieldWidget
--------------------
字段索引:1
字段名稱:gender
字段類型:PdfRadioButtonListFieldWidget
--------------------
字段索引:2
字段名稱:checkbox1
字段類型:PdfCheckBoxWidgetFieldWidget
--------------------

根據(jù)這些信息,可以更準確地編寫字段填寫規(guī)則。

七、分別填寫不同類型的 PDF 表單字段

填寫文本框

PdfTextBoxFieldWidget textBox =
    (PdfTextBoxFieldWidget) field;

textBox.setText("Kaila Smith");

文本框通常用于填寫:

  • 姓名
  • 地址
  • 電話
  • 郵箱
  • 備注
  • 申請說明

選擇單選按鈕

PdfRadioButtonListFieldWidget radioButton =
    (PdfRadioButtonListFieldWidget) field;

radioButton.setSelectedIndex(1);

單選按鈕組只能選擇其中一個選項。

如果索引為 ??1??,表示選擇第二個選項。

設(shè)置復(fù)選框狀態(tài)

PdfCheckBoxWidgetFieldWidget checkBox =
    (PdfCheckBoxWidgetFieldWidget) field;

checkBox.setChecked(true);

取消勾選時,將參數(shù)設(shè)置為 ??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
  • 由圖片組成的申請表
  • 普通文本和線條繪制的表格
  • 已經(jīng)扁平化的 PDF 表單

可以先檢查表單字段數(shù)量:

PdfFormWidget form =
    (PdfFormWidget) document.getForm();

PdfFormFieldWidgetCollection fields =
    form.getFieldsWidget();

if (fields.getCount() == 0) {
    System.out.println(
        "當前 PDF 中未檢測到可填寫的表單域。"
    );
}

2. 不要假設(shè)字段索引固定

以下寫法依賴字段順序:

PdfField field = fields.get(0);

如果表單經(jīng)過修改,字段順序可能發(fā)生變化。

對于業(yè)務(wù)系統(tǒng),建議優(yōu)先通過字段名稱匹配:

if ("email".equals(field.getName())) {
    // 填寫郵箱
}

3. 檢查選項索引范圍

單選按鈕、列表框和下拉框均通過索引選擇項目。如果索引超出實際選項數(shù)量,可能導(dǎo)致異常或無法正確選擇。

使用前應(yīng)確認:

  • 表單中有多少個選項
  • 目標選項對應(yīng)哪個索引
  • 索引是否從 ??0?? 開始

4. 將結(jié)果保存為新文件

建議不要覆蓋原始模板:

document.saveToFile(
    "Forms_Filled.pdf",
    FileFormat.PDF
);

這樣可以保留未填寫的原始表單,便于重復(fù)使用。

5. 及時釋放資源

無論填寫是否成功,都應(yīng)關(guān)閉 ??PdfDocument??:

PdfDocument document =
    new PdfDocument();

try {
    document.loadFromFile("Forms.pdf");

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

對于批量處理任務(wù),這一點尤其重要。

九、常見問題

為什么程序沒有找到任何表單字段?

可能原因包括:

  • PDF 只是掃描圖片
  • 頁面中的輸入框只是繪制出來的矩形
  • 表單已被扁平化
  • 文件使用了特殊表單結(jié)構(gòu)
  • PDF 中并不存在交互式表單域

可以先打印 ??fields.getCount()??,確認表單字段數(shù)量。

為什么所有文本框都被填寫成相同內(nèi)容?

因為示例代碼對每個 ??PdfTextBoxFieldWidget?? 都執(zhí)行了相同的:

textBox.setText("Kaila Smith");

實際項目中應(yīng)根據(jù)字段名稱分別設(shè)置內(nèi)容。

如何只填寫某一個字段?

通過字段名稱判斷:

if (
    field instanceof PdfTextBoxFieldWidget
    && "name".equals(field.getName())
) {
    PdfTextBoxFieldWidget textBox =
        (PdfTextBoxFieldWidget) field;

    textBox.setText("Kaila Smith");
}

為什么下拉框選擇的內(nèi)容不正確?

??setSelectedIndex()?? 使用從 ??0?? 開始的索引。

例如:

comboBox.setSelectedIndex(0);

表示選擇第一項,而不是第二項。

如何取消復(fù)選框勾選?

將 ??setChecked()?? 參數(shù)設(shè)置為 ??false??:

checkBox.setChecked(false);

是否可以批量填寫多個 PDF 表單?

可以??梢员闅v文件夾中的 PDF 文件,為每個文件創(chuàng)建獨立的 ??PdfDocument?? 對象,填寫后分別保存。

批量處理時應(yīng)注意:

  • 每次處理后關(guān)閉文檔
  • 為輸出文件生成唯一名稱
  • 記錄處理失敗的文件
  • 不要直接覆蓋原始模板

總結(jié)

通過 Java 可以自動讀取和填寫 PDF 中的交互式表單字段。

在實際項目中,建議先輸出字段名稱和類型,再根據(jù)字段名稱分別填寫內(nèi)容。相比依賴字段索引,這種方式在表單模板發(fā)生調(diào)整后更加穩(wěn)定。

同時需要確認源 PDF 確實包含可交互表單域。對于掃描件、普通頁面或已扁平化表單,需要使用其他方式識別和寫入內(nèi)容。

以上就是Java自動讀取和填寫PDF中的交互式表單字段的詳細內(nèi)容,更多關(guān)于Java自動填充PDF表單的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • SpringBoot自動配置實現(xiàn)的詳細步驟

    SpringBoot自動配置實現(xiàn)的詳細步驟

    這篇文章主要為大家介紹了SpringBoot自動配置實現(xiàn)詳細的過程步驟,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-05-05
  • SpringBoot實現(xiàn)Word和PDF互相轉(zhuǎn)換的操作詳解

    SpringBoot實現(xiàn)Word和PDF互相轉(zhuǎn)換的操作詳解

    這篇文章主要為大家詳細介紹了SpringBoot實現(xiàn)Word和PDF互相轉(zhuǎn)換操作的相關(guān)知識,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2025-12-12
  • Java中的SpringAOP、代理模式、常用AspectJ注解詳解

    Java中的SpringAOP、代理模式、常用AspectJ注解詳解

    這篇文章主要介紹了Java中的SpringAOP、代理模式、常用AspectJ注解詳解,Spring提供了面向切面編程的豐富支持,允許通過分離應(yīng)用的業(yè)務(wù)邏輯與系統(tǒng)級服務(wù),例如審計和事務(wù)管理進行內(nèi)聚性的開發(fā),需要的朋友可以參考下
    2023-09-09
  • 詳解Mybatis的分頁插件

    詳解Mybatis的分頁插件

    這篇文章主要介紹了詳解Mybatis的分頁插件,在 Mybatis中,如何對數(shù)據(jù)進行分頁是一個非常常見的問題,現(xiàn)在,我們可以通過使用 Mybatis 的分頁插件來實現(xiàn)對數(shù)據(jù)的分頁,需要的朋友可以參考下
    2023-05-05
  • JavaWeb學(xué)習(xí)筆記分享(必看篇)

    JavaWeb學(xué)習(xí)筆記分享(必看篇)

    下面小編就為大家?guī)硪黄狫avaWeb學(xué)習(xí)筆記分享(必看篇)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-06-06
  • SpringBoot中Zookeeper分布式鎖的原理和用法詳解

    SpringBoot中Zookeeper分布式鎖的原理和用法詳解

    Zookeeper是一個分布式協(xié)調(diào)服務(wù),它提供了高可用、高性能、可擴展的分布式鎖機制,SpringBoot是一個基于Spring框架的開發(fā)框架,它提供了對Zookeeper分布式鎖的集成支持,本文將介紹SpringBoot中的 Zookeeper分布式鎖的原理和使用方法,需要的朋友可以參考下
    2023-07-07
  • Springboot-admin整合Quartz實現(xiàn)動態(tài)管理定時任務(wù)的過程詳解

    Springboot-admin整合Quartz實現(xiàn)動態(tài)管理定時任務(wù)的過程詳解

    Quartz是一款Java編寫的開源任務(wù)調(diào)度框架,同時它也是Spring默認的任務(wù)調(diào)度框架,它的作用其實類似于Timer定時器以及ScheduledExecutorService調(diào)度線程池,這篇文章主要介紹了Springboot-admin整合Quartz實現(xiàn)動態(tài)管理定時任務(wù),需要的朋友可以參考下
    2023-04-04
  • Maven中plugins與pluginManagement的區(qū)別說明

    Maven中plugins與pluginManagement的區(qū)別說明

    這篇文章主要介紹了Maven中plugins與pluginManagement的區(qū)別說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • MyBatis官方代碼生成工具給力(解放雙手)

    MyBatis官方代碼生成工具給力(解放雙手)

    這篇文章主要介紹了MyBatis官方代碼生成工具給力(解放雙手),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • MyBatis不用@Param傳遞多個參數(shù)的操作

    MyBatis不用@Param傳遞多個參數(shù)的操作

    這篇文章主要介紹了MyBatis不用@Param傳遞多個參數(shù)的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-02-02

最新評論

伽师县| 涿鹿县| 云梦县| 汉源县| 中宁县| 阳高县| 大宁县| 抚顺县| 普陀区| 峨眉山市| 彰化市| 湖州市| 任丘市| 闽侯县| 石嘴山市| 仙居县| 永清县| 洪湖市| 永清县| 防城港市| 嘉兴市| 南木林县| 仁布县| 高碑店市| 淳安县| 武冈市| 康保县| 怀柔区| 囊谦县| 绍兴市| 东光县| 通江县| 温宿县| 原平市| 雷山县| 新平| 视频| 紫阳县| 灵宝市| 金塔县| 乐亭县|