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

news2025/6/24 16:23:03

通常情况下,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.coloradmin.cn/o/1584410.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【软件工程】UML用例图介绍和实例说明

文章目录 1、什么是用例图2、用例图的作用3、怎么画用例图4、三要素说明5、实例说明 1、什么是用例图 用例图&#xff08;Use Case Diagram&#xff09;是统一建模语言&#xff08;UML&#xff09;的一种图&#xff0c;它主要用于描述系统的功能和用户&#xff08;参与者&…

elementui树形组件自定义高亮颜色

1、需求描述&#xff1a;点击按钮切换树形的章节&#xff0c;同时高亮 2、代码实现 1&#xff09;style样式添加 <style> .el-tree--highlight-current .el-tree-node.is-current > .el-tree-node__content {background-color: #81d3f8 !important; //高亮颜色colo…

微信小程序实现输入appid跳转其他小程序

前言 本文记录wx.navigateToMiniProgram打开另一个小程序API使用方法&#xff0c;并封装为组件。 wxml 部分 输入框用来记录appid&#xff0c;按钮用来查询并跳转。 <view class"container"><input class"input" placeholder"请输入要查…

Flutter第七弹 网格列表GridView

1) Flutter提供了网格列表&#xff0c;怎么设置列数&#xff1f; 2&#xff09;怎么初始化每个列表项Item&#xff1f; 一、GridView简介 Flutter也存在网格列表组建GridView&#xff0c;用于展示多行多列的列表。 1.1 GridView构建 采用GridView.count() 进行构建 1.2 Gr…

基于激光雷达点云(lidar)的目标检测方法之BEV

基于激光雷达点云&#xff08;lidar&#xff09;的目标检测方法之BEV 附赠自动驾驶学习资料和量产经验&#xff1a;链接 基于lidar的目标检测方法可以分成3个部分&#xff1a;lidar representation&#xff0c;network backbone&#xff0c;detection head&#xff0c;如下图所…

LeetCode - 1702. 修改后的最大二进制字符串

文章目录 解析AC CODE 题目链接&#xff1a;LeetCode - 1702. 修改后的最大二进制字符串 解析 详细题解&#xff1a;贪心&#xff0c;简洁写法&#xff08;Python/Java/C/Go/JS/Rust&#xff09; 思路很牛b。 简单来说我们需要想办法将0配对&#xff0c;将其变为10&#xff0…

3D室内装潢设计 Sweet Home 3D for Mac 中文直装版

Sweet Home 3D 是一款非常棒的家装辅助设计软件&#xff0c;支持包括中文在内的16中语言&#xff0c;它能帮您通过二维的家居平面图来设计和布置您的家具,还可以用三维的视角浏览整个装修布局的全貌。是一款操作起来简单方便&#xff0c;使用起来快捷、迅速&#xff0c;拥有超高…

【C++题解】1005 - 已知一个圆的半径,求解该圆的面积和周长

问题&#xff1a;1005 - 已知一个圆的半径&#xff0c;求解该圆的面积和周长 类型&#xff1a;基础问题、小数运算 题目描述&#xff1a; 已知一个圆的半径&#xff0c;求解该圆的面积和周长。 输入&#xff1a; 输入只有一行&#xff0c;只有 1 个整数。 输出&#xff1a…

图像生成:Pytorch实现一个简单的对抗生成网络模型

图像生成&#xff1a;Pytorch实现一个简单的对抗生成网络模型 前言相关介绍具体步骤准备并读取数据集定义生成器定义判别器定义损失函数定义优化器开始训练完整代码 训练生成的图片 前言 由于本人水平有限&#xff0c;难免出现错漏&#xff0c;敬请批评改正。更多精彩内容&…

RTSP/Onvif视频安防监控平台EasyNVR调用接口返回匿名用户名和密码的原因排查

视频安防监控平台EasyNVR可支持设备通过RTSP/Onvif协议接入&#xff0c;并能对接入的视频流进行处理与多端分发&#xff0c;包括RTSP、RTMP、HTTP-FLV、WS-FLV、HLS、WebRTC等多种格式。平台拓展性强、支持二次开发与集成&#xff0c;可应用在景区、校园、水利、社区、工地等场…

坚持十天做完Python入门编程100题第三天加班

