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


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

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

    • 创建PDF表单域
    • 填写PDF表单域
    • 删除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元素,点击查看更多示例

  • 相关阅读:
    WebSocket 报java.io.IOException: 远程主机强迫关闭了一个现有的连接。
    (十)admin-boot项目之validation验证入参规则
    11-js事件基础
    一个插件帮你快速、免费下载两个网站的高清无水印LOGO!
    c++:三种实例化对象方式
    数据库(二)
    如何构建一台机器学习服务器
    电压源与电流源简介
    Java ByteArrayOutputStream.toString()方法具有什么功能呢?
    深入理解 Django 模板系统
  • 原文地址:https://www.cnblogs.com/Yesi/p/18150797