C# 在PDF中創(chuàng)建和填充域
眾所周知,PDF文檔通常是不能編輯和修改的。如果用戶需要在PDF文檔中簽名或者填寫其他內(nèi)容時(shí),就需要PDF文檔中有可編輯的域。開發(fā)者也經(jīng)常會(huì)遇到將數(shù)據(jù)以編程的方式填充到PDF模板域的需求。這時(shí)候就需要解決以下兩個(gè)問題:
- 如何在PDF中創(chuàng)建可編輯的域?
- 如何將內(nèi)容準(zhǔn)確地填寫到這些域中?
這里我將介紹怎樣使用C#和Free Spire.PDF組件來實(shí)現(xiàn)這一功能。
Free Spire.PDF組件概述
Free Spire.PDF是一個(gè)免費(fèi)專業(yè)的PDF組件,用于在.NET應(yīng)用程序中創(chuàng)建,編輯,處理和閱讀PDF文檔。支持豐富的PDF文檔處理操作,如PDF文檔合并/拆分、轉(zhuǎn)換(如HTML轉(zhuǎn)PDF,PDF轉(zhuǎn)圖片等)、打印(包括靜默打?。嚎s、添加注釋、安全設(shè)置(包括數(shù)字簽名)、創(chuàng)建與填充域、圖片插入與提取、文本提取與高亮等。不依賴Adobe Acrobat,并且支持中文。
關(guān)于安裝,有很多種渠道,包括官網(wǎng)以及開發(fā)者最喜歡和常用的NuGet方式。在Visual Studio的 NuGet Package Manager Console中輸入以下PowerShell命令回車,組件的dll就會(huì)自動(dòng)地引用到項(xiàng)目中:
PM> Install-Package FreeSpire.PDF
創(chuàng)建和填充域的實(shí)現(xiàn)
1.創(chuàng)建域
該組件提供了很多對(duì)應(yīng)的類,通過這些類我們可以創(chuàng)建多種PDF域。因?yàn)榉N類比較多,所以下面我只列出了一些常見的域和該域在組件中所對(duì)應(yīng)的類名。
域名 |
類名 |
文本域 |
PdfTextBoxField |
簽名域 |
PdfSignatureField |
復(fù)選框 |
PdfCheckBoxField |
組合框 |
PdfComboBoxField |
列表框 |
PdfListBoxField |
按鈕 |
PdfRadioButtonListField(單選按鈕) PdfButtonField (普通按鈕) |
這里我選取PDF文檔中最常見的兩種可編輯域進(jìn)行介紹:文本域和簽名域。
1.1 文本域
首先,我創(chuàng)建了一個(gè)簡(jiǎn)單的文本域。在創(chuàng)建的時(shí)候需要指定域的名稱,這樣做的好處在于,如果文檔中同時(shí)存在多個(gè)文本域,當(dāng)我們以編程的方式填寫域的時(shí)候,可以根據(jù)域的名稱快速準(zhǔn)確地將內(nèi)容填寫到指定的域中。需要注意的是域名不要重復(fù),否則會(huì)將內(nèi)容填寫到該域名對(duì)應(yīng)的所有域中。
//創(chuàng)建PDF文檔 PdfDocument pdf = new PdfDocument(); //添加一個(gè)新頁面 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); //創(chuàng)建文本域并指定文本域的名稱 PdfTextBoxField textbox = new PdfTextBoxField(page, "Age"); //設(shè)置文本域的大小、位置、字體 textbox.Bounds = new RectangleF(40, 50, 50, 12); textbox.Font = font; //添加文本域到文檔 pdf.Form.Fields.Add(textbox); //保存文檔 pdf.SaveToFile("Fields.pdf");
當(dāng)然多數(shù)時(shí)候我們的需求可能不止是創(chuàng)建一個(gè)簡(jiǎn)單的文本域,還需要做一些其他設(shè)置,如設(shè)置邊框、背景色、字體顏色、字體排列方式。甚至是指定文本域的輸入內(nèi)容,如只能輸入日期或某一范圍內(nèi)的數(shù)字等。
設(shè)置格式:
//設(shè)置邊框 textbox.BorderWidth = 0.75f; textbox.BorderStyle = PdfBorderStyle.Solid; textbox.BorderColor = Color.Black; //設(shè)置背景色 textbox.BackColor = Color.Yellow; //設(shè)置字體顏色 textbox.ForeColor = Color.Red; //設(shè)置字體排列方式 textbox.TextAlignment = PdfTextAlignment.Center;
指定文本域的輸入內(nèi)容:
Adobe Acrobat支持開發(fā)者使用JavaScript來預(yù)先定義文本域輸入內(nèi)容的格式、類型等。該組件也支持這類Script并提供了對(duì)應(yīng)的方法來實(shí)現(xiàn)這些功能。下表列出了部分JavaScript和方法:
描述 |
示例 |
JavaScript |
方法 |
Date |
01/31/2008 |
AFDate_FormatEx("mm/dd/yyyy"); |
GetDateFormatString("mm/dd/yyyy"); |
Date |
1/31/2008 |
AFDate_FormatEx("m/d/yyyy"); |
GetDateFormatString("m/d/yyyy"); |
Zip code |
12345 |
AFSpecial_Format(0); |
GetSpecialFormatString(0); |
Zip+4 |
12345-1234 |
AFSpecial_Format(1); |
GetSpecialFormatString(1); |
Phone number |
(123) 456-7890 |
AFSpecial_Format(2); |
GetSpecialFormatString(2); |
Money |
$12,345.00 |
AFNumber_Format(2, 0, 0, 0, "$", true); |
GetNumberFormatString(2, 0, 0, 0, "$", true); |
Validate |
1≤input value≤10 |
AFRange_Validate(true,1,true,10) |
GetRangeValidateString(true, 1, true, 10); |
示例:
//指定輸入數(shù)據(jù)在1-100之間 string js = PdfJavaScript.GetRangeValidateString(true, 1, true, 100); PdfJavaScriptAction jsAction = new PdfJavaScriptAction(js); textbox.Actions.Validate = jsAction;
1.2 簽名域
創(chuàng)建簽名域與文本域類似,也可以設(shè)置域的邊框、大小、位置等屬性。這里就不再贅述了。
//創(chuàng)建簽名域并指定域名 PdfSignatureField signaturefield = new PdfSignatureField(page, "Signature"); //設(shè)置域的邊框 signaturefield.BorderWidth = 1.0f; signaturefield.BorderStyle = PdfBorderStyle.Solid; signaturefield.BorderColor = new PdfRGBColor(System.Drawing.Color.Black); //設(shè)置高亮模式 signaturefield.HighlightMode = PdfHighlightMode.Outline; //設(shè)置大小與位置 signaturefield.Bounds = new RectangleF(40, 150, 200, 100); //將簽名域添加到頁面 pdf.Form.Fields.Add(signaturefield);
2. 填充域
填充域時(shí)需要先獲取文檔中所有的域,然后再逐一填充指定域。如果同一類型的域比較多,則可使用域的名稱快速填充。
//加載PDF文檔 PdfDocument pdf = new PdfDocument(); pdf.LoadFromFile("Fields.pdf"); //獲取第一頁 PdfPageBase page = pdf.Pages[0]; //獲取文檔的所有域 PdfFormWidget form = pdf.Form as PdfFormWidget; //填充第一個(gè)文本域 PdfTextBoxFieldWidget textboxField = form.FieldsWidget[0] as PdfTextBoxFieldWidget; textboxField.Text = "25"; //填充第二個(gè)簽名域 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");
由于篇幅有限,以上只介紹了創(chuàng)建和填充域的功能,如果需要詳細(xì)了解其他的功能,請(qǐng)查看:https://www.e-iceblue.com/Introduce/free-pdf-component.html#.WMn1g9J4edU。如有任何疑問,歡迎給博主留言,博主會(huì)盡最大努力給你答復(fù)!
以上就是本文的全部內(nèi)容,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來一定的幫助,同時(shí)也希望多多支持腳本之家!
相關(guān)文章
在WPF中合并兩個(gè)ObservableCollection集合
這篇文章介紹了在WPF中合并兩個(gè)ObservableCollection集合的方法,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-06-06C#實(shí)現(xiàn)List.Sort()使用小計(jì)
在C#開發(fā)中,List是常見的一種集合類型,其提供了一個(gè) Sort() 方法來實(shí)現(xiàn)對(duì)集合的排序,本文主要介紹了C#實(shí)現(xiàn)List.Sort()使用小計(jì),具有一定的參考價(jià)值,感興趣的可以了解一下2023-12-12C#自動(dòng)類型轉(zhuǎn)換與強(qiáng)制類型轉(zhuǎn)換的講解
今天小編就為大家分享一篇關(guān)于C#自動(dòng)類型轉(zhuǎn)換與強(qiáng)制類型轉(zhuǎn)換的講解,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2019-01-01解析在內(nèi)部循環(huán)中Continue外部循環(huán)的使用詳解
本篇文章是對(duì)在內(nèi)部循環(huán)中Continue外部循環(huán)的使用進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05C#控制臺(tái)實(shí)現(xiàn)簡(jiǎn)單飛行棋游戲
這篇文章主要為大家詳細(xì)介紹了C#控制臺(tái)實(shí)現(xiàn)簡(jiǎn)單飛行棋游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-07-07WinForm實(shí)現(xiàn)頁面按鈕定時(shí)隱藏功能
這篇文章主要介紹了WinForm實(shí)現(xiàn)頁面按鈕定時(shí)隱藏功能,結(jié)合實(shí)例形式分析了WinForm基于定時(shí)器的頁面控件屬性動(dòng)態(tài)操作相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2017-05-05