C# 操作PDF表单 - 创建、填写、删除PDF表单域

通常情况下,PDF文件是不可编辑的,但PDF表单提供了一些可编辑区域,允许用户填写和提交信息。PDF表单通常用于收集信息、反馈或进行在线申请,是许多行业中数据收集和交换的重要工具。

PDF表单可以包含各种类型的输入控件,如文本框、复选框、下拉菜单、单选按钮等。本文将介绍如何使用C# 和一个免费.NET库来操作PDF表单,包括以下三个示例:

目录

使用C# 创建PDF表单域

使用C# 填写PDF表单域

使用C# 删除PDF表单域


安装免费.NET PDF库 Free Spire.PDF for .NET (可通过 NuGet安装,或下载后手动引用dll

PM> Install-Package FreeSpire.PDF

常见PDF表单域

Free Spire.PDF for .NET 支持创建、操作多种PDF表域,包括文本框、复选框、组合框、列表框和单选按钮等。下表列出了一些常见的域及其在该免费库中对应的类名。

表单域名类名
文本域PdfTextBoxField
复选框PdfCheckBoxField
组合框PdfComboBoxField
列表框PdfListBoxField
单选按钮PdfRadioButtonListField
普通按钮PdfButtonField
签名域PdfSignatureField

使用C# 创建PDF表单域

使用Free Spire.PDF制作表单域,需要先创建以上各表单域类的对象,然后通过 Bounds 属性设置表单域的位置和大小,最后再通过PdfFormFieldCollection.Add() 方法将表单域绘制到PDF页面指定位置处。

以下是如何在PDF中创建上述常见PDF表单域的C#代码:

using Spire.Pdf;
using Spire.Pdf.Actions;
using Spire.Pdf.Fields;
using Spire.Pdf.Graphics;
using System.Drawing;namespace CreateFillableFormsInPdf
{class Program{static void Main(string[] args){//创建PdfDocument对象PdfDocument pdf = new PdfDocument();//添加一页PdfPageBase page = pdf.Pages.Add();//初始化x、y坐标float baseX = 60;float baseY = 20;//创建两个画刷PdfSolidBrush brush1 = new PdfSolidBrush(new PdfRGBColor(Color.Brown));PdfSolidBrush brush2 = new PdfSolidBrush(new PdfRGBColor(Color.Black));//创建字体PdfTrueTypeFont font = new PdfTrueTypeFont(new Font("微软雅黑", 11f, FontStyle.Regular), true);//添加文本框 page.Canvas.DrawString("姓名:", font, brush1, new PointF(10, baseY));RectangleF tbxBounds = new RectangleF(baseX, baseY, 150, 18);PdfTextBoxField textBox = new PdfTextBoxField(page, "姓名");textBox.Bounds = tbxBounds;textBox.Font = font;pdf.Form.Fields.Add(textBox);baseY += 30;//添加两个复选框page.Canvas.DrawString("民族:", font, brush1, new PointF(10, baseY));RectangleF checkboxBound1 = new RectangleF(baseX, baseY, 15, 15);PdfCheckBoxField checkBoxField1 = new PdfCheckBoxField(page, "选项1");checkBoxField1.Bounds = checkboxBound1;checkBoxField1.Checked = false;page.Canvas.DrawString("汉族", font, brush2, new PointF(baseX + 20, baseY));RectangleF checkboxBound2 = new RectangleF(baseX + 70, baseY, 15, 15);PdfCheckBoxField checkBoxField2 = new PdfCheckBoxField(page, "选项2");checkBoxField2.Bounds = checkboxBound2;checkBoxField2.Checked = false;page.Canvas.DrawString("少数民族", font, brush2, new PointF(baseX + 90, baseY));pdf.Form.Fields.Add(checkBoxField1);pdf.Form.Fields.Add(checkBoxField2);baseY += 30;//添加列表框page.Canvas.DrawString("分公司:", font, brush1, new PointF(10, baseY));RectangleF listboxBound = new RectangleF(baseX, baseY, 150, 50);PdfListBoxField listBoxField = new PdfListBoxField(page, "分公司");listBoxField.Items.Add(new PdfListFieldItem("成都", "成都"));listBoxField.Items.Add(new PdfListFieldItem("武汉", "武汉"));listBoxField.Items.Add(new PdfListFieldItem("深圳", "深圳")); ;listBoxField.Bounds = listboxBound;listBoxField.Font = font;pdf.Form.Fields.Add(listBoxField);baseY += 60;//添加两个单选按钮page.Canvas.DrawString("性别:", font, brush1, new PointF(10, baseY));PdfRadioButtonListField radioButtonListField = new PdfRadioButtonListField(page, "性别");PdfRadioButtonListItem radioItem1 = new PdfRadioButtonListItem("选项1");RectangleF radioBound1 = new RectangleF(baseX, baseY, 15, 15);radioItem1.Bounds = radioBound1;page.Canvas.DrawString("男", font, brush2, new PointF(baseX + 20, baseY));PdfRadioButtonListItem radioItem2 = new PdfRadioButtonListItem("选项2");RectangleF radioBound2 = new RectangleF(baseX + 70, baseY, 15, 15);radioItem2.Bounds = radioBound2;page.Canvas.DrawString("女", font, brush2, new PointF(baseX + 90, baseY));radioButtonListField.Items.Add(radioItem1);radioButtonListField.Items.Add(radioItem2);pdf.Form.Fields.Add(radioButtonListField);baseY += 30;//添加组合框page.Canvas.DrawString("部门:", font, brush1, new PointF(10, baseY));RectangleF cmbBounds = new RectangleF(baseX, baseY, 150, 18);PdfComboBoxField comboBoxField = new PdfComboBoxField(page, "部门");comboBoxField.Bounds = cmbBounds;comboBoxField.Items.Add(new PdfListFieldItem("财务", "财务"));comboBoxField.Items.Add(new PdfListFieldItem("技术", "技术"));comboBoxField.Items.Add(new PdfListFieldItem("采购", "采购"));comboBoxField.Items.Add(new PdfListFieldItem("销售", "销售"));comboBoxField.Font = font;pdf.Form.Fields.Add(comboBoxField);baseY += 30;//添加签名域page.Canvas.DrawString("签名:", font, brush1, new PointF(10, baseY));PdfSignatureField sgnField = new PdfSignatureField(page, "签名域");RectangleF sgnBounds = new RectangleF(baseX, baseY, 150, 80);sgnField.Bounds = sgnBounds;pdf.Form.Fields.Add(sgnField);baseY += 90;//添加按钮page.Canvas.DrawString("按钮:", font, brush1, new PointF(10, baseY));RectangleF btnBounds = new RectangleF(baseX, baseY, 50, 18);PdfButtonField buttonField = new PdfButtonField(page, "按钮");buttonField.Bounds = btnBounds;buttonField.Text = "提交";buttonField.Font = font;PdfSubmitAction submitAction = new PdfSubmitAction("https://www.****.com");submitAction.DataFormat = SubmitDataFormat.Html;buttonField.Actions.MouseDown = submitAction;pdf.Form.Fields.Add(buttonField);//保存文件pdf.SaveToFile("PDF表单.pdf", FileFormat.PDF);}}
}

生成文件:

使用C# 填写PDF表单域

填充表单域需要先获取PDF中的所有表单字段,然后确定其表单类型,最后再填写数据或从预定列表中选择值。

以下是如何填充现有PDF表单域的C#代码:

using Spire.Pdf;
using Spire.Pdf.Fields;
using Spire.Pdf.Widget;namespace FillFormFields
{class Program{static void Main(string[] args){//加载PDF表单PdfDocument pdf = new PdfDocument();pdf.LoadFromFile("PDF表单.pdf");//获取文档中的表单PdfFormWidget form = (PdfFormWidget)pdf.Form;//获取表单域集合PdfFormFieldWidgetCollection formWidgetCollection = form.FieldsWidget;//遍历表单域for (int i = 0; i < formWidgetCollection.Count; i++){//获取指定域PdfField field = formWidgetCollection[i];//判断该表单域是否为文本框if (field is PdfTextBoxFieldWidget){if (field.Name == "姓名"){//填充文本PdfTextBoxFieldWidget textBoxField = (PdfTextBoxFieldWidget)field;textBoxField.Text = "张三";}}//判断该表单域是否为单选按钮if (field is PdfRadioButtonListFieldWidget){if (field.Name == "性别"){//为单选按钮选定一个值PdfRadioButtonListFieldWidget radioButtonListField = (PdfRadioButtonListFieldWidget)field;radioButtonListField.SelectedIndex = 0;}}//判断该表单域是否为组合框if (field is PdfComboBoxWidgetFieldWidget){if (field.Name == "部门"){//为组合框选定一个值PdfComboBoxWidgetFieldWidget comboBoxField = (PdfComboBoxWidgetFieldWidget)field;int[] index = { 1 };comboBoxField.SelectedIndex = index;}}//判断该表单域是否为复选框if (field is PdfCheckBoxWidgetFieldWidget){//设置复选框的"已选中"状态PdfCheckBoxWidgetFieldWidget checkBoxField = (PdfCheckBoxWidgetFieldWidget)field;switch (checkBoxField.Name){case "选项1":checkBoxField.Checked = true;break;}}//判断该表单域是否为列表框if (field is PdfListBoxWidgetFieldWidget){if (field.Name == "分公司"){//为列表框选定一个值PdfListBoxWidgetFieldWidget listBox = (PdfListBoxWidgetFieldWidget)field;int[] index = { 1 };listBox.SelectedIndex = index;}}}//保存文件pdf.SaveToFile("填充PDF表单域.pdf", FileFormat.PDF);}}
}

输出结果:

 

使用C# 删除PDF表单域

Free Spire.PDF支持通过索引或名称删除指定的表单域或删除所有表单域。

以下是如何删除PDF表单域的C#代码:

using Spire.Pdf;
using Spire.Pdf.Fields;
using Spire.Pdf.Widget;namespace RemoveFormFields
{class Program{static void Main(string[] args){//加载PDF表单PdfDocument pdf = new PdfDocument();pdf.LoadFromFile("PDF表单.pdf");//获取文档中的表单域PdfFormWidget formWidget = pdf.Form as PdfFormWidget;//遍历表单域for (int i = formWidget.FieldsWidget.List.Count - 1; i >= 0; i--){//获取指定表单域PdfField field = formWidget.FieldsWidget.List[i] as PdfField;//删除表单域formWidget.FieldsWidget.Remove(field);}//通过表单域名获取指定表单//PdfField field = formWidget.FieldsWidget["name"];//删除该表单域//formWidget.FieldsWidget.Remove(field);//保存PDF文件pdf.SaveToFile("删除PDF表单域.pdf");}}
}

以上代码演示了PDF表单的基本操作,包括添加文本框、复选框、组合框、单选按钮等各种常见的表单域,填写现有PDF表单,以及删除PDF表单。Free Spire.PDF免费库该支持其他多种PDF元素,点击查看更多示例。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/308771.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一些Github上开源的RAG 应用

我也是做RAG相关工作的。周末抽了一些时间&#xff0c;来看看开源的RAG技术能够做到什么程度。 其实我重点关注的是以下几点&#xff08;以下几个点是RAG提升的关键点&#xff09;&#xff1a; 这些开源技术他们是怎么做文档解析的&#xff08;有哪些我们可以借鉴的&#xff0c…

【漏洞复现】WordPress LayerSlider插件SQL注入漏洞复现

声明&#xff1a;亲爱的读者&#xff0c;我们诚挚地提醒您&#xff0c;Aniya网络安全的技术文章仅供个人研究学习参考。任何因传播或利用本实验室提供的信息而造成的直接或间接后果及损失&#xff0c;均由使用者自行承担责任。Aniya网络安全及作者对此概不负责。如有侵权&#…

标注平台工作流:如何提高训练数据质量与管理效率

世界发展日益依托数据的驱动&#xff0c;企业发现&#xff0c;管理不断增长的数据集却愈发困难。数据标注是诸多行业的一个关键过程&#xff0c;其中包括机器学习、计算机视觉和自然语言处理。对于大型语言模型&#xff08;LLM&#xff09;来说尤是如此&#xff0c;大型语言模型…

前端css笔记(pink老师)

css css书写顺序 自适应屏幕 html { width: 100%; height: 100%; display: table; } body { display: table-cell; } 用了这个方法以后&#xff0c;如果希望页面内的盒子也适应屏幕大小&#xff0c;则使用以下方法&#xff0c;会根据父亲的宽高计算出该盒子的宽高 width:xx%; …

JavaScript入门--变量

JavaScript入门--变量 一、JS变量二、变量命名三、常量四、局部变量 一、JS变量 定义变量a, b, c&#xff0c;并输出到控制台。 var a 1; var b 13.14; var c hello Js;console.log(a, b, c) //console.log()语句用于输出结果到控制台&#xff0c;类似python的print语句…

分布式存储系统Megastore

文章目录 说明设计目标及方案选择数据的分区和复制 数据模型照片共享服务数据模型实例Megastore索引Bigtable中存储情况 事务及并发控制Megastore提供的三种读Megastore的写操作完整的事务周期 Megastore基本架构快速读与快速写 核心技术之复制复制的日志数据读取数据写入协调者…

分布式系统架构中的相关概念

1.1、衡量网站的性能指标 响应时间&#xff1a;指执行一个请求从开始到最后收到响应数据所花费的总体时间。并发数&#xff1a;指系统同时能处理的请求数量。 并发连接数&#xff1a;指的是客户端向服务器发起请求&#xff0c;并建立了TCP连接。每秒钟服务器连接的总TCP数量请…

一款免费、开源、可批量识别的离线OCR软件,适用于 Windows7 x64及以上平台

免费&#xff1a;本项目所有代码开源&#xff0c;完全免费。方便&#xff1a;解压即用&#xff0c;离线运行&#xff0c;无需网络。高效&#xff1a;自带高效率的离线OCR引擎&#xff0c;内置多种语言识别库。灵活&#xff1a;支持命令行、HTTP接口等外部调用方式。功能&#x…

超越常规:用PHP抓取招聘信息

在人力资源管理方面&#xff0c;有效的数据采集可以为公司提供宝贵的人才洞察。通过分析招聘网站上的职位信息&#xff0c;人力资源专员可以了解市场上的人才供给情况&#xff0c;以及不同行业和职位的竞争状况。这样的数据分析有助于企业制定更加精准的招聘策略&#xff0c;从…

记录一个Kafka客户端Offset Explore连不上的问题

我昨天把集群重装了一下&#xff0c;再连这个工具就连不上了&#xff08;你先把zk和kafka在集群启起来&#xff09;&#xff0c;报错截图如下&#xff1a; 英文翻译过来大概就是说遍历zk指定路径不存在&#xff0c;我还以为zk的问题&#xff0c;回去又把zk的文档翻了一遍&#…

【AI基本模型】简化生成对抗网络 (GAN)

目录 一、说明 二、GAN的工作 三、如何手动计算生成对抗网络&#xff08;GAN&#xff09;&#xff1f;✍️ 四、GAN的应用 一、说明 生成对抗网络 &#xff08;GAN&#xff09; 是一种机器学习算法&#xff0c;可以生成与现实世界数据几乎无法区分的合成数据。它们的工作原理是…

【JSON2WEB】14 基于Amis的CRUD开发30分钟速成

【JSON2WEB】系列目录 【JSON2WEB】01 WEB管理信息系统架构设计 【JSON2WEB】02 JSON2WEB初步UI设计 【JSON2WEB】03 go的模板包html/template的使用 【JSON2WEB】04 amis低代码前端框架介绍 【JSON2WEB】05 前端开发三件套 HTML CSS JavaScript 速成 【JSON2WEB】06 JSO…

【Java探索之旅】方法重载 递归

&#x1f3a5; 屿小夏 &#xff1a; 个人主页 &#x1f525;个人专栏 &#xff1a; Java编程秘籍 &#x1f304; 莫道桑榆晚&#xff0c;为霞尚满天&#xff01; 文章目录 &#x1f4d1;前言一、方法重载1.1 为什么要有方法重载1.2 方法重载的概念与使用1.3 方法签名 二、递归2…

Go语言中如何正确使用 errgroup

不管是哪种编程语言,重新发明轮子都不是一个好主意。代码库重新实现如何启动多个goroutine并汇总错误也很常见。但是Go生态系统中的一个包旨在支持这种常见的用例。让我们来看看这个包并了解为什么它应该成为Go开发人员工具集的一部分。 golang.org/x是一个为标准库提供扩展的…

Disk Drill Enterprise for Mac v5.5.1515数据恢复软件中文版

Disk Drill 是 Mac 操作系统固有的Mac数据恢复软件&#xff1a;使用 Recovery Vault 轻松保护文件免遭意外删除&#xff0c;并从 Mac 磁盘恢复丢失的数据。支持大多数存储设备&#xff0c;文件类型和文件系统。 软件下载&#xff1a;Disk Drill Enterprise for Mac v5.5.1515激…

李廉洋;4.11#黄金,WTI原油#行情走势分析策略。

美国银行预计&#xff0c;在今天召开的欧洲央行会议上不会有重大的政策变化&#xff0c;但欧洲央行正逐渐接近开始降息&#xff0c;尽管它采取的是一种谨慎的、依赖数据的方式。虽然欧洲央行对降息轨迹的信心不断增强&#xff0c;但降息的具体速度和幅度仍未公布&#xff0c;而…

K8S node节点执行kubectl get pods报错

第一个问题是由第二个问题产生的&#xff0c;第二个问题也是最常见的 网上找的都是从master节点把文件复制过来&#xff0c;这样确实可以解决&#xff0c;但是麻烦&#xff0c;有一个node节点还好&#xff0c;如果有多个呢&#xff1f;每个都复制吗&#xff1f;下面是我从外网…

基于SSM的在线学习系统的设计与实现(论文+源码)_kaic

基于SSM的在线学习系统的设计与实现 摘要 随着信息互联网购物的飞速发展&#xff0c;一般企业都去创建属于自己的管理系统。本文介绍了在线学习系统的开发全过程。通过分析企业对于在线学习系统的需求&#xff0c;创建了一个计算机管理在线学习系统的方案。文章介绍了在线学习系…

访问者模式类图与代码

某图书管理系统中管理着两种类型的文献&#xff1a;图书和论文。现在要求统计所有馆藏文献的总页码(假设图书馆中有一本540页的图书和两篇各25页的论文&#xff0c;那么馆藏文献的总页码就是590页)。采用Visitor(访问者)模式实现该要求&#xff0c;得到如图7.16所示的类图。 访…

VS2015 自定义模板

VS2015 自定义模板 文章目录 VS2015 自定义模板写在前面自定义项目模板导出模板 更新模板vstemplate 文件元素修改参考 参考 写在前面 ​ VS自定义模板是为了&#xff0c;将一些习惯性、通用性的设置预先设置到项目中&#xff0c;再次创建项目时就不用重复设置相同的参数了。 …