某次使用 TCPDF 想產生化學元素表
發現只要 unicode 超過 0xFFFF 就無法顯示
懷疑是 TCPDF 本身只能支援到 unicode 的 BMP 平面
為了確認該字型有所需要的所有文字
我另外用 nodejs 中 pdfkit 套件來產生 pdf
是可以輸出所有化學元素的中文的
兩者產生的結果如下圖
測試程式碼(含字型檔)
所以想問
$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
);
剛剛測試,一樣那四個字是方塊字。(pdf/a)
我發現連 phpword 也出不來那四個字,
但,phpexcel 倒是出得來,若一時找不到解決方案時,
就先頂著吧。
現在是沒立即有這需求
(只是產生元素表用PDFKIT就可以做了)
只是如果目前PHP沒有現成的套件能夠處理超出0XFFFF的文字
那麼有考慮開一個專案或是修改TCPDF原始碼
這幾天其實有稍微看一下字型跟PDF相關的規格文件了...
後來打算自己開個專案,目前可以做到這樣了,過一段時間整理好再放到 github
除了能夠顯示超過 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();