根據PDF模板生成PDF文件,這里主要借助iTextSharp工具來完成。場景是這樣的,假如要做一個電子協議,用過通過在線填寫表單數據,然后系統根據用戶填寫的數據,生成電子檔的協議。原理很簡單,但是每個技術人員解決問題的思路不太一樣。也有朋友直接通過Canvas來實現,過程是把內容排版好,然后生成圖片,然后根據圖片生成PDF文件,這種方式有個問題,如果要是要求兼容移動端的話,在移動設備上排版出來的效果肯定不太一樣,導致最終生成的電子協議和期望的相差太大。下面我們就利用PDF中的表單元素,來完成PDF內容的替換。
過程是這樣的!
我這邊收到一份word版的文檔,首先,我們將其另存為PDF文件。
其次,在https://www.pdfescape.com/open/這個網站,將PDF文件上傳上去,進行在線編輯。
也可以通過PDF軟件工具,進行編輯。這里,我把需要填寫部分的內容,全畫上表單元素,設置元素的name,后面根據name 屬性對其進行賦值。具體操作,將text放置指定處,然后鼠標右鍵,看到如下界面:
這里Name屬性就是后面我們要用到的。目前它支持的元素有:
下面,我們新建一個控制台程序,通過nuget獲取itextSharp。
控制台代碼如下:
/// <summary> /// /// </summary> /// <param name="args"></param> static void Main(string[] args) { string tempFilePath = "D:\\a.tmp.pdf"; iTextSharp.text.pdf.PdfDocument document = new iTextSharp.text.pdf.PdfDocument(); iTextSharp.text.pdf.PdfReader pdfReader = new iTextSharp.text.pdf.PdfReader(@"D:\d.pdf"); PdfStamper pdfStamper = new PdfStamper(pdfReader, new FileStream(tempFilePath, FileMode.OpenOrCreate)); AcroFields pdfFormFields = pdfStamper.AcroFields; pdfStamper.FormFlattening = true; //BaseFont bf = BaseFont.CreateFont(BaseFont.HELVETICA, BaseFont.CP1252, BaseFont.NOT_EMBEDDED); BaseFont simheiBase = BaseFont.CreateFont(@"C:\Windows\Fonts\simhei.ttf", BaseFont.IDENTITY_H, BaseFont.EMBEDDED); //添加圖片 //Image image = Image.GetInstance(""); //pdfStamper.Writer.Add(image); pdfFormFields.AddSubstitutionFont(simheiBase); pdfStamper.AcroFields.SetField("Names", "李朝強"); pdfStamper.AcroFields.SetField("chk", "yes", true); pdfStamper.Close(); pdfReader.Close(); ////解析文本 //PdfReaderContentParser parser = new PdfReaderContentParser(pdfReader); //PdfWriter pdfWriter; //ITextExtractionStrategy strategy; //strategy = parser.ProcessContent<SimpleTextExtractionStrategy>(1, new SimpleTextExtractionStrategy()); //string ss = strategy.GetResultantText(); //byte[] buffer = pdfReader.GetPageContent(1); //string strBody = System.Text.Encoding.Default.GetString(buffer); }
上面代碼,根據D盤的d.pdf模板,來生成最終的PDF文件。這里通過給AcroFields中的字段賦值,來達到替換內容的目的。
上面還有一種復選框(checkbox)的內容,pdf也支持,這里直接給其賦值yes或no,來控制是否選中。
最后一步就是將生成的PDF進行展示了。這里借助於pdf.js(微信也支持)。看看效果吧!
看看手機微信效果吧!