TCPDF 與自訂字型

幾年前因為學校接了北星計畫,請我協助架網站讓參與的學校上網填報學校的招生資料,然後能自動產生 pdf 檔,下載核章後再將核章後的紙本送到學校來存檔。當時找了一些資料,最後選用 TCPDF 來完成這個工作。在產生 pdf 檔時,原本想使用標楷體來當作字型,但當時要使用非 TCPDF 預設的字型時,需要先將字型檔轉檔,手續複雜不說,轉出來的 pdf 檔會因為內嵌了整個字型檔而變得異常肥大,所以之後還是放棄使用自訂字型,而採用網路上查到的 msungstdlight 字型設定,這樣會以使用者端電腦的預設字型來顯示(在 Windows 上是細明體,在 Ubuntu 上則要看各電腦的設定)。

上述的一些複雜手續可以參考一下這篇的討論:
http://www.coolsun.idv.tw/modules/xhnewbb/viewtopic.php?topic_id=1236

最近要幫學校用 Drupal 架一個教甄線上報名的網站,要讓報名的人在繳費後下載准考證自行列印,所以找了新版的 TCPDF 來自動產生 pdf 檔,我還是很好奇,不曉得字型的問題究竟有解沒解。上網查了查,找到的資料的結論還是跟先前一樣。但是我注意到 TCPDF 官方網站(http://www.tcpdf.org/)上關於字型設定的頁面(http://www.tcpdf.org/fonts.php)在講到關於轉換字型檔的步驟的內容好像跟以前不太一樣:

  1. 以前要先用它提供的工具轉換後,再執行一個 php 的腳本產生它所需要的檔案,現在這樣的動作已經不需要了。TCPDF的類別已經提供一個 addTTFfont() 的函式可以自動完成這些工作:
    $fontname = $pdf->addTTFfont('/path-to-font/fontfile.ttf', 'TrueTypeUnicode', '', 32);
    這一行會讀取指定的字型檔案,經過轉換後,在 TCPDF 的 fonts 資料夾中自動產生所需要的檔案。
  2. SetFont()函式有一個我以前沒注意到的參數「subset」,仔細看了一下說明,如果它的值是 true 的話,TCPDF 只會將內容中有用到的字型嵌入 pdf 檔,而不會將整個字型檔嵌入。
注意到這些事情之後,迫不及待的趕快測試了一下:

$pdf = new TCPDF();
$pdf->addTTFfont('kaiu.ttf', 'TrueTypeUnicode');
$pdf->SetFont('kaiu', '', 12, true);
$pdf->WriteHTML('測試');
$pdf->Output('font.pdf', 'D');

嗯,雖然產生的 pdf 檔上的文字很悲劇的破碎了,
但是這只是因為微軟細明體與標楷體的原罪(請參考 http://rtassoh.blogspot.tw/2010/08/xelatex.html),也可能是我在 ubuntu 上產生 pdf 檔的關係,不過至少產生的 pdf 檔是小的以及字型確定是可以改用自己指定的了。

依相同的方法,更改為其他字型,如文鼎的楷書,就會是正常的。

留言

屎八克寫道…
Thanks for sharing....

這個網誌中的熱門文章

On The Side of Me, by Corrinne May

電腦壞了