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表单不可编辑。

简单代码示例:

  1. using Spire.Pdf;
  2.  
  3. namespace FlattenAllFormFields
  4. {
  5. class Program
  6. {
  7. static void Main(string[] args)
  8. {
  9. //加载PDF文件
  10. PdfDocument pdf = new PdfDocument();
  11. pdf.LoadFromFile("PDF表单.pdf");
  12.  
  13. //设置所有表单不可编辑
  14. pdf.Form.IsFlatten = true;
  15.  
  16. //保存生成文件
  17. pdf.SaveToFile("扁平PDF.pdf");
  18. }
  19. }
  20. }

以上示例一键锁定了PDF文件中的所有表单,如果仅需锁定某个指定的表单域,可以参考如下代码片段:

  1. //获取PDF表单
  2. PdfFormWidget formWidget = (PdfFormWidget)pdf.Form;
  3.  
  4. //通过表单名获取指定表单域
  5. PdfField form = formWidget.FieldsWidget["姓名"];
  6.  
  7. //通过索引获取指定表单域
  8. PdfField form = formWidget.FieldsWidget.List[0] as PdfField;
  9.  
  10. //设置表单不可编辑
  11. form.Flatten = true;

使用C# 提取PDF表单数据

在Free Spire.PDF中,每种表单域都提供了对应的类。要实现PDF表单数据的提取,我们需要先确定表单域的类型,然后再使用相应类下的属性来提取它们的值。

完整C#示例代码:

  1. using Spire.Pdf;
  2. using Spire.Pdf.Fields;
  3. using Spire.Pdf.Widget;
  4. using System.IO;
  5. using System.Text;
  6.  
  7. namespace ExtractFormFieldValues
  8. {
  9. internal class Program
  10. {
  11. static void Main(string[] args)
  12. {
  13. //加载PDF文件
  14. PdfDocument doc = new PdfDocument();
  15. doc.LoadFromFile("PDF表单.pdf");
  16.  
  17. //创建StringBuilder对象
  18. StringBuilder sb = new StringBuilder();
  19.  
  20. //获取PDF表单
  21. PdfFormWidget formWidget = doc.Form as PdfFormWidget;
  22.  
  23. //遍历表单
  24. for (int i = 0; i < formWidget.FieldsWidget.List.Count; i++)
  25. {
  26. PdfField field = formWidget.FieldsWidget.List[i] as PdfField;
  27.  
  28. //获取文本框的名称和值
  29. if (field is PdfTextBoxFieldWidget)
  30. {
  31. PdfTextBoxFieldWidget textBoxField = field as PdfTextBoxFieldWidget;
  32. string name = textBoxField.Name;
  33. string value = textBoxField.Text;
  34. sb.Append("文本框名称: " + name + "\r\n");
  35. sb.Append("文本框内容: " + value + "\r\n");
  36. }
  37.  
  38. //获取列表框的名称、项目和选定项
  39. if (field is PdfListBoxWidgetFieldWidget)
  40. {
  41. PdfListBoxWidgetFieldWidget listBoxField = field as PdfListBoxWidgetFieldWidget;
  42. string name = listBoxField.Name;
  43. sb.Append("列表框名称: " + name + "\r\n");
  44. sb.Append("列表框项目: \r\n");
  45.  
  46. PdfListWidgetItemCollection items = listBoxField.Values;
  47.  
  48. foreach (PdfListWidgetItem item in items)
  49. {
  50. sb.Append(item.Value + "\r\n");
  51. }
  52. string selectedValue = listBoxField.SelectedValue;
  53. sb.Append("列表框选定项: " + selectedValue + "\r\n");
  54. }
  55.  
  56. //获取组合框字段的名称、项目和选定项
  57. if (field is PdfComboBoxWidgetFieldWidget)
  58. {
  59. PdfComboBoxWidgetFieldWidget comBoxField = field as PdfComboBoxWidgetFieldWidget;
  60. string name = comBoxField.Name;
  61. sb.Append("组合框名称: " + name + "\r\n");
  62. sb.Append("组合框项目: \r\n");
  63. PdfListWidgetItemCollection items = comBoxField.Values;
  64.  
  65. foreach (PdfListWidgetItem item in items)
  66. {
  67. sb.Append(item.Value + "\r\n");
  68. }
  69. string selectedValue = comBoxField.SelectedValue;
  70. sb.Append("组合框选定项: " + selectedValue + "\r\n");
  71.  
  72. }
  73.  
  74. //获取单选按钮的名称和所选项
  75. if (field is PdfRadioButtonListFieldWidget)
  76. {
  77. PdfRadioButtonListFieldWidget radioBtnField = field as PdfRadioButtonListFieldWidget;
  78. string name = radioBtnField.Name;
  79. sb.Append("单选按钮名称: " + name + "\r\n");
  80. string selectedValue = radioBtnField.SelectedValue;
  81. sb.Append("单选按钮选定项: " + selectedValue + "\r\n");
  82. }
  83.  
  84. //获取复选框的名称和状态
  85. if (field is PdfCheckBoxWidgetFieldWidget)
  86. {
  87. PdfCheckBoxWidgetFieldWidget checkBoxField = field as PdfCheckBoxWidgetFieldWidget;
  88. string name = checkBoxField.Name;
  89. sb.Append("复选框名称: " + name + "\r\n");
  90. bool status = checkBoxField.Checked;
  91. if (status)
  92. {
  93. sb.Append("复选框状态: 已选中 \r\n");
  94. }
  95. else
  96. {
  97. sb.Append("复选框状态: 未选中 \r\n");
  98. }
  99. }
  100.  
  101. sb.Append("\n");
  102. }
  103.  
  104. //将提取的数据写入txt文件
  105. File.WriteAllText("提取PDF表单.txt", sb.ToString());
  106. doc.Dispose();
  107. }
  108. }
  109. }

