# iText7 介紹 ## 安裝 到 NuGet 安裝 [itext7](https://itextpdf.com/en)、[itext.pdfhtml](https://itextpdf.com/en/products/itext-7/pdfhtml) 套件。 ![](https://i.imgur.com/AR1UxHQ.jpg) ## iText7 轉換方法 #### 1. ConvertToPdf 將 Html 直接轉換為 pdf 檔案。 ``` C#= public void createPdf(string html, string dest) { HtmlConverter.ConvertToPdf(html, new FileStream(dest, FileMode.Create)); } ``` #### 2. ConvertToElements 將 Html 拆解 pdf 標籤。 ``` C#= public void createPdf(string html, string dest) { //設定參數 ConverterProperties properties = new ConverterProperties(); DefaultFontProvider defaultFont = new DefaultFontProvider(); defaultFont.AddFont("c:\\windows\\fonts\\msjh.ttc,0"); properties.SetFontProvider(defaultFont); //取得PDF第二頁資訊 PdfPage pdfPage = pdfDocument.GetPage(2); PdfCanvas canvas = new PdfCanvas(pdfPage); Rectangle rectangle = new Rectangle(100, 200, 100, 200); //繪圖位置&範圍 Canvas c = new Canvas(canvas, pdfDocument, rectangle); //取得Html底下的所有元素 List<IElement> elements = HtmlConverter.convertToElements(html, props); //寫入的PDF檔 PdfDocument pdf = new PdfDocument(new PdfWriter(dest)); foreach (IElement element in elements) { //加入Html至指定位置及範圍 c.Add((IBlockElement)element); } c.Close(); canvas.Release(); } ``` #### 3. ConvertToDocument 將 Html 轉為 document 文件。 ``` C#= public void CreatePdf(byte[] html, string baseUri, string dest) { ConverterProperties properties = new ConverterProperties(); PdfWriter writer = new PdfWriter(dest); PdfDocument pdf = new PdfDocument(writer); properties.SetBaseUri(baseUri); pdf.SetDefaultPageSize(new PageSize(595, 14400)); Document document = HtmlConverter.ConvertToDocument(new MemoryStream(html), pdf, properties); EndPosition endPosition = new EndPosition(); LineSeparator separator = new LineSeparator(endPosition); document.Add(separator); document.GetRenderer().Close(); PdfPage page = pdf.GetPage(1); float y = endPosition.GetY() - 36; page.SetMediaBox(new Rectangle(0, y, 595, 14400 - y)); document.Close(); } ``` # iText7 使用 可以利用 `HandleEvent` 在每一頁 PDF 印上需要的文字或圖片。 ``` C#= public class PdfEvents : IEventHandler { public void HandleEvent(Event @event) { //TO DO:每一頁PDF皆會執行 } } ``` 下列例子是將原始的PDF,帶入輸入及輸出路徑,重新改寫產生一份新的PDF。 ``` C#=9 private void RewritePDF(string sVal) { //輸出路徑 string sOutPath = Server.MapPath("/examplePDF/output.pdf"); //輸入路徑 string sInputPath = Server.MapPath("/examplePDF/input.pdf"); //讀取PDF & 輸出PDF PdfDocument pdfDocument = new PdfDocument(new PdfReader(sInputPath), new PdfWriter(sOutPath)); //建立 HandleEvent (每頁PDF皆會執行) PdfEvents pdfEvents = new PdfEvents(); pdfDocument.AddEventHandler(PdfDocumentEvent.END_PAGE, pdfEvents); //取得所有原始PDF的欄位ID PdfAcroForm form = PdfAcroForm.GetAcroForm(pdfDocument, true); IDictionary<string, PdfFormField> fields = form.GetFormFields(); //所有欄位ID foreach (string Key in fields.Keys) { //設定字型 PdfFont pdfFont = PdfFontFactory.CreateFont("c:\\windows\\fonts\\msjh.ttc,0", PdfEncodings.IDENTITY_H, true); //將欄位的值帶入 fields[Key].SetFont(pdfFont).SetValue(sVal); } pdfDocument.Close(); } ```