|
發表者 |
討論內容 |
冷日 (冷日) |
發表時間:2012/9/4 8:36 |
- Webmaster

- 註冊日: 2008/2/19
- 來自:
- 發表數: 15771
|
- [轉貼] PHP 生成 PDF 完美支持中文,解決 TCPDF 亂碼
- PHP生成PDF完美支持中文,解決TCPDF亂碼
發佈者: logken 分類: php
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』);
[code]
就可以把example_038.php文件中的
[code]
$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);
原文出處: PHP生成PDF完美支持中文,解决TCPDF乱码
|
|
|
討論串
-
[轉貼]免費好用的 PDF Library 大搜集 (冷日 (冷日), 2010/1/31 3:43)
-
[分享]PHP 之 PDF Library UTF-8 中文解決方案 (冷日 (冷日), 2010/1/31 16:15)
- »
[轉貼] PHP 生成 PDF 完美支持中文,解決 TCPDF 亂碼 (冷日 (冷日), 2012/9/4 8:36)
-
[轉貼]使用 PHP 開源類別 ( TCPDF ) 製作 UTF-8 的 PDF 報表 (冷日 (冷日), 2012/9/4 8:40)
-
[轉貼]undefined function bcadd() (冷日 (冷日), 2012/9/5 7:57)
-
[轉貼]PHP: BC Installing/Configuring (冷日 (冷日), 2012/9/5 8:03)
-
[轉貼]使用 PHP(FPDI)產生 UNICODE 中文 PDF (冷日 (冷日), 2012/9/18 14:48)
-
[轉貼]利用 FPDI 製作 PDF 檔案 (冷日 (冷日), 2012/9/18 14:51)
-
[轉貼]php 採用 fpdf 生成中文 pdf (冷日 (冷日), 2012/9/18 14:54)
-
[轉貼]用 PHP 處理中文 PDF (冷日 (冷日), 2012/9/19 2:16)
-
[分享]碰上 error: Some data has already been output, can't send PDF file (冷日 (冷日), 2013/1/3 7:09)
-
Re: [分享]PHP 之 PDF Library UTF-8 中文解決方案 (筆痕, 2014/11/6 23:12)
|