提取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. ARMv9刷屏 —— 号称十年最大变革,Realm机密计算技术有什么亮点?

    ​简介: 让我们看下ARMv9机密计算相关的新特性Realm. ​ ARMv9的新闻刷屏了.ARMv9号称十年以来最重大变革,因此让我们看下ARMv9中机密计算相关的新特性Realm.(注:本文是对I ...

  2. SQL server 查看脚本

    原文出处:http://blog.csdn.net/xiaochunyong/article/details/7455051 --Siuon --查看存储过程源码 create procedure m ...

  3. portainer和cadvisor图形化界面管理与监控

    一.cadvisor docker pull google/cadvisor docker run -it -p 8890:8080 -v /var/run:/var/run -v /db/docke ...

  4. 关于Python中的None

    关于Python中的None 注意到None这个类型是在做一道Python题目时,要求说如果传进函数的字符串是"None"则返回False,糟糕的是我并不知道如何判断是否是&quo ...

  5. ansible(12)--ansible的cron模块

    1. cron模块 功能:管理被控端计划任务: 主要参数如下: 参数 说明 name 定时任务基本描述 job 定时任务要执行的命令 minute 分 hour 小时 day 日 month 月 we ...

  6. keepalived(1)- keepalived集群概述

    目录 1. 高可用集群概述 2. keepalived概述 2.1 keepalived介绍 2.2 keepalived体系架构 2.3 keepalived实现原理 2.4 keepalived配 ...

  7. 处理flex布局

    点击查看代码 <view class="recommend-view"> <view class="title-view"> 热门推荐 ...

  8. FFmpeg开发笔记(二十一)Windows环境给FFmpeg集成AVS3解码器

    ​AVS3是中国AVS工作组制定的第三代音视频编解码技术标准,也是全球首个已推出的面向8K及5G产业应用的视频编码标准.AVS工作组于2019年3月9日完成第三代AVS视频标准(AVS3)基准档次的制 ...

  9. MYSQL造数据占用临时表空间

    在MySQL中,临时表空间通常用于存储如ORDER BY.GROUP BY.DISTINCT.UNION.JOIN等操作中产生的临时数据.当这些操作的数据集太大而无法在内存中完成时,MySQL会使用磁 ...

  10. 树莓派 ubuntu server 22.x 连接无线网络

    前言 树莓派系统安装完成后,需要配置网络,由于家里没有多余的网线(网线多少有点乱),所以决定配置无线上网的方式,现在记录下来操作过程 具体操作 sudo nano /etc/netplan/xxxxx ...