本文主要介紹了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 |
按鈕 |
PdfRadioButtonListField(選項按鈕) PdfButtonField (普通按鈕) |
這裡我選取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); |
Zip+4 |
12345-1234 |
AFSpecial_Format(1); AFSpecial_Keystroke(1); |
GetSpecialFormatString(1); GetSpecialKeystrokeString(1); |
Phone number |
(123) 456-7890 |
AFSpecial_Format(2); AFSpecial_Keystroke(2); |
GetSpecialFormatString(2); GetSpecialKeystrokeString(2); |
Money |
$12,345.00 -$12,345.00 |
AFNumber_Format(2, 0, 0, 0, "$", true); AFNumber_Keystroke(2, 0, 0, 0, "$", true); |
GetNumberFormatString(2, 0, 0, 0, "$", true); GetNumberKeystrokeString(2, 0, 0, 0, "$", true); |
Validate |
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");