翼度科技»论坛 编程开发 .net 查看内容

使用C# 创建、填写、删除PDF表单域

8

主题

8

帖子

24

积分

新手上路

Rank: 1

积分
24
通常情况下,PDF文件是不可编辑的,但PDF表单提供了一些可编辑区域,允许用户填写和提交信息。PDF表单通常用于收集信息、反馈或进行在线申请,是许多行业中数据收集和交换的重要工具。
PDF表单可以包含各种类型的输入控件,如文本框、复选框、下拉菜单、单选按钮等。本文将介绍如何使用C# 和一个免费.NET库来操作PDF表单,包括以下三个示例:

  • 创建PDF表单域
  • 填写PDF表单域
  • 删除PDF表单域
安装免费.NET PDF库Free Spire.PDF for .NET (可通过 NuGet安装,或下载后手动引用dll)
  1. 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#代码:

  1. using Spire.Pdf;
  2. using Spire.Pdf.Actions;
  3. using Spire.Pdf.Fields;
  4. using Spire.Pdf.Graphics;
  5. using System.Drawing;
  6. namespace CreateFillableFormsInPdf
  7. {
  8.     class Program
  9.     {
  10.         static void Main(string[] args)
  11.         {
  12.             //创建PdfDocument对象
  13.             PdfDocument pdf = new PdfDocument();
  14.             //添加一页
  15.             PdfPageBase page = pdf.Pages.Add();
  16.             //初始化x、y坐标
  17.             float baseX = 60;
  18.             float baseY = 20;
  19.             //创建两个画刷
  20.             PdfSolidBrush brush1 = new PdfSolidBrush(new PdfRGBColor(Color.Brown));
  21.             PdfSolidBrush brush2 = new PdfSolidBrush(new PdfRGBColor(Color.Black));
  22.             //创建字体
  23.             PdfTrueTypeFont font = new PdfTrueTypeFont(new Font("微软雅黑", 11f, FontStyle.Regular), true);
  24.             //添加文本框
  25.             page.Canvas.DrawString("姓名:", font, brush1, new PointF(10, baseY));
  26.             RectangleF tbxBounds = new RectangleF(baseX, baseY, 150, 18);
  27.             PdfTextBoxField textBox = new PdfTextBoxField(page, "姓名");
  28.             textBox.Bounds = tbxBounds;
  29.             textBox.Font = font;
  30.             pdf.Form.Fields.Add(textBox);
  31.             baseY += 30;
  32.             //添加两个复选框
  33.             page.Canvas.DrawString("民族:", font, brush1, new PointF(10, baseY));
  34.             RectangleF checkboxBound1 = new RectangleF(baseX, baseY, 15, 15);
  35.             PdfCheckBoxField checkBoxField1 = new PdfCheckBoxField(page, "选项1");
  36.             checkBoxField1.Bounds = checkboxBound1;
  37.             checkBoxField1.Checked = false;
  38.             page.Canvas.DrawString("汉族", font, brush2, new PointF(baseX + 20, baseY));
  39.             RectangleF checkboxBound2 = new RectangleF(baseX + 70, baseY, 15, 15);
  40.             PdfCheckBoxField checkBoxField2 = new PdfCheckBoxField(page, "选项2");
  41.             checkBoxField2.Bounds = checkboxBound2;
  42.             checkBoxField2.Checked = false;
  43.             page.Canvas.DrawString("少数民族", font, brush2, new PointF(baseX + 90, baseY));
  44.             pdf.Form.Fields.Add(checkBoxField1);
  45.             pdf.Form.Fields.Add(checkBoxField2);
  46.             baseY += 30;
  47.             //添加列表框
  48.             page.Canvas.DrawString("分公司:", font, brush1, new PointF(10, baseY));
  49.             RectangleF listboxBound = new RectangleF(baseX, baseY, 150, 50);
  50.             PdfListBoxField listBoxField = new PdfListBoxField(page, "分公司");
  51.             listBoxField.Items.Add(new PdfListFieldItem("成都", "成都"));
  52.             listBoxField.Items.Add(new PdfListFieldItem("武汉", "武汉"));
  53.             listBoxField.Items.Add(new PdfListFieldItem("深圳", "深圳")); ;
  54.             listBoxField.Bounds = listboxBound;
  55.             listBoxField.Font = font;
  56.             pdf.Form.Fields.Add(listBoxField);
  57.             baseY += 60;
  58.             //添加两个单选按钮
  59.             page.Canvas.DrawString("性别:", font, brush1, new PointF(10, baseY));
  60.             PdfRadioButtonListField radioButtonListField = new PdfRadioButtonListField(page, "性别");
  61.             PdfRadioButtonListItem radioItem1 = new PdfRadioButtonListItem("选项1");
  62.             RectangleF radioBound1 = new RectangleF(baseX, baseY, 15, 15);
  63.             radioItem1.Bounds = radioBound1;
  64.             page.Canvas.DrawString("男", font, brush2, new PointF(baseX + 20, baseY));
  65.             PdfRadioButtonListItem radioItem2 = new PdfRadioButtonListItem("选项2");
  66.             RectangleF radioBound2 = new RectangleF(baseX + 70, baseY, 15, 15);
  67.             radioItem2.Bounds = radioBound2;
  68.             page.Canvas.DrawString("女", font, brush2, new PointF(baseX + 90, baseY));
  69.             radioButtonListField.Items.Add(radioItem1);
  70.             radioButtonListField.Items.Add(radioItem2);
  71.             pdf.Form.Fields.Add(radioButtonListField);
  72.             baseY += 30;
  73.             //添加组合框
  74.             page.Canvas.DrawString("部门:", font, brush1, new PointF(10, baseY));
  75.             RectangleF cmbBounds = new RectangleF(baseX, baseY, 150, 18);
  76.             PdfComboBoxField comboBoxField = new PdfComboBoxField(page, "部门");
  77.             comboBoxField.Bounds = cmbBounds;
  78.             comboBoxField.Items.Add(new PdfListFieldItem("财务", "财务"));
  79.             comboBoxField.Items.Add(new PdfListFieldItem("技术", "技术"));
  80.             comboBoxField.Items.Add(new PdfListFieldItem("采购", "采购"));
  81.             comboBoxField.Items.Add(new PdfListFieldItem("销售", "销售"));
  82.             comboBoxField.Font = font;
  83.             pdf.Form.Fields.Add(comboBoxField);
  84.             baseY += 30;
  85.             //添加签名域
  86.             page.Canvas.DrawString("签名:", font, brush1, new PointF(10, baseY));
  87.             PdfSignatureField sgnField = new PdfSignatureField(page, "签名域");
  88.             RectangleF sgnBounds = new RectangleF(baseX, baseY, 150, 80);
  89.             sgnField.Bounds = sgnBounds;
  90.             pdf.Form.Fields.Add(sgnField);
  91.             baseY += 90;
  92.             //添加按钮
  93.             page.Canvas.DrawString("按钮:", font, brush1, new PointF(10, baseY));
  94.             RectangleF btnBounds = new RectangleF(baseX, baseY, 50, 18);
  95.             PdfButtonField buttonField = new PdfButtonField(page, "按钮");
  96.             buttonField.Bounds = btnBounds;
  97.             buttonField.Text = "提交";
  98.             buttonField.Font = font;
  99.             PdfSubmitAction submitAction = new PdfSubmitAction("https://www.****.com");
  100.             submitAction.DataFormat = SubmitDataFormat.Html;
  101.             buttonField.Actions.MouseDown = submitAction;
  102.             pdf.Form.Fields.Add(buttonField);
  103.             //保存文件
  104.             pdf.SaveToFile("PDF表单.pdf", FileFormat.PDF);
  105.         }
  106.     }
  107. }
