本文主要介紹了C# 在PDF中建立和填充域的相關知識。具有很好的參考價值,以下跟著小編一起來看下吧
眾所周知,PDF文件通常是無法編輯和修改的。如果使用者需要在PDF文件中簽名或填寫其他內容時,就需要PDF文件中有可編輯的網域。開發者也經常會遇到將資料以程式的方式填入PDF模板域的需求。這時候就需要解決以下兩個問題:
如何在PDF中建立可編輯的網域?
如何將內容準確地填入這些網域中?
這裡我將介紹怎麼使用C#和Free Spire.PDF元件來實現這項功能。
Free Spire.PDF元件概述
Free Spire.PDF是一個免費專業的PDF元件,用於在.NET應用程式中創建,編輯,處理和閱讀PDF文件。支援豐富的PDF文件處理操作,如PDF文件合併/分割、轉換(如HTML轉PDF,PDF轉圖片等)、列印(包括靜默列印)、壓縮、新增註解、安全設定(包括數位簽章)、創建與填充域、圖片插入與擷取、文字擷取與高亮等。不依賴Adobe Acrobat,支援中文。
關於安裝,有許多種管道,包括官網以及開發者最喜歡和常用的NuGet方式。在Visual Studio的NuGet Package Manager Console中輸入下列PowerShell指令回車,元件的dll就會自動地引用到專案中:
##PM> Install-Package FreeSpire.PDF
#建立與填滿域的實作
1.建立域
該元件提供了許多對應的類,透過這些類別我們可以建立多種PDF域。因為種類比較多,所以下面我只列出了一些常見的域和該域在元件中所對應的類別名稱。網域 | #類別名稱 |
文字域 | PdfTextBoxField |
##PdfSignatureField | |
複選框 | #PdfCheckBoxField |
組合方塊 |
PdfComboBoxField |
PdfListBoxField |
這裡我選取PDF文件中最常見的兩種可編輯域進行介紹:文字域和簽名域。
1.1 文字網域
首先,我建立了一個簡單的文字網域。在創建的時候需要指定域的名稱,這樣做的好處在於,如果文檔中同時存在多個文本域,當我們以編程的方式填寫域的時候,可以根據域的名稱快速準確地將內容填寫到指定的域中。要注意的是網域名稱不要重複,否則會將內容填入該網域對應的所有網域。
//创建PDF文档 PdfDocument pdf = new PdfDocument(); //添加一个新页面 PdfPageBase page = pdf.Pages.Add(PdfPageSize.A4, new PdfMargins()); //添加文本到页面 PdfTrueTypeFont font = new PdfTrueTypeFont(new Font("Arial Unicode MS", 10f), true); page.Canvas.DrawString("年龄:", font, PdfBrushes.DeepSkyBlue, 10, 50); //创建文本域并指定文本域的名称 PdfTextBoxField textbox = new PdfTextBoxField(page, "Age"); //设置文本域的大小、位置、字体 textbox.Bounds = new RectangleF(40, 50, 50, 12); textbox.Font = font; //添加文本域到文档 pdf.Form.Fields.Add(textbox); //保存文档 pdf.SaveToFile("Fields.pdf");
當然多數時候我們的需求可能不只創建一個簡單的文字域,還需要做一些其他設置,如設定邊框、背景色、字體顏色、字體排列方式。甚至是指定文字域的輸入內容,如只能輸入日期或某一範圍內的數字等。
設定格式:
//设置边框 textbox.BorderWidth = 0.75f; textbox.BorderStyle = PdfBorderStyle.Solid; textbox.BorderColor = Color.Black; //设置背景色 textbox.BackColor = Color.Yellow; //设置字体颜色 textbox.ForeColor = Color.Red; //设置字体排列方式 textbox.TextAlignment = PdfTextAlignment.Center;
#指定文字網域的輸入內容:
Adobe Acrobat支援開發者使用Javascript預先定義文字網域輸入內容的格式、類型等。該元件也支援這類script並提供了對應的方法來實現這些功能。下表列出了部分Javascript和方法:
描述 |
Javascript |
方法 |
|
#Date |
##01 /31/2008 | AFDate_FormatEx("mm/dd/yyyy");
AFDate_KeystrokeEx("mm/dd/yyyy"); |
GetDateFormatString("mm/dd/yyyy");
GetDateKeystrokeString("mm/dd/yyyy"); |
#Date | 1/31/2008
|
AFDate_FormatEx("m/d/yyyy");
AFDate_KeystrokeEx("m/d/yyyy"); |
GetDateFormatString("m/d/yyyy");
GetDateKeystrokeString("m/d/yyyy"); |
#Zip code | ##12345
| AFSpecial_Format(0);
AFSpecial_Keystroke(0); | #GetSpecialFormatString(0);
GetSpecialKeystrokeString(0); |
12345-1234 | AFSpecial_Format(1); |
AFSpecial_Keystroke(1); | #GetSpecialFormatString(1);
GetSpecialKeystrokeString(1); |
(123) 456-7890 | #AFSpecial_Format(2); |
AFSpecial_Keystroke(2); | #GetSpecialFormatString(2);
GetSpecialKeystrokeString(2); |
##$12,345.00 | -$12,345.00
|
AFNumber_Keystroke(2, 0, 0, 0, "$", true);
|
GetNumberKeystrokeString(2, 0, 0, 0, "$", true);|
1≤ input value≤10 | AFRange_Validate(true,1,true,10) | GetRangeValidateString(true, 1, true, 10); |
#
//指定输入数据在1-100之间 string js = PdfJavascript.GetRangeValidateString(true, 1, true, 100); PdfJavascriptAction jsAction = new PdfJavascriptAction(js); textbox.Actions.Validate = jsAction;
##1.2 簽章域
建立簽章域與文字網域類似,也可以設定網域的邊框、大小、位置等屬性。這裡就不再贅述了。
//创建签名域并指定域名 PdfSignatureField signaturefield = new PdfSignatureField(page, "Signature"); //设置域的边框 signaturefield.BorderWidth = 1.0f; signaturefield.BorderStyle = PdfBorderStyle.Solid; signaturefield.BorderColor = new PdfRGBColor(System.Drawing.Color.Black); //设置高亮模式 signaturefield.HighlightMode = PdfHighlightMode.Outline; //设置大小与位置 signaturefield.Bounds = new RectangleF(40, 150, 200, 100); //将签名域添加到页面 pdf.Form.Fields.Add(signaturefield);
2. 填充域
填充域時需要先取得文件中所有的域,然後再逐一填滿指定域。如果相同類型的網域比較多,則可使用網域的名稱快速填入。
//加载PDF文档 PdfDocument pdf = new PdfDocument(); pdf.LoadFromFile("Fields.pdf"); //获取第一页 PdfPageBase page = pdf.Pages[0]; //获取文档的所有域 PdfFormWidget form = pdf.Form as PdfFormWidget; //填充第一个文本域 PdfTextBoxFieldWidget textboxField = form.FieldsWidget[0] as PdfTextBoxFieldWidget; textboxField.Text = "25"; //填充第二个签名域 PdfSignatureFieldWidget signatureField = form.FieldsWidget[1] as PdfSignatureFieldWidget; String pfxPath = @"gary.pfx"; PdfCertificate digi = new PdfCertificate(pfxPath, "123456"); PdfSignature signature = new PdfSignature(pdf, page, digi, "demo", signatureField); signature.IsTag = true; signature.DigitalSigner = "Gary"; signature.ConfigGraphicType = ConfiguerGraphicType.TextSignInformation; //保存文档 pdf.SaveToFile("Fill.pdf");
#
以上是C#在PDF中建立和填充域的詳細介紹(圖文)的詳細內容。更多資訊請關注PHP中文網其他相關文章!