.NET平台用C#在PDF中创建可交互的表单域(Form Field)

在日常办公系统开发中,涉及 PDF 处理相关的开发时,生成可填写的 PDF 表单是一种常见需求,例如员工信息登记表、用户注册表、问卷调查或协议确认页等。与静态 PDF 不同,带有**表单域(Form Field)**的文档支持用户直接在 PDF 内部输入、勾选、选择等交互操作,极大提升了表单使用体验。

本文将介绍如何使用 C# 为 PDF 添加各种类型的表单域,包括文本框、下拉框、复选框、单选框、列表框和按钮,并通过完整示例演示如何将这些域组合成一个实际可用的表单页。

本文所使用的方法需要用到Free Spire.PDF for .NET,NuGet安装:PM> Install-Package FreeSpire.PDF


文章目录

    • 使用 PdfTextBoxField 添加文本输入域
    • 使用 PdfComboBoxField 添加下拉选择域
    • 使用 PdfCheckBoxField 添加复选框域
    • 综合示例:包含所有类型表单域的 PDF 表单
    • 表单域类型一览


使用 PdfTextBoxField 添加文本输入域

PdfTextBoxField 表示文本输入域,适用于姓名、地址、日期等自由输入内容。

PdfTextBoxField textBox = new PdfTextBoxField(page, "textBox");
textBox.Bounds = new RectangleF(100, 50, 150, 20);
textBox.Text = "Enter your name";
textBox.Font = new PdfFont(PdfFontFamily.Helvetica, 12f);
doc.Form.Fields.Add(textBox);

使用 PdfComboBoxField 添加下拉选择域

PdfComboBoxField 是用于显示可选列表的下拉框,适合性别、部门、国籍等字段。

PdfComboBoxField comboBox = new PdfComboBoxField(page, "comboBox");
comboBox.Bounds = new RectangleF(100, 110, 150, 20);
comboBox.Items.Add(new PdfListFieldItem("Option A", "A"));
comboBox.Items.Add(new PdfListFieldItem("Option B", "B"));
comboBox.Items.Add(new PdfListFieldItem("Option C", "C"));
comboBox.SelectedIndex = 0;
comboBox.Font = new PdfFont(PdfFontFamily.Helvetica, 12f);
doc.Form.Fields.Add(comboBox);

使用 PdfCheckBoxField 添加复选框域

PdfCheckBoxField 表示复选框,适用于“是否同意”、“是否接收通知”等二元布尔选项。

PdfCheckBoxField checkBox = new PdfCheckBoxField(page, "checkBox");
checkBox.Bounds = new RectangleF(100, 80, 15, 15);
checkBox.Checked = false;
doc.Form.Fields.Add(checkBox);

综合示例:包含所有类型表单域的 PDF 表单

以下代码创建了一个“用户信息登记表”,整合了所有常见表单域类型,包括文本框、下拉框、复选框、列表框、单选按钮和按钮。

