当前位置: 代码网 > it编程>编程语言>C# > C#提取PDF表单数据的实现流程

C#提取PDF表单数据的实现流程

2025年02月13日 C# 我要评论
引言pdf表单是一种常见的数据收集工具,广泛应用于调查问卷、业务合同等场景。凭借出色的跨平台兼容性和标准化特点,pdf表单在各行各业中得到了广泛应用。然而,当需要整合、分析或导入大量已填写的表单数据时

引言

pdf表单是一种常见的数据收集工具,广泛应用于调查问卷、业务合同等场景。凭借出色的跨平台兼容性和标准化特点,pdf表单在各行各业中得到了广泛应用。然而,当需要整合、分析或导入大量已填写的表单数据时,传统的手动处理方式不仅耗时,而且容易出错。因此,掌握自动提取pdf表单数据的方法,不仅能大幅提高工作效率,还能确保数据处理的准确性。本文将探讨如何使用c# 实现自动化pdf表单数据提取流程。

  • 使用工具
  • c# 提取多个pdf表单域的数据
  • c# 提取特定pdf表单域的数据

使用工具

要使用c# 提取pdf表单的数据,需要用到合适的pdf文档处理库。本文所使用的是spire.pdf for .net库。该库主要用于在 .net 应用程序中创建、读取、编辑、转换 和打印pdf 文档。

安装 spire.pdf for .net

你可以在 nuget 包管理器中运行以下命令安装 spire.pdf for .net:

pm> install-package spire.pdf

如果你已经安装了该库并希望升级到最新版本,可以使用以下命令:

pm> update-package spire.pdf

c# 提取多个pdf表单域的数据

