使用TCPDF輸出完美的中文PDF文件

2021-09-06 12:25:58 字數 2207 閱讀 7547

tcpdf是乙個用於快速生成pdf檔案的php5函式包。tcpdf基於fpdf進行擴充套件和改進。支援utf-8,unicode,html和xhtml。在基於php開發的web應用中,使用它來輸出pdf檔案是絕佳的選擇。但畢竟這款開源軟體是外國人開發的,對中文的支援總不是那麼盡如人意,因此我們需要對它作進一步的增強。

tcpdf目錄結構圖

將此目錄移動到apache的網頁根目錄下(假設您使用的是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->cell那一段修改為:

$pdf->cell(0, 10, '敏捷的棕毛狐狸躍過那只懶狗。', '',1, 1, 'c'); $pdf->cell(0, 10, 'the quick brown fox jumps over the lazy dog.', '',1, 1, 'c'); $pdf->cell(0, 10, '1234567890', '',1, 1, 'c');

儲存,然後訪問 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。

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 下面即可。 開啟example_038.php檔案,將

$pdf->setfont('stsongstdlight', '', 20);

修改為$pdf->setfont('droidsansfallback', '', 20);

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

完美的代價

問題描述 回文串,是一種特殊的字串,它從左往右讀和從右往左讀是一樣的。小龍龍認為回文串 才是完美的。現在給你乙個串,它不一定是回文的,請你計算最少的交換次數使得該串變成乙個完美 的回文串。交換的定義是 交換兩個相鄰的字元,例如 mamad 第一次交換 ad mamda 第二次交換 md madma ...

完美的序列

題目描述 lyk 認為乙個完美的序列要滿足這樣的條件 對於任意兩個位置上的數都不相同。然而並不是所有的序列都滿足這樣的條件。於是 lyk 想將序列上的每乙個元素都增加一些數字 當然也可以選擇不增加 使得整個序列變成美妙的序列。具體地,lyk 可以花費 1 點代價將第 i 個位置上的數增加 1,現在 ...

完美的素數

time limit 1000ms memory limit 65536kb submit statistic discuss problem description 素數又稱質數。指乙個大於1的自然數,除了1和此整數自身外,不能被其他自然數整除的數。我們定義 如果乙個素數是完美的素數,當且僅當它的...