using Spire.Pdf;
using Spire.Pdf.Actions;
using Spire.Pdf.Fields;
using Spire.Pdf.Graphics;
using System.Drawing;class Program
{static void Main(string[] args){// 创建文档和页面PdfDocument doc = new PdfDocument();PdfPageBase page = doc.Pages.Add();// 坐标和样式初始化float baseX = 100;float baseY = 30;PdfSolidBrush titleBrush = new PdfSolidBrush(new PdfRGBColor(Color.Blue));PdfSolidBrush labelBrush = new PdfSolidBrush(new PdfRGBColor(Color.Black));PdfFont font = new PdfFont(PdfFontFamily.Helvetica, 12f, PdfFontStyle.Regular);// 文本框page.Canvas.DrawString("TextBox:", font, titleBrush, new PointF(10, baseY));RectangleF textBoxBounds = new RectangleF(baseX, baseY, 150, 15);PdfTextBoxField textBox = new PdfTextBoxField(page, "textbox");textBox.Bounds = textBoxBounds;textBox.Text = "Hello World";textBox.Font = font;doc.Form.Fields.Add(textBox);baseY += 25;// 复选框page.Canvas.DrawString("CheckBox:", font, titleBrush, new PointF(10, baseY));RectangleF checkBox1Bounds = new RectangleF(baseX, baseY, 15, 15);PdfCheckBoxField checkBox1 = new PdfCheckBoxField(page, "checkbox1");checkBox1.Bounds = checkBox1Bounds;checkBox1.Checked = false;page.Canvas.DrawString("Option 1", font, labelBrush, new PointF(baseX + 20, baseY));RectangleF checkBox2Bounds = new RectangleF(baseX + 70, baseY, 15, 15);PdfCheckBoxField checkBox2 = new PdfCheckBoxField(page, "checkbox2");checkBox2.Bounds = checkBox2Bounds;checkBox2.Checked = false;page.Canvas.DrawString("Option 2", font, labelBrush, new PointF(baseX + 90, baseY));doc.Form.Fields.Add(checkBox1);doc.Form.Fields.Add(checkBox2);baseY += 25;// 下拉列表框page.Canvas.DrawString("ComboBox:", font, titleBrush, new PointF(10, baseY));RectangleF comboBoxBounds = new RectangleF(baseX, baseY, 150, 15);PdfComboBoxField comboBox = new PdfComboBoxField(page, "combobox");comboBox.Bounds = comboBoxBounds;comboBox.Items.Add(new PdfListFieldItem("Item 1", "item1"));comboBox.Items.Add(new PdfListFieldItem("Item 2", "item2"));comboBox.Items.Add(new PdfListFieldItem("Item 3", "item3"));comboBox.SelectedIndex = 0;comboBox.Font = font;doc.Form.Fields.Add(comboBox);baseY += 25;// 列表框page.Canvas.DrawString("ListBox:", font, titleBrush, new PointF(10, baseY));RectangleF listBoxBounds = new RectangleF(baseX, baseY, 150, 50);PdfListBoxField listBox = new PdfListBoxField(page, "listbox");listBox.Bounds = listBoxBounds;listBox.Items.Add(new PdfListFieldItem("Item 1", "item1"));listBox.Items.Add(new PdfListFieldItem("Item 2", "item2"));listBox.Items.Add(new PdfListFieldItem("Item 3", "item3"));listBox.SelectedIndex = 0;listBox.Font = font;doc.Form.Fields.Add(listBox);baseY += 60;// 单选按钮page.Canvas.DrawString("RadioButton:", font, titleBrush, new PointF(10, baseY));PdfRadioButtonListField radioGroup = new PdfRadioButtonListField(page, "radioGroup");PdfRadioButtonListItem radio1 = new PdfRadioButtonListItem("Option1");radio1.Bounds = new RectangleF(baseX, baseY, 15, 15);page.Canvas.DrawString("Option 1", font, labelBrush, new PointF(baseX + 20, baseY));PdfRadioButtonListItem radio2 = new PdfRadioButtonListItem("Option2");radio2.Bounds = new RectangleF(baseX + 70, baseY, 15, 15);page.Canvas.DrawString("Option 2", font, labelBrush, new PointF(baseX + 90, baseY));radioGroup.Items.Add(radio1);radioGroup.Items.Add(radio2);radioGroup.SelectedIndex = 0;doc.Form.Fields.Add(radioGroup);baseY += 25;// 签名域page.Canvas.DrawString("Signature Field:", font, titleBrush, new PointF(10, baseY));RectangleF signatureBounds = new RectangleF(baseX, baseY, 150, 80);PdfSignatureField signatureField = new PdfSignatureField(page, "signatureField");signatureField.Bounds = signatureBounds;doc.Form.Fields.Add(signatureField);baseY += 90;// 按钮page.Canvas.DrawString("Button:", font, titleBrush, new PointF(10, baseY));RectangleF buttonBounds = new RectangleF(baseX, baseY, 50, 15);PdfButtonField button = new PdfButtonField(page, "submitButton");button.Bounds = buttonBounds;button.Text = "Submit";button.Font = font;PdfSubmitAction submitAction = new PdfSubmitAction("https://www.google.com/");submitAction.DataFormat = SubmitDataFormat.Html;button.Actions.MouseDown = submitAction;doc.Form.Fields.Add(button);// 保存文档doc.SaveToFile("FillableForm.pdf", FileFormat.PDF);doc.Close();}
}

创建结果
C#创建PDF表单域


表单域类型一览

表单域类型说明
PdfTextBoxField文本输入域,用户可键入任意内容
PdfCheckBoxField勾选框,可用于二选一逻辑判断
PdfComboBoxField下拉选择域,提供固定选项
PdfListBoxField多项列表,可启用多选模式
PdfRadioButtonListField单选按钮组,用户仅能选一项
PdfButtonField按钮,可设定执行特定操作

通过以上方式,开发者可以快速构建结构清晰、功能完备的 PDF 表单,实现用户信息采集、文档自动化交互等多种应用场景。

更多内容请参考:Spire.PDF 官方文档

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

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

相关文章

在macOS上安装windows系统

使用Boot Camp 1. 准备工作:确认Mac满足Boot Camp系统要求,准备好Windows安装光盘或ISO映像文件,以及一个至少8GB的空白USB闪存驱动器用于保存驱动程序。 2. 打开Boot Camp助理:在“应用程序”文件夹的“实用工具”中找到“Boot…

683SJBH基于J2EE的广州旅游管理系统

第1章  绪论 课题背景 自互联网internet成为一种革命性的大众媒体以来,其发展速度之快令人惊叹。而作为世界最大朝阳产业的旅游,当它与电子商务这一新兴模式相结合时,其潜藏的商业价值表露无遗。根据CNN(美国有线电视新闻网&…

前端面试每日三题 - Day 27

这是我为准备前端/全栈开发工程师面试整理的第27天每日三题练习,涵盖了: CSS选择器的优先级与权重计算机制Angular中的依赖注入(Dependency Injection)机制设计一个支持实时协作编辑(如Google Docs)的前端…

PostgreSQL数据库操作SQL

数据库操作SQL 创建 创建数据库 create database db_test;创建并指定相关参数 with owner : 所有者encoding : 编码connection limit :连接限制 create database db_test1 with owner postgresencoding utf-8connection limit 100;修改 修改数据库名称 renam…

JSP HTTP 状态码详解

JSP HTTP 状态码详解 引言 HTTP 状态码是 HTTP 协议的一部分,用于表示客户端与服务器之间请求与响应的状态。在 JavaServer Pages (JSP) 技术中,HTTP 状态码同样扮演着重要的角色。本文将详细解析 JSP 中的 HTTP 状态码,帮助开发者更好地理解和应用这些状态码。 HTTP 状态…

文件一键解密软件工具(支持pdf、word、excel、ppt、rar、zip格式文件)

一键解密解锁神器支持解密pdf、doc、docx、xls、xlsx、ppt、pptx、rar、zip格式文件,Excel表格、Word文档、PPT演示、RAR、ZIP压缩包、PDF文档一键轻松解密!简单/高效/安全。这款软件由密码帝官方提供,确保了其合法性和安全性,用户…

Banana Pi BPI-CM6 是一款八核 RISC-V 模块,兼容 Raspberry Pi CM 载板

Banana Pi BPI-CM6 是一款 SpacemIT K1 八核 RISC-V 系统级模块,遵循 Raspberry Pi CM5 的设计,并提供高达 16GB LPDDR4 RAM、高达 128GB eMMC 闪存、千兆以太网控制器和 WiFi 6 蓝牙 5.2 模块。 BPI-CM6 虽然与 Raspberry Pi CM5 基本兼容&#xff0c…

【项目篇之统一硬盘操作】仿照RabbitMQ模拟实现消息队列

统一硬盘操作 创建出实例封装交换机的操作封装队列的操作封装绑定的操作封装消息的操作总的完整代码: 我们之前已经使用了数据库去管理交换机,绑定,队列 还使用了数据文件去管理消息 此时我们就搞一个类去把上述两个部分都整合在一起&#…

快速上手SpringBoot开发指南

文章目录 1. 项目整体架构2. SpringBoot核心注解详解2.1 应用程序入口注解SpringBootApplication 2.2 控制器层注解RestControllerRequestMappingPostMappingRequestBody 2.3 服务层注解ServiceAutowired 2.4 数据访问层注解Repository 2.5 实体类注解JPA相关注解Lombok注解 3.…

Unity WebGL、js发布交互

官网参考 Unity3D开发之WebGL平台上 unity和js前端通信交互 WebFun.jslib mergeInto(LibraryManager.library, {JSLog: function (str) { var strsUTF8ToString(str); Log(str); Log(strs);}, Hello: function () {var strs"Hello, world!"; Log(strs); Log(UTF8ToS…

Spark 之 YarnCoarseGrainedExecutorBackend

YarnCoarseGrainedExecutorBackend executor ID , 在日志里也有体现。 25/05/06 12:41:58 INFO YarnCoarseGrainedExecutorBackend: Successfully registered with driver 25/05

[HOT 100] 2646. 最小化旅行的价格总和

文章目录 1. 题目链接2. 题目描述3. 题目示例4. 解题思路5. 题解代码6. 复杂度分析 1. 题目链接 2646. 最小化旅行的价格总和 - 力扣(LeetCode) 2. 题目描述 现有一棵无向、无根的树,树中有 n 个节点,按从 0 到 n - 1 编号。给你一…

分析 Docker 磁盘占用

以下是分析 Docker 磁盘占用的详细步骤和工具指南,帮助开发者快速定位和清理冗余数据: 1. 查看 Docker 磁盘使用概览 docker system df 输出说明: TYPE TOTAL ACTIVE SIZE RECLAIMABLE Images 15 …

聊一聊接口测试中的参数化测试

目录 一、核心概念 二、适用场景 三、参数化测试的核心目的 四、实现参数化测试的关键步骤 4.1 定义测试数据 4.2 使用测试框架参数化功能 4.3 执行测试与结果分析 五、最佳实践与注意事项 六、工具推荐 那参数化测试的目的是什么?应该是为了提高测试覆盖率…

Go语言——string、数组、切片以及map

一、string、数组、切片代码 package mainimport "fmt"// 定义结构体 type student struct {id intname stringage intscore float32 }func main() {// 使用var声明切片var slice1 []intslice1 append(slice1, 1)slice1 append(slice1, 2)slice1 append(sl…

Android 开发中JDK 的使用和配置详解

前些天发现了一个蛮有意思的人工智能学习网站,8个字形容一下"通俗易懂,风趣幽默",感觉非常有意思,忍不住分享一下给大家。 👉点击跳转到教程 在安卓开发中, 我们会使用到Java的JDK, JDK全程为(Java Development Kit)意思是:Java开发工具包。那么JDK 与我们的…

MPay码支付系统第四方聚合收款码多款支付插件个人免签支付源码TP8框架全开源

一、源码描述 这是一套码支付源码(MPay),基于TP8框架,前端layui2.9后端PearAdmin,专注于个人免签收款,通过个人的普通收款码,即可实现收款通知自动回调,支持绝大多数商城系统&#…

国产数据库铸就数字基建新基石,助力农业产业转型升级

中国科技企业以自主创新突破技术壁垒,为全球产业链重构注入新动能。广东辰宜信息科技有限公司(以下简称“辰宜科技”)凭借自主研发的“博流分布式多模数据库”等核心技术,作为支持数据流通的关键技术支撑,实现中国基础…

《人工智能:如何重塑教育模式与学习图景》

《人工智能:如何重塑教育模式与学习图景》 引言 人工智能,特别是大型语言模型(如GPT-4/ChatGPT),正以前所未有的速度影响教育领域。从基础教育到高等教育,再到职业教育,传统教学模式正在被重新审…

硬件工程师面试常见问题(14)

第六十六问:运放--输入偏置电流和输入失调电流 输入偏置电流lb:是由于运放两个输入极都有漏电流的存在。实际的运放,会有电流流入运放的输入端的。那么输入偏置电流就定义这两个电流的平均值。 输入失调电流 Ios:定义为两个差分输入端偏置电…