pdf 表单可能包含多种类型的域,例如文本框、列表框、下拉框、单选按钮和复选框。每种域类型需要采用不同的方法来提取其数据。以下是提取这些类型的域的数据时所使用的关键属性:

  • 文本框(text boxes
    通过 pdftextboxfieldwidget 对象的 name 和 text 属性,获取文本框的名称及其对应的值。
  • 列表框(list boxes
    通过 pdflistboxfieldwidget 对象的 name、values 和 selectedvalue 属性,提取列表框的名称、所有选项及选定的选项。
  • 下拉框(combo boxes
    通过 pdfcomboboxfieldwidget 对象的 name、values 和 selectedvalue 属性,获取下拉框的名称、所有选项及选定的选项。
  • 单选按钮(radio buttons
    通过 pdfradiobuttonlistfieldwidget 对象的 name 和 selectedvalue 属性,获取单选按钮的名称和选定的值。
  • 复选框(checkboxes
    通过 pdfcheckboxfieldwidget 对象的 name 和 checked 属性,提取复选框的名称及其状态(是否被选中)。

以下代码展示了如何使用 c# 从多个 pdf 表单域中提取数据:

using spire.pdf;
using spire.pdf.fields;
using spire.pdf.widget;
using system.collections.generic;
using system.io;
 
namespace extractpdfformdata
{
    internal class program
    {
        static void main(string[] args)
        {
            // 初始化 pdfdocument 类实例,用于加载和处理 pdf 文件
            using (pdfdocument doc = new pdfdocument())
            {
                // 加载包含表单域的 pdf 文件
                doc.loadfromfile("表单.pdf");
 
                // 创建列表存储提取的域名称及其值
                list<string> content = new list<string>();
 
                // 获取 pdf 文档的表单对象
                pdfformwidget formwidget = doc.form as pdfformwidget;
 
                // 检查表单对象中是否包含表单域
                if (formwidget?.fieldswidget.count > 0)
                {
                    // 遍历文档中的所有表单域
                    for (int i = 0; i < formwidget.fieldswidget.list.count; i++)
                    {
                        // 获取当前表单域
                        pdffield field = formwidget.fieldswidget[i];
 
                        // 如果当前表单域为空,跳过该域
                        if (field == null) continue;
 
                        // 提取当前表单域的内容(名称和值)
                        list<string> currentfieldcontent = extractfieldcontent(field);
 
                        // 如果提取到域内容,则将其添加到 content 列表中
                        if (currentfieldcontent.count > 0)
                        {
                            content.addrange(currentfieldcontent);
 
                            // 如果不是最后一个表单域,添加一个空行用于分隔不同域的内容
                            if (i < formwidget.fieldswidget.list.count - 1)
                            {
                                content.add(""); // 添加空行分隔不同域的内容
                            }
                        }
                    }
                }
 
                // 将提取的内容逐行写入文本文件
                file.writealllines("提取域数据.txt", content);
            }
        }
 
        /// <summary>
        /// 提取单个 pdf 表单域的内容(域名和域值)
        /// 根据不同的表单域类型(文本框、列表框、下拉框、单选按钮、复选框)提取相应的值
        /// </summary>
        /// <param name="field">当前的 pdf 表单域对象</param>
        /// <returns>包含域内容的字符串列表</returns>
        private static list<string> extractfieldcontent(pdffield field)
        {
            // 初始化列表来存储当前表单域的内容
            list<string> fieldcontent = new list<string>();
 
            // 检查该域是否为文本框
            if (field is pdftextboxfieldwidget textboxfield)
            {
                fieldcontent.add($"文本框名称:{textboxfield.name}");
                fieldcontent.add($"文本框值:{textboxfield.text}");
            }
            // 检查该域是否为列表框
            else if (field is pdflistboxwidgetfieldwidget listboxfield)
            {
                fieldcontent.add($"列表框名称:{listboxfield.name}");
                fieldcontent.add("列表框选项:");
                // 遍历并提取列表框中的所有选项
                foreach (pdflistwidgetitem item in listboxfield.values)
                {
                    fieldcontent.add($"{item.value}");
                }
                fieldcontent.add($"列表框选中项:{listboxfield.selectedvalue}");
            }
            // 检查该域是否为下拉框
            else if (field is pdfcomboboxwidgetfieldwidget comboboxfield)
            {
                fieldcontent.add($"下拉框名称:{comboboxfield.name}");
                fieldcontent.add("下拉框选项:");
                // 遍历并提取下拉框中的所有选项
                foreach (pdflistwidgetitem item in comboboxfield.values)
                {
                    fieldcontent.add($"{item.value}");
                }
                fieldcontent.add($"下拉框选中项:{comboboxfield.selectedvalue}");
            }
            // 检查该域是否为单选按钮
            else if (field is pdfradiobuttonlistfieldwidget radiobtnfield)
            {
                fieldcontent.add($"单选按钮名称:{radiobtnfield.name}");
                fieldcontent.add($"单选按钮选中项:{radiobtnfield.selectedvalue}");
            }
            // 检查该域是否为复选框
            else if (field is pdfcheckboxwidgetfieldwidget checkboxfield)
            {
                fieldcontent.add($"复选框名称:{checkboxfield.name}");
                fieldcontent.add($"复选框状态:{(checkboxfield.checked ? "选中" : "未选中")}");
            }
 
            // 返回当前表单域的内容
            return fieldcontent;
        }
    }
}

c# 提取特定pdf表单域的数据

如果你需要从特定的表单域中提取数据,可以通过该表单域的名称直接访问它,然后通过判断其类型对应地获取其内容。

以下代码展示了如何使用c# 从名为 “国家” 的pdf表单域中提取数据:

using spire.pdf;
using spire.pdf.fields;
using spire.pdf.widget;
using system.collections.generic;
using system.io;
 
namespace extractspecificformdata
{
    internal class program
    {
        static void main(string[] args)
        {
            // 初始化 pdfdocument 类实例,用于加载和处理 pdf 文件
            using (pdfdocument doc = new pdfdocument())
            {
                // 加载包含表单域的 pdf 文件
                doc.loadfromfile("表单.pdf");
 
                // 创建列表来存储提取的表单域名称及其值
                list<string> content = new list<string>();
 
                // 获取 pdf 文档的表单对象
                pdfformwidget formwidget = doc.form as pdfformwidget;
 
                // 指定域名称
                string fieldname = "国家";
 
                // 检查表单对象中是否包含表单域
                if (formwidget?.fieldswidget.count > 0)
                {
                    // 通过名称访问特定表单域
                    pdffield specificfield = formwidget.fieldswidget[fieldname];
 
                    // 确保域存在再进行处理
                    if (specificfield != null)
                    {
                        // 提取特定表单域的内容(名称和值)
                        list<string> specificfieldcontent = extractfieldcontent(specificfield);
 
                        // 如果提取到内容,则将其添加到 content 列表中
                        if (specificfieldcontent.count > 0)
                        {
                            content.addrange(specificfieldcontent);
                        }
                    }
                    else
                    {
                        content.add($"未找到域 '{fieldname}'");
                    }
                }
                else
                {
                    content.add("pdf 表单中未找到任何域");
                }
 
                // 将提取的内容逐行写入文本文件
                file.writealllines("提取特定域数据.txt", content);
            }
        }
 
        /// <summary>
        /// 提取单个 pdf 表单域的内容(名称和值)
        /// 处理不同类型的表单域,如文本框、列表框、下拉框、单选按钮和复选框
        /// </summary>
        /// <param name="field">当前 pdf 表单域对象</param>
        /// <returns>包含表单域内容的字符串列表</returns>
        private static list<string> extractfieldcontent(pdffield field)
        {
            // 初始化列表来存储当前表单域的内容
            list<string> fieldcontent = new list<string>();
 
            // 检查该域是否为文本框
            if (field is pdftextboxfieldwidget textboxfield)
            {
                // 将文本框的名称和值添加到列表中
                fieldcontent.add($"文本框名称:{textboxfield.name}");
                fieldcontent.add($"文本框值:{textboxfield.text}");
            }
            // 检查该域是否为列表框
            else if (field is pdflistboxwidgetfieldwidget listboxfield)
            {
                fieldcontent.add($"列表框名称:{listboxfield.name}");
                fieldcontent.add("列表框选项:");
                foreach (pdflistwidgetitem item in listboxfield.values)
                {
                    fieldcontent.add($"{item.value}");
                }
                fieldcontent.add($"列表框选中项:{listboxfield.selectedvalue}");
            }
            // 检查该域是否为下拉框
            else if (field is pdfcomboboxwidgetfieldwidget comboboxfield)
            {
                fieldcontent.add($"下拉框名称:{comboboxfield.name}");
                fieldcontent.add("下拉框选项:");
                foreach (pdflistwidgetitem item in comboboxfield.values)
                {
                    fieldcontent.add($"{item.value}");
                }
                fieldcontent.add($"下拉框选中项:{comboboxfield.selectedvalue}");
            }
            // 检查该域是否为单选按钮
            else if (field is pdfradiobuttonlistfieldwidget radiobtnfield)
            {
                fieldcontent.add($"单选按钮名称:{radiobtnfield.name}");
                fieldcontent.add($"单选按钮选中项:{radiobtnfield.selectedvalue}");
            }
            // 检查该域是否为复选框
            else if (field is pdfcheckboxwidgetfieldwidget checkboxfield)
            {
                fieldcontent.add($"复选框名称:{checkboxfield.name}");
                fieldcontent.add($"复选框状态:{(checkboxfield.checked ? "选中" : "未选中")}");
            }
 
            // 返回当前表单域的内容列表
            return fieldcontent;
        }
    }
}

以上就是使用c# 读取pdf表单域数据的全部内容。

到此这篇关于c#提取pdf表单数据的实现流程的文章就介绍到这了,更多相关c#提取pdf表单数据内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

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

发表评论

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