前言
我們手上有一個 big5 編碼的 Html 檔案,想透過 Aspose 來轉換成 Pdf 檔案,看似容易,但在轉出來的 Pdf 中,竟然有一些字會變成「空白的框框」。一件簡單的工作,怎麼會踩到了雷呢?
首先,透過 Aspose 將 Html 檔轉換成 Pdf 檔案在 Aspose 有 2 種做法,如下,
1.透過 Aspose.HTML 來轉,請參考:Aspose.HTML HTML to PDF Conversion
1 | // Source HTML document |
2.透過 Aspose.Pdf 來轉,請參考:Aspose.Pdf Convert a File to PDF Format
1 | var options = new HtmlLoadOptions(); |
而我們剛開始是使用第 2 種方式,透過 Aspose.Pdf 來轉換,因為檔案是 big5 ,所以多設定 HtmlLoadOptions 的 InputEncoding 屬性為 big5 (可以不用設定,因為它會自動偵測)。
結果有些字出來卻會變成一個空白的框框。如下,「查」這個字,變成了空白的框框
測試的 Html 內容如下,
1 | <html> |
研究
即然透過 Aspose.Pdf 有問題,就改用第 1 種方式,透過 Aspose.HTML 來轉,結果這次變成「全型標點符號」會變成空白的框框,例如,一、個人 的「、」會變成空白的框框
2 種方式都無法正常將 Html 轉成 Pdf 檔,判斷應該是字型的問題,是否可以在載入後去調整它的字型然後再存檔呢?
所以筆者參考Replace fonts in existing PDF file 透過 TextFragmentAbsorber 取出文件中所有的 TextFragment ,先看一下有問題的文字,它們的字型是什麼呢?
1 | var absorber = new TextFragmentAbsorber(new TextEditOptions(TextEditOptions.FontReplace.RemoveUnusedFonts)); |
結果輸出如下,
**
詢 日期:MSGothic
詢日期:MSGothic
::TimesNewRoman
102/06/18:TimesNewRoman
10:54:19:TimesNewRoman
一、個:MSGothic
**
可以發現,「查」這個字不見了,而且它的字型為 MSGothic 。
如果我們將 Html 多加字型設定進去(font face=”細明體”),如下,
1 | <HTML><head><title>FC21900000-102/06/18 10:54:19</title><meta http-equiv="Content-Type" content="text/html; charset=big5" /></head> |
它的輸出就是正常的,各句子的字型如下,
**
查詢查日期:DFKai-SB
查詢日期:DFKai-SB
::CourierNew
102/06/18:CourierNew
10:54:19:CourierNew
一:DFKai-SB
、:MSGothic
個:DFKai-SB
**
但是如果將一樣的程式拿到 Windows Server 上測試,它的結果就會變成跟沒設定字型類似,如下,
**
詢 日期:MSGothic
詢日期:MSGothic
::CourierNew
102/06/18:CourierNew
10:54:19:CourierNew
一:MSGothic
、:MSGothic
個:MSGothic
**
所以「查」這個字,在 Windows Server 上又變成了一個空白的框框了。
怎麼辦呢? 那把 MSGothic 字型改成 DFKai-SB 字型可以嗎? 所以我們再加入置換字型的程式碼,如下,
1 | var absorber = new TextFragmentAbsorber(new TextEditOptions(TextEditOptions.FontReplace.RemoveUnusedFonts)); |
… 結果,Pdf 中「查」這個字,直接變成空白 Q_Q
顯然從 Html 載入到 Pdf 檔時,字型如果沒設定好,到後面應該就沒機會去改它了。
為了驗證假設是否正確,我們可以動態加入一段 Html 到 Pdf.Document 之中,如下,
1 | var options = new HtmlLoadOptions(); |
結果「查」這個字果然也變成了空白框框,如下圖,
這時,如果我們在 new HtmlFragment 時,設定 TextState 的字型,「查」這個字就可以順利顯示出來,如下,
1 | var options = new HtmlLoadOptions(); |
果然在載入到 Pdf.Document 時,就要給定預設的字型,但 HtmlLoadOptions 並沒有預設字型的屬性,怎麼辦呢?
解法
HtmlLoadOptions 目前並沒有預設字型的屬性,但 HtmlFragment 有,所以目前只好從 HtmlFragment 著手,也就是自已載入 Html 內容,然後再加入 Pdf.Document 之中。
所以目前暫時解法如下,
1 | var htmlFile = @"input.html"; |
產出的內容如下,
因為 HtmlLoadOptions 目前並沒有預設字型的屬性,所以針對這問題,原廠有建立一個問題單,未來更方便的解法,再跟大家 Update 。
參考資料
Aspose.HTML HTML to PDF Conversion
Aspose.Pdf Convert a File to PDF Format
How to render HTML to PDF document using Aspose.HTML for .NET
Aspose.Pdf.Document 載入 Big5 Html 檔,存成 PDF 時,有些字會變成一個空的框框
Replace fonts in existing PDF file