# iText7 介紹
## 安裝
到 NuGet 安裝 [itext7](https://itextpdf.com/en)、[itext.pdfhtml](https://itextpdf.com/en/products/itext-7/pdfhtml) 套件。

## 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();
}
```