TCPDF使用中英文字型不亂碼、不缺字
之前製作公司報價系統時,遇到了要把報價單匯出的需求,而通常我們寄給客戶的報價單都是.pdf的格式,因此解決方案自然就朝輸出.pdf的方向找。
google “php pdf”,很快就能找到「TCPDF」這個class。
TCPDF的使用方式非常簡單,只要新增一張負責輸出的.php頁面,並require進去即可。例如:
[pastacode lang=”php” manual=”require_once(‘tcpdf.php’)%3B%0A%24pdf%20%3D%20new%20TCPDF(PDF_PAGE_ORIENTATION%2C%20PDF_UNIT%2C%20PDF_PAGE_FORMAT%2C%20true%2C%20’UTF-8’%2C%20false)%3B%0A%2F%2F%E4%BB%A5%E4%B8%8B%E7%82%BA%E8%BC%B8%E5%87%BA%E6%A0%BC%E5%BC%8F%E8%88%87%E5%85%A7%E5%AE%B9″ message=”” highlight=”” provider=”manual”/]
這樣檔案裡就能以$pdf->blablabla去設定輸出內容與格式了。
BUT!人生永遠有個BUT,那就是TCPDF的預設中文字體是msungstdlight,非常醜,醜到我沒有臉用這個字體產生的報價單寄給客戶。於是就得找其他字體來用:TCPDF內建的日文漢字cid0jp很不錯,但太多中文字會缺字,沒辦法用;網路上有很多人教說用android的預設字體DroidSansFallback可行,我也去下載了這個字體來用,但竟然發生了中英文一起出現時,英文(或阿拉伯數字)變亂碼的詭異狀況。爬文爬了很久,直到找到這篇才知道問題出在哪裡:原來是字體檔內建字型不全造成的阿!改成這個版本就中英文都ok啦!
完整處理方式如下:
1. 下載中英文字型都完整的DroidSansFallback,放在TCPDF資料夾中的fonts資料夾
2. 隨便做一張.php放在同一個fonts資料夾內,利用下列程式碼將DroidSansFallback.ttf轉成TCPDF可以用的TrueTypeUnicode字型:
[pastacode lang=”php” manual=”%3C%3Fphp%0Arequire_once(‘tcpdf.php’)%3B%0A%24font%20%3D%20TCPDF_FONTS%3A%3AaddTTFfont(‘DroidSansFallback.ttf’)%3B%0A%3F%3E” message=”” highlight=”” provider=”manual”/]
3. 用網頁開啟這個.php檔開始轉檔,轉好之後會在fonts裡面產生三個檔案:droidsansfallback.php、droidsansfallback.ctg.z、droidsansfallback.z
這樣就能用DroidSansFallback字體輸出中英文阿拉伯數字都正常的.pdf檔了!
[pastacode lang=”php” manual=”%24pdf-%3ESetFont(‘DroidSansFallback’%2C%20”%2C%2012%2C%20”%2C%20true)%3B” message=”” highlight=”” provider=”manual”/]
您好,
不知道您輸出的中文會不會有標點出現在行首的問題?我查了網路許多文章還是沒辦法解決。
Hi Wayne Liu,
我沒遇過這種情況,不過TCPDF這個套件常常有編碼的狀況,或許你可以試試看從編碼上去抓蟲,也歡迎你解決問題後來分享解法喔!
您好!
感謝您的教程,非常收益!我遇到一個新的問題,就是生成PDF後,¥變成了口,不知道怎麼解決,比如:小計 ¥10.00元 變成了 小計 口10.00元,希望能獲得回複,再次感謝!
Hi Andy,
出現那個「口」應該是字型裡面沒有¥這個符號,或許得要找找有沒有其他的¥試試看(例如試試半形/全形的¥),如果真沒辦法可能就得換字型了……
若您嘗試後問題解決,也歡迎提供回饋喔!謝謝~
謝謝樓主分享的轉檔,終於搞定中文顯示~
Hi Oberon Lai,
Glad to be of help! 🙂
以前用 msungstdlight 還能正常出字,最近不知道哪版後,msungstdlight 一片空白
看到您這篇文章照著作一次,成功了~
建議文章 2. 隨便做一張.php放在同一個fonts資料夾內,調整一下:
2. 隨便做一支 a.php放在同一個fonts資料夾內
require_once(‘./tcpdf.php’);
$font = TCPDF_FONTS::addTTFfont(‘DroidSansFallback.ttf’);
Hi 羽山
感謝回饋喔!
最近剛好也被這個問題困擾, 靠您提供的檔案解決了, 十分感謝!
Hi Ken,
Glad to be of help! 🙂
版主您好:
想請教一下,那個在頁尾可以產生幾頁幾頁的頁數和頁文字,對吧,可是不論我怎麼改,那個page的文字,無法用中文字顯示,它只會顯示(??),請問有解決方法嗎,謝謝。
Hi David,
因為我是用1/2、2/2的方式顯示頁數,所以沒有遇到中文問題;我查了一下官方文件(https://tcpdf.org/examples/example_023/),不知道是不是跟footer設定的字型有關?
你好,
請問你能否方便直接傳給我已轉檔的3個檔案?我試了一整天也失敗呢。我是用local by flywheel 作為server, 試了很久都不能在網頁開啟那個.php 檔呢。不好意思,感謝你的時間。
您好,我壓縮成兩份檔案,您再下載試試看行不行:
https://www.weblink.idv.tw/wp-content/uploads/2019/04/droidsansfallback_1.zip
https://www.weblink.idv.tw/wp-content/uploads/2019/04/droidsansfallback_2.zip
感谢!
最新版的 TCPDF 的 AddFont() 报错 “TCPDF ERROR: The font definition file has a bad format”。没有深究,直接用您的字库啦……^_^
Glad to be of help! 😀
真是太感謝你的檔案了,我addfont之後,使用時中文正常但英文亂碼,但ttf打開明明都正常,於是用了你的檔案蓋過去就好了。
Hi Emily,
Glad to be of help! 🙂
您好:
我照您說的步驟執行時,有個動作有出入
「1. 下載中英文字型都完整的DroidSansFallback,放在TCPDF資料夾中的fonts資料夾」
我試是放在 tcpdf 資料夾即可 ,放在 fonts 資料夾反而找不到,供您參考
您好
感謝回饋,不知道是不是不同版本預設的抓取資料夾不同,不過我的狀況是放fonts裡面沒問題;有遇到抓不到的往外一層放試試看吧!