C# 设置PDF表单不可编辑、或提取PDF表单数据
PDF表单是PDF中的可编辑区域,允许用户填写指定信息。当表单填写完成后,有时候我们可能需要将其设置为不可编辑,以保护表单内容的完整性和可靠性。或者需要从PDF表单中提取数据以便后续处理或分析。
之前文章详细介绍过如何使用免费Spire.PDF库通过C# 创建、填写表单,本文将继续介绍该免费.NET PDF库支持的另外两种操作PDF表单的功能,即:
- 使用C# 设置PDF表单不可编辑(PDF扁平化)
- 使用C# 提取PDF表单数据
免费库安装(2种方法):
Free Spire.PDF for .NET 免费库支持两种安装方式:
- 通过 NuGet安装:http://www.nuget.org/packages/FreeSpire.PDF/
- 点击下载产品包,解压缩后手动引用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表单数据的更多相关文章
- 如何从mysql备份中提取单张表数据
1.先提取备份数据中的前50行出来,查看一下备份数据格式 head -50 bakdb.sql > head50.txt 类似下面的数据是我们所需要提取的: / ...
- PDF文件编辑技巧之PDF书签怎么设置
纸质的文件想要添加书签就直接拿笔书写就可以,Word文件怎么添加书签相信大家也都知道,那么PDF文件的书签要怎么设置的呢,是不是有很多小伙伴不知道该怎么做呢,不要担心,今天小编就来跟大家分享一下在PD ...
- react+antd pro实现【列表可实时行内编辑】的弹窗表单组件
纯列表版效果展示: ① 初始无值,展示为唤醒按钮+文案外链 ②点击按钮唤醒弹窗(简易版示意图) ③配置后 可编辑表格组件文档: https://procomponents.ant.design/com ...
- 表单验证:$tablePrefix(定义表前缀);$trueTableName = 'yonghu',找到真实表名(yonghu)表;create($attr,0)两个参数;批量验证(返回数组);ajax+动态验证表单
*$tablePrefix是定义在Model中的,优先级大于配置文件中,如果项目中表前缀全部比如为"a_",并且在配置文件中定义了 'DB_PREFIX'=>'a_' 后期如 ...
- 设置DataGridView 显示自己添加编辑的列名,不动态显示数据库本身
设置DataGridView 显示自己添加编辑的列名,不动态显示数据库本身. 方法: (1)界面操作,把DataGridView控件拖放在窗体中,就看到DataGridView控件的右上角有个小三角, ...
- PDF编辑方法,PDF怎么去除背景
PDF文件现在是使用的频率很高的一个软件的格式,PDF文件能够更加直观清楚的表达,PDF文件的使用很方便但编辑起来就来没有那么容易了,PDF文件的编辑是需要借助软件的,今天小编就来跟大家分享一下PDF ...
- laravel基础课程---14、表单验证(lavarel如何进行表单验证)
laravel基础课程---14.表单验证(lavarel如何进行表单验证) 一.总结 一句话总结: lavarel的验证的功能比tp要[简单]且[强大]很多 直接控制器中:添加[规则数组]和[修改提 ...
- ElementUI表单验证攻略:解决表单项启用和禁用验证的切换,以及动态表单验证的综合性问题
试想一种比较复杂的业务场景: 表格(el-table)的每一行数据的第一列是勾选框,最后一列是输入框.当某一行的勾选框勾上时,启用该行的输入框,并开启该行输入框的表单验证:取消该行的勾选框,则禁用该行 ...
- PDF无法复制/打印/编辑怎么办?
PDF的内容不能复制/打印/编辑,主要有两种原因: 1.PDF文件设置了权限保护 2.PDF内容是图片 第一种,PDF被设置了权限保护 这种的特点是可以选中PDF里的文字,但无法复制 PDF格式标准内 ...
- Ext JS4 学习笔记之发送表单(Form)时也将表单下的表格(Grid)数据一同发送的方法
Ext JS4 学习笔记之发送表单(Form)时也将表单下的表格(Grid)数据一同发送的方法 昨天在开发的时候遇到个小问题,就是如何将Grid的内容与Form一起发送到服务器端.默认情况下,表单(F ...
随机推荐
- python入门_模块2
0.collections模块 在内置数据类型(dict.list.set.tuple)的基础上,collections模块还提供了几个额外的数据类型:Counter.deque.defaultdic ...
- Python 潮流周刊#48:Python 3.14 的发布计划
本周刊由 Python猫 出品,精心筛选国内外的 250+ 信息源,为你挑选最值得分享的文章.教程.开源项目.软件工具.播客和视频.热门话题等内容.愿景:帮助所有读者精进 Python 技术,并增长职 ...
- 从大数据平台CDP的架构看大数据的发展趋势
CDP(Cloudera Data Platform)是Cloudera 和 HortonWorks 合并后推出的新一代大数据平台 ,并正在逐步停止对原有的大数据平台 CDH 和 HDP 的维护.笔记 ...
- 模型压缩与部署-书生浦语大模型实战营学习笔记5&大语言模型11
大语言模型-11.模型压缩与部署 书生浦语大模型实战营学习笔记4-模型压缩与部署 本文包括第二期实战营的第5课内容,介绍关于模型压缩的相关内容,主要包括.模型量化和模型部署的相关内容. 模型部署 定义 ...
- ibus 输入法导致输入卡顿的解决方案
系统: Zorin OS 16 Pro 基于 Ubuntu 20.04 LTS 关键词:Linux 间歇性卡顿.输入法导致卡顿.无法输入 本问题发生的情形是系统间歇性的无法接受键盘输入,无意间发现切换 ...
- nim 1. 安装、IDE、HelloWorld
2015年,某大神写过nim的教程,请参阅: Nim教程[一] - liulun - 博客园 (cnblogs.com) 七年过去了, nim应该更成熟了. 1.安装 下载页面:Windows ins ...
- HH的项链——题解
题目描述 直接求解会导致不同贝壳在上个区间算过但这个区间没标记的情况,所以在求解时要把上个区间的标记转移到这个区间 转移前先右边界由小到大排序,然后转移上个右边界到这个右边界的标记,同时记录上个标记出 ...
- console小知识
console.log(JSON.stringify(object,null,2));
- C语言:++ --优先级的深入理解
#include <stdio.h> int main() { int num = 11; int result = ++num > 11 && --num < ...
- 4G LTE/EPC UE 的附着与去附着
目录 文章目录 目录 UE 附着 UE 与 MME 建立 NAS 连接 UE 附着协议全景 UE 附着流程 UE 去附着 UE 侧发起的去附着 MME 发起的去附着 HSS 发起的去附着 UE 附着 ...