当前位置: 首页 > news >正文

C# 提取PDF表单数据

目录

使用工具

C# 提取多个PDF表单域的数据

C# 提取特定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表单域的数据 C# 提取特定PDF表单域的数据 PDF表单是一种常见的数据收集工具&#xff0c;广泛应用于调查问卷、业务合同等场景。凭借出色的跨平台兼容性和标准化特点&#xff0c;PDF表单在各行各业中得到了广泛应用。然而&#xff0c;当需要整合…...

算法刷题Day28:BM66 最长公共子串

题目链接&#xff0c;点击跳转 题目描述&#xff1a; 解题思路&#xff1a; 方法一&#xff1a;暴力枚举 遍历str1的每个字符x&#xff0c;并在str2中寻找以相同元素x为起始的最长字符串。记录最长的公共子串及其长度。 代码实现&#xff1a; def LCS(self, str1: str, st…...

论文阅读笔记:MambaOut: Do We Really Need Mamba for Vision?

论文阅读笔记&#xff1a;MambaOut: Do We Really Need Mamba for Vision? 1 背景2 创新点3 方法4 模块4.1 Mamba适合什么任务4.2 视觉识别任务是否有很长的序列4.3 视觉任务是否需要因果token混合模式4.4 关于Mamba对于视觉的必要性假设 5 效果 论文&#xff1a;https://arxi…...

HarmonyOS:ForEach:循环渲染

一、前言 ForEach接口基于数组类型数据来进行循环渲染&#xff0c;需要与容器组件配合使用&#xff0c;且接口返回的组件应当是允许包含在ForEach父容器组件中的子组件。例如&#xff0c;ListItem组件要求ForEach的父容器组件必须为List组件。 API参数说明见&#xff1a;ForEa…...

Python3 【函数】项目实战:5 个新颖的学习案例

Python3 【函数】项目实战&#xff1a;5 个新颖的学习案例 本文包含5编程学习案例&#xff0c;具体项目如下&#xff1a; 简易聊天机器人待办事项提醒器密码生成器简易文本分析工具简易文件加密解密工具 项目 1&#xff1a;简易聊天机器人 功能描述&#xff1a; 实现一个简易…...

XSS 漏洞全面解析:原理、危害与防范

目录 前言​编辑 漏洞原理 XSS 漏洞的危害 检测 XSS 漏洞的方法 防范 XSS 漏洞的措施 前言 在网络安全的复杂版图中&#xff0c;XSS 漏洞&#xff0c;即跨站脚本攻击&#xff08;Cross - Site Scripting&#xff09;&#xff0c;是一类极为普遍且威胁巨大的安全隐患。随着互…...

从 GShard 到 DeepSeek-V3:回顾 MoE 大模型负载均衡策略演进

作者&#xff1a;小天狼星不来客 原文&#xff1a;https://zhuanlan.zhihu.com/p/19117825360 故事要从 GShard 说起——当时&#xff0c;人们意识到拥有数十亿甚至数万亿参数的模型可以通过某种形式的“稀疏化&#xff08;sparsified&#xff09;”来在保持高精度的同时加速训…...

【回溯+剪枝】回溯算法的概念 全排列问题

文章目录 46. 全排列Ⅰ. 什么是回溯算法❓❓❓Ⅱ. 回溯算法的应用1、组合问题2、排列问题3、子集问题 Ⅲ. 解题思路&#xff1a;回溯 剪枝 46. 全排列 46. 全排列 ​ 给定一个不含重复数字的数组 nums &#xff0c;返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。 …...

Flutter解决macbook M芯片Android Studio中不显示IOS真机的问题

下载了最新的Android Studio LadyBug 下载了最新的xcode16.2 结果&#xff0c;只有安卓真机才在Android studio显示&#xff0c; IOS真机只在xcode显示 IOS真机不在android studio显示。 解决方法是&#xff1a; 在终端运行如下命令&#xff1a; sudo xcode-select -s /Applic…...

自签证书的dockerfile中from命令无法拉取镜像而docker的pull命令能拉取镜像

问题现象&#xff1a; docker pull images拉取镜像正常 dockerfile中的from命令拉取镜像就会报出证书错误。报错信息如下&#xff1a; [bjxtbwj-kvm-test-jenkins-6-243 ceshi_dockerfile]$ docker build . [] Building 0.4s (3/3) FINISHED …...

【MySQL】--- 复合查询 内外连接

Welcome to 9ilks Code World (๑•́ ₃ •̀๑) 个人主页: 9ilk (๑•́ ₃ •̀๑) 文章专栏&#xff1a; MySQL &#x1f3e0; 基本查询回顾 假设有以下表结构&#xff1a; 查询工资高于500或岗位为MANAGER的雇员&#xff0c;同时还要满足他们的姓名首字母为…...

QT TLS initialization failed

qt使用QNetworkAccessManager下载文件&#xff08;给出的链接可以在浏览器里面下载文件&#xff09;&#xff0c;下载失败&#xff0c; 提示“TLS initialization failed”通常是由于Qt在使用HTTPS进行文件下载时&#xff0c;未能正确初始化TLS&#xff08;安全传输层协议&…...

系统学英语 — 句法 — 复合句

目录 文章目录 目录复合句型主语从句宾语从句表语从句定语从句状语从句同位语从句 复合句型 复合句型&#xff0c;即&#xff1a;从句。在英语中&#xff0c;除了谓语之外的所有句子成分都可以使用从句来充当。 主语从句 充当主语的句子&#xff0c;通常位于谓语之前&#x…...

