通常情況下,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元素,點選檢視更多示例。