目录
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表单域数据的全部内容。感谢阅读!