复制代码
生成文件:

 
使用C# 填写PDF表单域

填充表单域需要先获取PDF中的所有表单字段,然后确定其表单类型,最后再填写数据或从预定列表中选择值。
以下是如何填充现有PDF表单域的C#代码:
  1. using Spire.Pdf;
  2. using Spire.Pdf.Fields;
  3. using Spire.Pdf.Widget;
  4. namespace FillFormFields
  5. {
  6.     class Program
  7.     {
  8.         static void Main(string[] args)
  9.         {
  10.             //加载PDF表单
  11.             PdfDocument pdf = new PdfDocument();
  12.             pdf.LoadFromFile("PDF表单.pdf");
  13.             //获取文档中的表单
  14.             PdfFormWidget form = (PdfFormWidget)pdf.Form;
  15.             //获取表单域集合
  16.             PdfFormFieldWidgetCollection formWidgetCollection = form.FieldsWidget;
  17.             //遍历表单域
  18.             for (int i = 0; i < formWidgetCollection.Count; i++)
  19.             {
  20.                 //获取指定域
  21.                 PdfField field = formWidgetCollection[i];
  22.                 //判断该表单域是否为文本框
  23.                 if (field is PdfTextBoxFieldWidget)
  24.                 {
  25.                     if (field.Name == "姓名")
  26.                     {
  27.                         //填充文本
  28.                         PdfTextBoxFieldWidget textBoxField = (PdfTextBoxFieldWidget)field;
  29.                         textBoxField.Text = "张三";
  30.                     }
  31.                 }
  32.                 //判断该表单域是否为单选按钮
  33.                 if (field is PdfRadioButtonListFieldWidget)
  34.                 {
  35.                     if (field.Name == "性别")
  36.                     {
  37.                         //为单选按钮选定一个值
  38.                         PdfRadioButtonListFieldWidget radioButtonListField = (PdfRadioButtonListFieldWidget)field;
  39.                         radioButtonListField.SelectedIndex = 0;
  40.                     }
  41.                 }
  42.                 //判断该表单域是否为组合框
  43.                 if (field is PdfComboBoxWidgetFieldWidget)
  44.                 {
  45.                     if (field.Name == "部门")
  46.                     {
  47.                         //为组合框选定一个值
  48.                         PdfComboBoxWidgetFieldWidget comboBoxField = (PdfComboBoxWidgetFieldWidget)field;
  49.                         int[] index = { 1 };
  50.                         comboBoxField.SelectedIndex = index;
  51.                     }
  52.                 }
  53.                 //判断该表单域是否为复选框
  54.                 if (field is PdfCheckBoxWidgetFieldWidget)
  55.                 {
  56.                     //设置复选框的"已选中"状态
  57.                     PdfCheckBoxWidgetFieldWidget checkBoxField = (PdfCheckBoxWidgetFieldWidget)field;
  58.                     switch (checkBoxField.Name)
  59.                     {
  60.                         case "选项1":
  61.                             checkBoxField.Checked = true;
  62.                             break;
  63.                     }
  64.                 }
  65.                 //判断该表单域是否为列表框
  66.                 if (field is PdfListBoxWidgetFieldWidget)
  67.                 {
  68.                     if (field.Name == "分公司")
  69.                     {
  70.                         //为列表框选定一个值
  71.                         PdfListBoxWidgetFieldWidget listBox = (PdfListBoxWidgetFieldWidget)field;
  72.                         int[] index = { 1 };
  73.                         listBox.SelectedIndex = index;
  74.                     }
  75.                 }
  76.             }
  77.             //保存文件
  78.             pdf.SaveToFile("填充PDF表单域.pdf", FileFormat.PDF);
  79.         }
  80.     }
  81. }
