動態產生pdf檔案--從itextsharp到pdfsharp
手邊的某個專案原來使用itextsharp繪製表格。但因為 itextsharp新版本AGPL的要求,為免後續爭議,必須轉換改用其他解決方案,例如Pdfsharp。但在繪製表格時,itextsharp與pdfsharp有明顯的不同, iTextSharp 有 內建的 PdfPTable 類別,支援多樣化的表格操作,例如跨列、跨欄、邊框樣式、對齊、顏色、甚至可以在表格中插入圖片或其他元素。對於需要高度客製化的表格,iTextSharp 很強大。 PDFsharp則沒有 原生表格 API。你必須透過手動計算格線位置,使用 gfx.DrawRectangle 和 gfx.DrawString 等來「畫出」一張表格。代表需要更多低階的控制與程式碼。 當然,使用 PDFsharp 時,可以完全控制繪圖行為,包括只畫出每一列的「底線」。只要在畫表格的時候略過左右與上方的線段,只保留底部的那條線即可。 不過,有個壞消息是,PDFsharp 本身不具備內建解析 HTML 的功能,也就是說,單靠 PDFsharp 無法自動將含有 HTML tag 的文本轉換成對應格式的 PDF 內容。開發人員必須仰賴第三方的擴充套件,例如 HtmlRenderer.PdfSharp ,以實現這類功能,將 HTML(包含 CSS 樣式)渲染成 PDF 的內容。基本上,它的做法是通過先將 HTML 渲染到一個圖形物件,再將該圖形物件繪製到 PDF 中,這樣就能夠模擬出 HTML 內容的顯示效果。 另外,PDFsharp 是一個基於繪圖 API 的低階工具,它不提供像文檔排版引擎那樣的自動「流式佈局」功能,也就是說,它不會自動維護目前文檔中已經繪製到哪個位置的座標。這需要你自己來管理目前的「游標位置」(例如目前的 X 與 Y 值)。當你處理動態生成 PDF 並需要換頁時,通常會建立一個頁面佈局管理器,用來計算每個元素的擺放位置以及是否需要新增頁面。基本的邏輯如下: 設定頁面邊界與有效區域 通常你會定義固定的頁面邊界(例如上、下、左、右邊距),有效區域就是頁面的實際可用繪製空間。 舉例來說,若頁面高度為 800,而上下邊距分別都是 50,有效高度就是 800 - 50 - 50 = 700。 追蹤當前游標(Coordinate Cursor) 你需要保存一個 currentY (以...