iT邦幫忙

3

PHP 產生 PDF 遇到罕見字問題

某次使用 TCPDF 想產生化學元素表
發現只要 unicode 超過 0xFFFF 就無法顯示
懷疑是 TCPDF 本身只能支援到 unicode 的 BMP 平面

為了確認該字型有所需要的所有文字
我另外用 nodejs 中 pdfkit 套件來產生 pdf
是可以輸出所有化學元素的中文的
兩者產生的結果如下圖
https://ithelp.ithome.com.tw/upload/images/20201006/20112943pLf8gFNW4W.png
測試程式碼(含字型檔)

所以想問

  1. 究竟是 TCPDF 不支援 unicode 超過 0xFFFF 的文字,還是其實有支援只是我的使用方式錯誤?
  2. 如果真的是 TCPDF 尚未支援,那麼遇到需要使用罕見字的專案時,有沒有其他 PHP 套件可以替代(希望是免費可商用的)?(還是有人遇到這種情況就乾脆自己刻PDF?)
hokou iT邦好手 1 級 ‧ 2020-10-06 15:59:18 檢舉
這篇看看?
https://ithelp.ithome.com.tw/questions/10183949
淺水員 iT邦大師 6 級 ‧ 2020-10-06 16:54:40 檢舉
現在的問題並不是無法產生中文,而是有些字顯示不出來。
(共通點是 unicode > 0xFFFF)
剛剛我直接拿上面連結的程式碼來測試,缺的字更多了。
柯柯 iT邦新手 3 級 ‧ 2020-10-07 09:56:57 檢舉
忽略我 沒事 不能刪回答 @@
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 個回答

0
ckp6250
iT邦好手 1 級 ‧ 2020-10-06 17:45:35
$pdf=new TCPDF(
    PDF_PAGE_ORIENTATION,
    PDF_UNIT,
    PDF_PAGE_FORMAT,
    true,
    'UTF-8',
    false
);

請試看看,如果加上第七個參數,有用嗎?

$pdf=new TCPDF(
    PDF_PAGE_ORIENTATION,
    PDF_UNIT,
    PDF_PAGE_FORMAT,
    true,
    'UTF-8',
    false,
    true
);
看更多先前的回應...收起先前的回應...
淺水員 iT邦大師 6 級 ‧ 2020-10-06 17:50:32 檢舉

剛剛測試,一樣那四個字是方塊字。(pdf/a)

ckp6250 iT邦好手 1 級 ‧ 2020-10-06 21:11:38 檢舉

我發現連 phpword 也出不來那四個字,
但,phpexcel 倒是出得來,若一時找不到解決方案時,
就先頂著吧。/images/emoticon/emoticon05.gif

淺水員 iT邦大師 6 級 ‧ 2020-10-06 22:55:36 檢舉

現在是沒立即有這需求
(只是產生元素表用PDFKIT就可以做了)

只是如果目前PHP沒有現成的套件能夠處理超出0XFFFF的文字
那麼有考慮開一個專案或是修改TCPDF原始碼
這幾天其實有稍微看一下字型跟PDF相關的規格文件了...

淺水員 iT邦大師 6 級 ‧ 2020-11-07 23:26:27 檢舉

後來打算自己開個專案,目前可以做到這樣了,過一段時間整理好再放到 github
https://ithelp.ithome.com.tw/upload/images/20201107/20112943UwKxQoeuPL.png
除了能夠顯示超過 0xFFFF 的文字之外
我也加入了可以自動替代字型的功能
所以上面的圖片英數是 Times-Roman 字型
一般中文是圓體,其中四個化學符號因為圓體沒那個字
又用思源黑體來顯示了

使用者使用的程式碼大概是這樣

const ft1='jf-openhuninn-1.1';
const ft2='SourceHanSansTC-Medium';
const ft3='Times-Roman';

$pdf=new PDFWriter();
//加入字型
$pdf->font->addFont(ft1);
$pdf->font->addFont(ft2);
$pdf->font->addFont(ft3);
//設定字型,順序靠前會優先使用
$pdf->font->setFont([
    ft3=>12,
    ft1=>12,
    ft2=>12
]);
$pdf->addPage('A4');
//畫外框
$pdf->postscriptGragh->addPath('10 10 m 10 70 l 70 70 l 70 10 l 10 10 l S', 0.5);
//設定文字區域
$pdf->text->setRect([10, 10, 60, 60]);
//添加文字
$pdf->text->addText('化學 123 元素????中最輕的兩個元素分別是氫和氦,(略)', 0, 12, true);
//輸出
$pdf->output();
ckp6250 iT邦好手 1 級 ‧ 2020-11-08 05:14:00 檢舉

靜候佳音。

淺水員 iT邦大師 6 級 ‧ 2020-11-10 18:36:27 檢舉
ckp6250 iT邦好手 1 級 ‧ 2020-11-10 20:23:07 檢舉

用心良苦,感恩。
我試看看先。

我要發表回答

立即登入回答