1. 程式人生 > >PHP生成PDF完美支援中文,解決TCPDF亂碼

PHP生成PDF完美支援中文,解決TCPDF亂碼

PHP生成PDF格式檔案以TCPDF為基礎,TCPDF是一個用於快速生成PDF檔案的PHP5函式包。TCPDF基於FPDF進行擴充套件和改進。支援UTF-8,Unicode,HTML和 XHTML。在基於PHP開發的Web應用中,使用它來輸出PDF檔案是絕佳的選擇。但畢竟這款開源軟體是外國人開發的,對中文的支援也不是那麼盡如人 意,因此我們需要對它作進一步的強化。
首先要到TCPDF官網下載TCPDF最新版。訪問http://www.tcpdf.org ,單擊導航條上的”Download”連結,即可下載到最新版本的TCPDF壓縮包。因為裡面包含了許多的TCPDF範例和字型檔案,因此下載的檔案比較大,大概有10M左右。下載完後解壓它,會得到一個名為tcpdf的目錄,此目錄的結構大概是這樣的:

將此目錄移動到WEB網站的根目錄下(假設您使用的是Apache,並且使用80埠,如有不同請根據實際情況修改),開啟瀏覽器,訪問 http://localhost/tcpdf/ 應該就可以看到此目錄下的檔案和資料夾列表。由於TCPDF已經自帶了一些範例,因此為了節省時間,我們可以直接對範例進行修改再使用。開啟tcpdf目 錄下的examples目錄,下面有50多個範例檔案,其中example_038.php就是用來測試東亞字型的(比如簡體/繁體中文、日文等等),開啟此檔案,找到$pdf->SetFont 這一行,修改為:

$pdf->SetFont(‘stsongstdlight’, ”, 20);

這一行程式碼的作用是設定PDF正文所用的字型及字號。其中”stsongstdlight”表示”STSongStdLight”字型,這是Adobe Reader的預設簡體中文字型,TCPDF中已經內建這個字型的配置檔案,我們只需直接呼叫即可。接下來,

$pdf->Write(0,’敏捷的棕毛狐狸躍過那隻懶狗‘, ”, 0, ’L', true, 0, false, false, 0);

$pdf->Write(0,’The quick brown fox jumps over the lazy dog.’, ”, 0, ’L', true, 0, false, false, 0);

$pdf->Write(0,’1234567890′, ”, 0, ’L', true, 0, false, false, 0);

儲存,然後訪問 http://localhost/tcpdf/examples/example_038.php 就可以生成一份PDF文件了:

使用預設中文字型生成的PDF檔案

這種方式生成的PDF檔案的優點是:檔案體積小,生成快速。但也有缺點是,沒有嵌入中文字型,只限於安裝了Adobe Reader之後才能正常顯示。那萬一使用者使用的是FoxIt Reader或者是Linux作業系統呢?顯示效果就不一樣了。因此,為了保證生成的PDF檔案在任何環境下都有同樣的顯示效果,嵌入字型是必需的。
Windows下有很多中文字型,但是我們要用在TCPDF中的中文字型有下面幾個要求:

· 支援Unicode,因為TCPDF支援的是Unicode;

· 體積越小越好;

· 最好是也支援繁體中文;

這樣看來,微軟雅黑以及方正的一些字型都符合要求。但是他們都是商業字型,而且個頭都不小,以微軟雅黑為例,msyh.ttf 檔案就超過10M,如果使用它,生成的PDF檔案體積也會很大。
綜合考慮,我覺得”Droid Sans Fallback”字型符合要求:

· 首先它是免費字型;

· 其次它也是Unicode編碼,支援簡體繁體中文以及日文韓文等等;

· 然後它的體積很小,不超過5M。

然而TCPDF不支援TTF字型檔案,因此我們先將它轉換成TCPDF支援的格式,然後再使用。在TCPDF目錄下有個fonts子目錄,這個子目錄下又有個utils,這裡面帶有一個字型轉換工具ttf2ufm.exe。下面是轉換的步驟:
在網上很容易找到Droid Sans Fallback字型的下載連結,因此在這裡就沒有必要多做描述了。我們把下載到的 DroidSansFallback.ttf 複製到 TCPDF\fonts\utils 下面,然後開啟Windows的命令列,切換到此路徑下,輸入如下命令:

D:\www\tcpdf\fonts\utils>ttf2ufm -a -F DroidSansFallback.ttf

等待一段時間,等到命令列視窗顯示

“Finished - font files created”

之後,可以發現此目錄下生成了DroidSansFallback.afm,DroidSansFallback.t1a 和 DroidSansFallback.ufm 這三個檔案。
在命令列中輸入

“C:\Program Files\WAMP\PHP5\php.exe” -q makefont.php DroidSansFallback.ttf DroidSansFallback.ufm

說明:這裡的”C:\Program Files\WAMP\PHP5\php.exe”為php.exe檔案所在的路徑,請根據實際情況輸入。回車執行之後,稍等片刻,命令列視窗中會提示

Font definition file generated

至此大功告成。將生成的droidsansfallback.php、droidsansfallback.z以及droidsansfallback.ctg.z這三個檔案複製到 TCPDF\fonts 下面即可。

生成不成功也沒問題,另一個方法是到Joomla中文官網http://www.joomlagate.com下載Joomla中文程式找到\language\pdf_fonts目錄下複製droidsansfallback.php、droidsansfallback.z以及droidsansfallback.ctg.z這三個檔案也是可以的
開啟example_038.php檔案,將

$pdf->SetFont(‘stsongstdlight’, ”, 20);

修改為

$pdf->SetFont(‘droidsansfallback’, ”, 20);

這樣就能夠呼叫我們剛才生成的字型,再訪問 http://localhost/tcpdf/examples/example_038.php 就可以看到重新生成的PDF文件。

嵌入DroidSansFallback字型後的PDF文件

附註:SetHeaderData裡中文的解決方法為:tcpdf\config\tcpdf_config.php

define (‘PDF_FONT_NAME_MAIN’, ’helvetica’);

改為: define (‘PDF_FONT_NAME_MAIN’, ’stsongstdlight’);

define (‘PDF_FONT_NAME_DATA’, ’helvetica’);

改為: define (‘PDF_FONT_NAME_DATA’, ’stsongstdlight’);

就可以把example_038.php檔案中的

$pdf->SetHeaderData(PDF_HEADER_LOGO, PDF_HEADER_LOGO_WIDTH, PDF_HEADER_TITLE.’ 038′, PDF_HEADER_STRING);

改為:

$pdf->SetHeaderData(PDF_HEADER_LOGO,PDF_HEADER_LOGO_WIDTH,’中文頭部’, ’作者和版權’);

假如你的網站原始碼為GBK格式 輸出的PDF內容為亂碼的話 就需要做個簡單的轉換了,把需要打出的中文文字做

iconv(“gb2312//TRANSLIT”,’utf-8′,$str);

$pdf->Write(0,iconv(“gb2312//TRANSLIT”,’utf-8′,’解決GBK網站輸出中文亂碼問題‘), ”, 0, ’L', true, 0, false, false, 0);