PDF表单是PDF中的可编辑区域,允许用户填写指定信息。当表单填写完成后,有时候我们可能需要将其设置为不可编辑,以保护表单内容的完整性和可靠性。或者需要从PDF表单中提取数据以便后续处理或分析。
之前文章详细介绍过如何使用免费Spire.PDF库通过C# 创建、填写表单,本文将继续介绍该免费.NET PDF库支持的另外两种操作PDF表单的功能,即:
Free Spire.PDF for .NET 免费库支持两种安装方式:
https://www.e-iceblue.com/Download/download-pdf-for-net-free.html
PDF 表单如文本框、复选框、组合框等都是可编辑或可更改状态,如果想要锁定这些区域,我们需要将PDF表单设置为不可编辑状态,即PDF扁平化。在Free Spire.PDF中, 我们可以通过将其提供的 PdfDocument.Form.IsFlatten 属性设置为 "true" 来锁定PDF表单不可编辑。
简单代码示例:
using Spire.Pdf; namespace FlattenAllFormFields { class Program { static void Main(string[] args) { //加载PDF文件 PdfDocument pdf = new PdfDocument(); pdf.LoadFromFile("PDF表单.pdf"); //设置所有表单不可编辑 pdf.Form.IsFlatten = true; //保存生成文件 pdf.SaveToFile("扁平PDF.pdf"); } } }
以上示例一键锁定了PDF文件中的所有表单,如果仅需锁定某个指定的表单域,可以参考如下代码片段:
//获取PDF表单 PdfFormWidget formWidget = (PdfFormWidget)pdf.Form; //通过表单名获取指定表单域 PdfField form = formWidget.FieldsWidget["姓名"]; //通过索引获取指定表单域 PdfField form = formWidget.FieldsWidget.List[0] as PdfField; //设置表单不可编辑 form.Flatten = true;
在Free Spire.PDF中,每种表单域都提供了对应的类。要实现PDF表单数据的提取,我们需要先确定表单域的类型,然后再使用相应类下的属性来提取它们的值。
完整C#示例代码:
using Spire.Pdf; using Spire.Pdf.Fields; using Spire.Pdf.Widget; using System.IO; using System.Text; namespace ExtractFormFieldValues { internal class Program { static void Main(string[] args) { //加载PDF文件 PdfDocument doc = new PdfDocument(); doc.LoadFromFile("PDF表单.pdf"); //创建StringBuilder对象 StringBuilder sb = new StringBuilder(); //获取PDF表单 PdfFormWidget formWidget = doc.Form as PdfFormWidget; //遍历表单 for (int i = 0; i < formWidget.FieldsWidget.List.Count; i++) { PdfField field = formWidget.FieldsWidget.List[i] as PdfField; //获取文本框的名称和值 if (field is PdfTextBoxFieldWidget) { PdfTextBoxFieldWidget textBoxField = field as PdfTextBoxFieldWidget; string name = textBoxField.Name; string value = textBoxField.Text; sb.Append("文本框名称: " + name + "\r\n"); sb.Append("文本框内容: " + value + "\r\n"); } //获取列表框的名称、项目和选定项 if (field is PdfListBoxWidgetFieldWidget) { PdfListBoxWidgetFieldWidget listBoxField = field as PdfListBoxWidgetFieldWidget; string name = listBoxField.Name; sb.Append("列表框名称: " + name + "\r\n"); sb.Append("列表框项目: \r\n"); PdfListWidgetItemCollection items = listBoxField.Values; foreach (PdfListWidgetItem item in items) { sb.Append(item.Value + "\r\n"); } string selectedValue = listBoxField.SelectedValue; sb.Append("列表框选定项: " + selectedValue + "\r\n"); } //获取组合框字段的名称、项目和选定项 if (field is PdfComboBoxWidgetFieldWidget) { PdfComboBoxWidgetFieldWidget comBoxField = field as PdfComboBoxWidgetFieldWidget; string name = comBoxField.Name; sb.Append("组合框名称: " + name + "\r\n"); sb.Append("组合框项目: \r\n"); PdfListWidgetItemCollection items = comBoxField.Values; foreach (PdfListWidgetItem item in items) { sb.Append(item.Value + "\r\n"); } string selectedValue = comBoxField.SelectedValue; sb.Append("组合框选定项: " + selectedValue + "\r\n"); } //获取单选按钮的名称和所选项 if (field is PdfRadioButtonListFieldWidget) { PdfRadioButtonListFieldWidget radioBtnField = field as PdfRadioButtonListFieldWidget; string name = radioBtnField.Name; sb.Append("单选按钮名称: " + name + "\r\n"); string selectedValue = radioBtnField.SelectedValue; sb.Append("单选按钮选定项: " + selectedValue + "\r\n"); } //获取复选框的名称和状态 if (field is PdfCheckBoxWidgetFieldWidget) { PdfCheckBoxWidgetFieldWidget checkBoxField = field as PdfCheckBoxWidgetFieldWidget; string name = checkBoxField.Name; sb.Append("复选框名称: " + name + "\r\n"); bool status = checkBoxField.Checked; if (status) { sb.Append("复选框状态: 已选中 \r\n"); } else { sb.Append("复选框状态: 未选中 \r\n"); } } sb.Append("\n"); } //将提取的数据写入txt文件 File.WriteAllText("提取PDF表单.txt", sb.ToString()); doc.Dispose(); } } }
提取PDF表单的效果图:
免费Spire.PDF支持多种对PDF表单的操作,使用它,我们可以通过C# 轻松实现锁定PDF表单以确保表单不被篡改或编辑,或者通过C# 快速提取PDF表单数据并用于各种用途,如数据分析、报告生成等。
如有兴趣了解更多.NET程序中操作PDF文档的示例,可点击:Spire.PDF中文教程