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 ...
随机推荐
- ARMv9刷屏 —— 号称十年最大变革,Realm机密计算技术有什么亮点?
简介: 让我们看下ARMv9机密计算相关的新特性Realm. ARMv9的新闻刷屏了.ARMv9号称十年以来最重大变革,因此让我们看下ARMv9中机密计算相关的新特性Realm.(注:本文是对I ...
- SQL server 查看脚本
原文出处:http://blog.csdn.net/xiaochunyong/article/details/7455051 --Siuon --查看存储过程源码 create procedure m ...
- portainer和cadvisor图形化界面管理与监控
一.cadvisor docker pull google/cadvisor docker run -it -p 8890:8080 -v /var/run:/var/run -v /db/docke ...
- 关于Python中的None
关于Python中的None 注意到None这个类型是在做一道Python题目时,要求说如果传进函数的字符串是"None"则返回False,糟糕的是我并不知道如何判断是否是&quo ...
- ansible(12)--ansible的cron模块
1. cron模块 功能:管理被控端计划任务: 主要参数如下: 参数 说明 name 定时任务基本描述 job 定时任务要执行的命令 minute 分 hour 小时 day 日 month 月 we ...
- keepalived(1)- keepalived集群概述
目录 1. 高可用集群概述 2. keepalived概述 2.1 keepalived介绍 2.2 keepalived体系架构 2.3 keepalived实现原理 2.4 keepalived配 ...
- 处理flex布局
点击查看代码 <view class="recommend-view"> <view class="title-view"> 热门推荐 ...
- FFmpeg开发笔记(二十一)Windows环境给FFmpeg集成AVS3解码器
AVS3是中国AVS工作组制定的第三代音视频编解码技术标准,也是全球首个已推出的面向8K及5G产业应用的视频编码标准.AVS工作组于2019年3月9日完成第三代AVS视频标准(AVS3)基准档次的制 ...
- MYSQL造数据占用临时表空间
在MySQL中,临时表空间通常用于存储如ORDER BY.GROUP BY.DISTINCT.UNION.JOIN等操作中产生的临时数据.当这些操作的数据集太大而无法在内存中完成时,MySQL会使用磁 ...
- 树莓派 ubuntu server 22.x 连接无线网络
前言 树莓派系统安装完成后,需要配置网络,由于家里没有多余的网线(网线多少有点乱),所以决定配置无线上网的方式,现在记录下来操作过程 具体操作 sudo nano /etc/netplan/xxxxx ...