通常情况下,pdf文件是不可编辑的,但pdf表单提供了一些可编辑区域,允许用户填写和提交信息。pdf表单通常用于收集信息、反馈或进行在线申请,是许多行业中数据收集和交换的重要工具。
pdf表单可以包含各种类型的输入控件,如文本框、复选框、下拉菜单、单选按钮等。本文将介绍如何使用c# 和一个免费.net库来操作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");
}
}
}以上就是c#进行pdf表单域的创建填写与删除操作的详细内容,更多关于c# pdf表单域操作的资料请关注代码网其它相关文章!
发表评论