复制代码
输出结果:

 
使用C# 删除PDF表单域

Free Spire.PDF支持通过索引或名称删除指定的表单域或删除所有表单域。
以下是如何删除PDF表单域的C#代码:
  1. using Spire.Pdf;
  2. using Spire.Pdf.Fields;
  3. using Spire.Pdf.Widget;
  4. namespace RemoveFormFields
  5. {
  6.     class Program
  7.     {
  8.         static void Main(string[] args)
  9.         {
  10.             //加载PDF表单
  11.             PdfDocument pdf = new PdfDocument();
  12.             pdf.LoadFromFile("PDF表单.pdf");
  13.             //获取文档中的表单域
  14.             PdfFormWidget formWidget = pdf.Form as PdfFormWidget;
  15.             //遍历表单域
  16.             for (int i = formWidget.FieldsWidget.List.Count - 1; i >= 0; i--)
  17.             {
  18.                 //获取指定表单域
  19.                 PdfField field = formWidget.FieldsWidget.List[i] as PdfField;
  20.                 //删除表单域
  21.                 formWidget.FieldsWidget.Remove(field);
  22.             }
  23.             //通过表单域名获取指定表单
  24.             //PdfField field = formWidget.FieldsWidget["name"];
  25.             //删除该表单域
  26.             //formWidget.FieldsWidget.Remove(field);
  27.             //保存PDF文件
  28.             pdf.SaveToFile("删除PDF表单域.pdf");
  29.         }
  30.     }
  31. }
复制代码
 
 
 
以上代码演示了PDF表单的基本操作,包括添加文本框、复选框、组合框、单选按钮等各种常见的表单域,填写现有PDF表单,以及删除PDF表单。Free Spire.PDF免费库该支持其他多种PDF元素,点击查看更多示例

来源:https://www.cnblogs.com/Yesi/p/18150797
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具