坚持十天做完Python入门编程100题第三天加班 第24题 扫描文件列表第25题 如何将字典转换成JSON并写入json文件&#xff1f;第26题 JSON转换成字典 第24题 扫描文件列表 如何扫描当前目录下的文件列表&#xff1f;解析&#xff1a;可以使用python内置的glob模块&#xff0c;用法…

C++设计模式:单例模式(十)

1、单例设计模式 单例设计模式&#xff0c;使用的频率比较高&#xff0c;整个项目中某个特殊的类对象只能创建一个 并且该类只对外暴露一个public方法用来获得这个对象。 单例设计模式又分懒汉式和饿汉式&#xff0c;同时对于懒汉式在多线程并发的情况下存在线程安全问题 饿汉…

《深入Linux内核架构》第2章 进程管理和调度 (2)

目录 2.4 进程管理相关的系统调用 2.4.1 进程复制 2.4.2 内核线程 2.4.3 启动新程序 2.4.4 退出进程 本专栏文章将有70篇左右&#xff0c;欢迎关注&#xff0c;订阅后续文章。 2.4 进程管理相关的系统调用 2.4.1 进程复制 1. _do_fork函数 fork vfork clone都最终调用_…

微信小程序转盘抽奖

场景&#xff1a; 在微信小程序里面开展抽奖活动使用转盘抽奖&#xff1b;类似下图&#xff08;图片来自百度&#xff09; 方法&#xff1a; 使用lukcy-canvas组件 在 微信小程序 中使用 | 基于 Js / TS / Vue / React / 微信小程序 / uni-app / Taro 的【大转盘 & 九宫…

【Qt踩坑】ARM 编译Qt5.14.2源码-QtWebEngine

1.下载源码 下载网站&#xff1a;Index of /new_archive/qt/5.14/5.14.2/single 2.QWebEngine相关依赖 sudo apt-get install flex libicu-dev libxslt-dev sudo apt-get install libssl-dev libxcursor-dev libxcomposite-dev libxdamage-dev libxrandr-dev sudo apt-get …

dyld: Library not loaded: @rpath/SDK.framework/SDK错误问题

关于导入三方SDK.framework之后&#xff0c;启动崩溃之后如下报错的解决方式: 截屏2020-10-14 上午9.55.09.png 在正常导入framework之后&#xff0c;做如图示操作&#xff0c; image.png 以上步骤之后&#xff0c;重新启动运行xcode&#xff0c;即可成功运行。

Harmony鸿蒙南向驱动开发-PIN

PIN即管脚控制器&#xff0c;用于统一管理各SoC的管脚资源&#xff0c;对外提供管脚复用功能。 基本概念 PIN是一个软件层面的概念&#xff0c;目的是为了统一对各SoC的PIN管脚进行管理&#xff0c;对外提供管脚复用功能&#xff0c;配置PIN管脚的电气特性。 SoC&#xff08;…

ChatGPT在地学,自然科学等了领域应用教程

原文链接&#xff1a;ChatGPT在地学&#xff0c;自然科学等了领域应用教程https://mp.weixin.qq.com/s?__bizMzUzNTczMDMxMg&mid2247600722&idx2&sn291ea8c935b1d9b1459170baa9057053&chksmfa820bb5cdf582a39086e5ee9596ab020784fa78ac7dc49ced4969e28817c3f0…

MAC: 自己制作https的ssl证书(自己签发免费ssl证书)(OPENSSL生成SSL自签证书)

MAC: 自己制作https的ssl证书(自己签发免费ssl证书)(OPENSSL生成SSL自签证书) 前言 现在https大行其道, ssl又是必不可少的环节. 今天就教大家用开源工具openssl自己生成ssl证书的文件和私钥 环境 MAC电脑 openssl工具自行搜索安装 正文 1、终端执行命令 //生成rsa私钥&…

探索艺术的新领域——3D线上艺术馆如何改变艺术作品的传播方式

在数字化时代的浪潮下&#xff0c;3D线上艺术馆成为艺术家们展示和传播自己作品的新平台。不仅突破了地域和物理空间的限制&#xff0c;还提供了全新的互动体验。 一、无界限的展示空间&#xff1a;艺术家的新展示平台 3D线上艺术馆通过数字化技术&#xff0c;为艺术家提供了一…