C# 设置PDF表单不可编辑、或提取PDF表单数据

PDF表单是PDF中的可编辑区域,允许用户填写指定信息。当表单填写完成后,有时候我们可能需要将其设置为不可编辑,以保护表单内容的完整性和可靠性。或者需要从PDF表单中提取数据以便后续处理或分析。

之前文章详细介绍过如何使用免费Spire.PDF库通过C# 创建、填写表单本文将继续介绍该免费.NET PDF库支持的另外两种操作PDF表单的功能,即:

  • 使用C# 设置PDF表单不可编辑(PDF扁平化)
  • 使用C# 提取PDF表单数据

免费库安装(2种方法):

**Free Spire.PDF for .NET**免费库支持两种安装方式:

  1. 通过 NuGet安装:http://www.nuget.org/packages/FreeSpire.PDF/
  2. 点击下载产品包,解压缩后手动引用dll

https://www.e-iceblue.com/Download/download-pdf-for-net-free.html

使用C# 设置PDF表单不可编辑(PDF扁平化)

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;

使用C# 提取PDF表单数据

在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中文教程

相关推荐
小码编匠2 小时前
一款 C# 编写的神经网络计算图框架
后端·神经网络·c#
Envyᥫᩣ5 小时前
C#语言:从入门到精通
开发语言·c#
IT技术分享社区11 小时前
C#实战:使用腾讯云识别服务轻松提取火车票信息
开发语言·c#·云计算·腾讯云·共识算法
△曉風殘月〆18 小时前
WPF MVVM入门系列教程(二、依赖属性)
c#·wpf·mvvm
逐·風20 小时前
unity关于自定义渲染、内存管理、性能调优、复杂物理模拟、并行计算以及插件开发
前端·unity·c#
m0_656974741 天前
C#中的集合类及其使用
开发语言·c#
九鼎科技-Leo1 天前
了解 .NET 运行时与 .NET 框架:基础概念与相互关系
windows·c#·.net
九鼎科技-Leo1 天前
什么是 ASP.NET Core?与 ASP.NET MVC 有什么区别?
windows·后端·c#·asp.net·mvc·.net
.net开发1 天前
WPF怎么通过RestSharp向后端发请求
前端·c#·.net·wpf