指针的介绍2前

1.数组名的理解 #define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h>int main() {int arr[] { 1,2,3,4,5,6,7,8,9 };printf("&arr[0] %p\n", &arr[0]);printf("arr %p\n", arr);return 0; } 观察得到&#xff0c;数组名就是数组首…...

16.Word:石油化工设备技术❗【28】

目录 题目 NO1.2 NO3 NO4 题目 NO1.2 F12&#xff1a;另存为将“Word素材.docx”文件另存为“Word. docx”&#xff08;“docx”为文件扩展名&#xff09; 光标来到表格上方→插入→形状→新建画布→单击选中→格式→高度/宽度&#xff08;格式→大小对话框→取消勾选✔锁定…...

Python-基础环境(01) 虚拟环境,Python 基础环境之虚拟环境,一篇文章助你完全搞懂!

Python的虚拟环境是一种工具&#xff0c;它能够创建一个隔离的独立Python环境。每个虚拟环境都有自己独立的Python解释器和安装的包&#xff0c;不会与其他虚拟环境或系统的全局Python环境发生冲突。虚拟环境特别适用于以下情况&#xff1a; 项目隔离&#xff1a;不同的项目可…...

Dest1ny漏洞库:用友 U8-CRM 系统 ajaxgetborrowdata.php 存在 SQL 注入漏洞

用友U8-CRM系统ajaxgetborrowdata.php存在SQL注入漏洞&#xff0c;文件多个方法存在SQL注入漏洞&#xff0c;未经身份验证的攻击者通过漏洞执行任意SQL语句&#xff0c;调用xp_cmdshell写入后门文件&#xff0c;执行任意代码&#xff0c;从而获取到服务器权限。 hunter app.n…...

java.sql.Date 弃用分析与替代方案

引言 java.sql.Date 是 Java 标准库中的一个类&#xff0c;它继承自 java.util.Date&#xff0c;主要用于在 Java 应用程序与数据库之间进行日期数据的传输。然而&#xff0c;随着 Java 语言的发展&#xff0c;java.sql.Date 以及其父类 java.util.Date 逐渐被认为存在设计缺陷…...

HarmonyOS:状态管理最佳实践

一、概述 在声明式UI编程范式中&#xff0c;UI是应用程序状态的函数&#xff0c;应用程序状态的修改会更新相应的UI界面。ArkUI采用了MVVM模式&#xff0c;其中ViewModel将数据与视图绑定在一起&#xff0c;更新数据的时候直接更新视图。如下图所示&#xff1a; ArkUI的MVVM模式…...

如何提高新产品研发效率

优化研发流程、采用先进工具、提升团队协作、持续学习与改进&#xff0c;是提高新产品研发效率的关键。其中&#xff0c;优化研发流程尤为重要。通过简化流程&#xff0c;减少不必要的环节和复杂性&#xff0c;企业可以显著提升研发效率。例如&#xff0c;采用自动化测试工具和…...

RestClient

什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端&#xff0c;它允许HTTP与Elasticsearch 集群通信&#xff0c;而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级&#xff…...

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…...

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...

关于nvm与node.js

1 安装nvm 安装过程中手动修改 nvm的安装路径&#xff0c; 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解&#xff0c;但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后&#xff0c;通常在该文件中会出现以下配置&…...

拉力测试cuda pytorch 把 4070显卡拉满

import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试&#xff0c;通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小&#xff0c;增大可提高计算复杂度duration: 测试持续时间&#xff08;秒&…...

Java 二维码

Java 二维码 **技术&#xff1a;**谷歌 ZXing 实现 首先添加依赖 <!-- 二维码依赖 --><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.5.1</version></dependency><de…...

免费PDF转图片工具

免费PDF转图片工具 一款简单易用的PDF转图片工具&#xff0c;可以将PDF文件快速转换为高质量PNG图片。无需安装复杂的软件&#xff0c;也不需要在线上传文件&#xff0c;保护您的隐私。 工具截图 主要特点 &#x1f680; 快速转换&#xff1a;本地转换&#xff0c;无需等待上…...

【C++进阶篇】智能指针

C内存管理终极指南&#xff1a;智能指针从入门到源码剖析 一. 智能指针1.1 auto_ptr1.2 unique_ptr1.3 shared_ptr1.4 make_shared 二. 原理三. shared_ptr循环引用问题三. 线程安全问题四. 内存泄漏4.1 什么是内存泄漏4.2 危害4.3 避免内存泄漏 五. 最后 一. 智能指针 智能指…...

从 GreenPlum 到镜舟数据库:杭银消费金融湖仓一体转型实践

作者&#xff1a;吴岐诗&#xff0c;杭银消费金融大数据应用开发工程师 本文整理自杭银消费金融大数据应用开发工程师在StarRocks Summit Asia 2024的分享 引言&#xff1a;融合数据湖与数仓的创新之路 在数字金融时代&#xff0c;数据已成为金融机构的核心竞争力。杭银消费金…...

【 java 虚拟机知识 第一篇 】

目录 1.内存模型 1.1.JVM内存模型的介绍 1.2.堆和栈的区别 1.3.栈的存储细节 1.4.堆的部分 1.5.程序计数器的作用 1.6.方法区的内容 1.7.字符串池 1.8.引用类型 1.9.内存泄漏与内存溢出 1.10.会出现内存溢出的结构 1.内存模型 1.1.JVM内存模型的介绍 内存模型主要分…...