C# 提取PDF表单数据

news/2025/1/30 13:29:13/

目录

使用工具

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

C# 提取特定PDF表单域的数据


PDF表单是一种常见的数据收集工具,广泛应用于调查问卷、业务合同等场景。凭借出色的跨平台兼容性和标准化特点,PDF表单在各行各业中得到了广泛应用。然而,当需要整合、分析或导入大量已填写的表单数据时,传统的手动处理方式不仅耗时,而且容易出错。因此,掌握自动提取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表单域数据的全部内容。感谢阅读!


http://www.ppmy.cn/news/1567552.html

相关文章

计算机视觉-卷积

卷积-图像去噪 一、图像 二进制 灰度 彩色 1.1二进制图像 0 1 一个点可以用一个bit&#xff08;0/1&#xff09;来表示 1.2灰度图像 0-255 一个点可以用一个byte来表示 1.3彩色图像 RGB 表达一个彩色图像先说它的分辨率p/w&#xff08;宽&#xff09;和q/h&#xff08;高…

centos搭建docker registry镜像仓库

centos搭建docker registry镜像仓库 简介 Docker Registry是一个存储和分发Docker镜像的服务。它允许用户上传、下载和管理 Docker 镜像&#xff0c;为容器化应用的部署提供了便利。 拉取镜像 docker image pull registry证书配置 创建镜像仓库的镜像数据目录和证书目录&…

qt-QtQuick笔记之常见项目类简要介绍

qt-QtQuick笔记之常见项目类简要介绍 code review! 文章目录 qt-QtQuick笔记之常见项目类简要介绍1.QQuickItem2.QQuickRectangle3.QQuickImage4.QQuickText5.QQuickBorderImage6.QQuickTextInput7.QQuickButton8.QQuickSwitch9.QQuickListView10.QQuickGridView11.QQuickPopu…

华为OD机试真题---战场索敌

华为OD机试真题“战场索敌”是一道考察算法和数据结构应用能力的题目。以下是对该题目的详细解析&#xff1a; 一、题目描述 有一个大小是NM的战场地图&#xff0c;被墙壁’#‘分隔成大小不同的区域。上下左右四个方向相邻的空地’.‘属于同一个区域&#xff0c;只有空地上可…

CSAPP学习:前言

前言 本书简称CS&#xff1a;APP。 背景知识 一些基础的C语言知识 如何阅读 Do-做系统 在真正的系统上解决具体的问题&#xff0c;或是编写和运行程序。 章节 2025-1-27 个人认为如下章节将会对学习408中的操作系统与计算机组成原理提供帮助&#xff0c;于是先凭借记忆将其简单…

python selenium 用法教程

目录 准备工作 下载对应的浏览器驱动 如果要从浏览器外部控制浏览&#xff1a; 编程语言->调用selenium->浏览器驱动->浏览器 准备工作 下载对应的浏览器驱动 查看自己的谷歌浏览器的版本&#xff0c;下载对应版本的驱动 Downloads | Selenium from selenium imp…

【Super Tilemap Editor使用详解】(十三):快捷键指南(Keyboard Shortcuts)

在使用 Super Tilemap Editor 进行图块地图编辑时&#xff0c;键盘快捷键可以显著提高工作效率。本文将详细介绍常用的快捷键及其功能&#xff0c;帮助你更快地完成图块绘制、翻转、旋转以及工具切换等操作。 一、快捷键文件位置 所有键盘快捷键的定义可以在以下路径找到&…

GBase 8a 9.5.3.27 DBlink配置---源端GBase

原理图 1.目标端集群将数据请求由gcluster的5258端口发送至dblink的9898端口 2.Dblink将请求由9898端口转发至源端集群的5258端口 3.源端数据库将接收的请求生成执行计划&#xff0c;由gcluster的5258端口下发至各gnode的5050端口 4.源端的5050端口接收到执行计划进行查询&…