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

C# 设置PDF表单不可编辑、或提取PDF表单数据的更多相关文章

  1. 如何从mysql备份中提取单张表数据

    1.先提取备份数据中的前50行出来,查看一下备份数据格式    head -50 bakdb.sql > head50.txt        类似下面的数据是我们所需要提取的:        / ...

  2. PDF文件编辑技巧之PDF书签怎么设置

    纸质的文件想要添加书签就直接拿笔书写就可以,Word文件怎么添加书签相信大家也都知道,那么PDF文件的书签要怎么设置的呢,是不是有很多小伙伴不知道该怎么做呢,不要担心,今天小编就来跟大家分享一下在PD ...

  3. react+antd pro实现【列表可实时行内编辑】的弹窗表单组件

    纯列表版效果展示: ① 初始无值,展示为唤醒按钮+文案外链 ②点击按钮唤醒弹窗(简易版示意图) ③配置后 可编辑表格组件文档: https://procomponents.ant.design/com ...

  4. 表单验证:$tablePrefix(定义表前缀);$trueTableName = 'yonghu',找到真实表名(yonghu)表;create($attr,0)两个参数;批量验证(返回数组);ajax+动态验证表单

    *$tablePrefix是定义在Model中的,优先级大于配置文件中,如果项目中表前缀全部比如为"a_",并且在配置文件中定义了 'DB_PREFIX'=>'a_' 后期如 ...

  5. 设置DataGridView 显示自己添加编辑的列名,不动态显示数据库本身

    设置DataGridView 显示自己添加编辑的列名,不动态显示数据库本身. 方法: (1)界面操作,把DataGridView控件拖放在窗体中,就看到DataGridView控件的右上角有个小三角, ...

  6. PDF编辑方法,PDF怎么去除背景

    PDF文件现在是使用的频率很高的一个软件的格式,PDF文件能够更加直观清楚的表达,PDF文件的使用很方便但编辑起来就来没有那么容易了,PDF文件的编辑是需要借助软件的,今天小编就来跟大家分享一下PDF ...

  7. laravel基础课程---14、表单验证(lavarel如何进行表单验证)

    laravel基础课程---14.表单验证(lavarel如何进行表单验证) 一.总结 一句话总结: lavarel的验证的功能比tp要[简单]且[强大]很多 直接控制器中:添加[规则数组]和[修改提 ...

  8. ElementUI表单验证攻略:解决表单项启用和禁用验证的切换,以及动态表单验证的综合性问题

    试想一种比较复杂的业务场景: 表格(el-table)的每一行数据的第一列是勾选框,最后一列是输入框.当某一行的勾选框勾上时,启用该行的输入框,并开启该行输入框的表单验证:取消该行的勾选框,则禁用该行 ...

  9. PDF无法复制/打印/编辑怎么办?

    PDF的内容不能复制/打印/编辑,主要有两种原因: 1.PDF文件设置了权限保护 2.PDF内容是图片 第一种,PDF被设置了权限保护 这种的特点是可以选中PDF里的文字,但无法复制 PDF格式标准内 ...

  10. Ext JS4 学习笔记之发送表单(Form)时也将表单下的表格(Grid)数据一同发送的方法

    Ext JS4 学习笔记之发送表单(Form)时也将表单下的表格(Grid)数据一同发送的方法 昨天在开发的时候遇到个小问题,就是如何将Grid的内容与Form一起发送到服务器端.默认情况下,表单(F ...

随机推荐

  1. [DApp] Moralis 生产阶段的服务安全设置 -锁定数据库

    Moralis 的基础设施数据库是使用的 MongoDB,其非常适合Dev阶段的快速开发. 如果进入生产环境,需要锁定数据库,防止任何用户可利用SDK向Mongo插入多余数据. 另外,Moralis ...

  2. [FAQ] GoLand 需要手动开启代码补全吗 ?

    使用 go mod download 下载模块到本地缓存中,之后 GoLand 就会根据输入自动代码提示. Other:[FAQ] Goland 始终没有包代码的提示 Link:https://www ...

  3. SemanticFunction 融合 LLM 和传统编程

    本文将继续和大家介绍 SemanticKernel 神奇的魔法,将使用 LLM 大语言模型编写的自然语言函数和传统的编程语言编写的函数融合到一起的例子.通过本文的例子,大家可以看到 SemanticK ...

  4. VisualStudio 使用 FastTunnel 辅助搭建远程调试环境

    有时候需要远程调试一些用户问题,期望能使用本机的 Visual Studio 开发环境,调试远程的用户的设备上的应用.这时会遇到的一个问题是如何让本机的 Visual Studio 可以连接上远程的用 ...

  5. 2019-8-31-How-to-output-the-target-message-in-dotnet-build-command-line

    title author date CreateTime categories How to output the target message in dotnet build command lin ...

  6. k8s核心资源Job&&CronJob调度pod

    一.Job与CronJob概念与与原理解读 Job 控制器用于管理 Pod 对象运行一次性任务,比方说我们对数据库备份,可以直接在 k8s 上启动一个 mysqldump 备份程序,也可以启动一个 p ...

  7. 6、Samba 文件共享服务

    1.Samba 服务基础 SMB(Server Message Block),服务消息块 CIFS(Common Internet File System),通用互联网文件系统 Samba 项目:ht ...

  8. LLaMA 3 源码解读-大语言模型5

    本来不是很想写这一篇,因为网上的文章真的烂大街了,我写的真的很有可能没别人写得好.但是想了想,创建这个博客就是想通过对外输出知识的方式来提高自身水平,而不是说我每篇都能写得有多好多好然后吸引别人来看. ...

  9. C 语言编程 — 变量与常量

    目录 文章目录 目录 前文列表 变量与常量 变量 变量的类型 变量的声明 变量的定义 变量的初始化与赋值 常量 整型常量 浮点型常量 字符型场景 字符串常量 符号常量 作用域 存储类 auto 修饰符 ...

  10. 使用docker 5分钟搭建一个博客(mysql+WordPress)

    目录 一.系统环境 二.前言 三.搭建博客 3.1 创建wordpress和mysql容器 3.2 在wordpress界面设置个人博客信息 3.3 WordPress容器创建命令的简化版本 一.系统 ...