iT邦幫忙

0

PDF 多國語言的解決方法

https://drive.google.com/file/d/1XiNj0AWpxZCxiHISukSddBNg2Nc5-9Mo/view?usp=sharing
想請問這是我在https://www.tenantcloud.com/ 這個網站測試的PDF檔,我並沒有告訴她我內容是使用甚麼語言,內容也是使用者隨意貼的,他卻可以將幾乎所有語言正確顯示(包括中文、日文、韓文),想請問這要如何辦到。
目前小弟使用的是tcpdf(php),使用freeserifb 可以滿足大部分語言但是不包含中文,使用中文ttf檔又無法包含其他語言,想請問有解決辦法嗎? 還是有更好的solution
目的:想做成PDF是在使用者輸入完資料後線上產生

ckp6250 iT邦好手 1 級 ‧ 2020-09-22 20:22:17 檢舉
我來亂一下,
我還沒測出 tcpdf 如何解決這個問題,
不過,我倒有測出 phpword 可以正確顯示如 გამარჯობა 這種字型。

假如一時找不到方案的話,不如改成產生 word。
柯柯 iT邦新手 5 級 ‧ 2020-09-23 11:29:02 檢舉
php 轉pdf 我記得 是用cjk 可以通用 中 日 韓文
0
richardsuma
iT邦大師 1 級 ‧ 2020-09-23 01:41:23

先了解一下電腦使用的內碼,熟悉各國文字的內碼與使用內碼的頁碼,就能正確產出文字,才能生成PDF檔案。

https://zh.wikipedia.org/wiki/%E5%85%A7%E7%A2%BC

http://www.cmex.org.tw/page.jsp?SN=chinese&ID=30&la=0

https://blog.miniasp.com/post/2019/01/02/Common-Regex-patterns-for-Unicode-characters

1
paicheng0111
iT邦高手 1 級 ‧ 2020-09-23 08:23:54

將PDF改成PDF/A格式應該可以解決這些問題。

0
淺水員
iT邦研究生 1 級 ‧ 2020-09-23 15:18:47

使用freeserifb 可以滿足大部分語言但是不包含中文,使用中文ttf檔又無法包含其他語言

偵測字串中每個字的 code point
然後依據 code point 選擇不同的字型

例如拿 tcpdf 的 Example008.php 來改
改下面這行

//$pdf->Write(5, $utf8text, '', 0, '', false, 0, false, false, 0);
myWrite($pdf, $utf8text);

補上 myWrite 的程式碼大概是這樣

function myWrite($pdf, $text) {
	$text=unpack('n*', mb_convert_encoding($text, 'UTF-16BE', 'UTF-8'));
	$currentFont=null;
	foreach($text as $codePoint) {
		$ft=0x4E00<=$codePoint && $codePoint<=0x9FFF?'imingcp612':'freeserif';
		if($currentFont!==$ft) {
			$currentFont=$ft;
			$pdf->SetFont($currentFont, '', 12);
		}
		$pdf->Write(5, mb_chr($codePoint, 'UTF-8'), '', 0, '', false, 0, false, false, 0);
	}
}
  • 上面用的 imingcp612 字型是 I.Ming 字型,預先用 TCPDF_FONTS::addTTFfont 處理過,可以依需求改其他的。
  • tcpdf 內建的 msungstdlight 應該不能用,那種字型無法用在要內嵌字型的狀況。
  • myWrite 函式是簡單寫一下,沒考慮 unicode 大於 0xFFFF 的狀況。印象中 tcpdf 也只能處理「基本多文種平面(Basic Multilingual Plane, BMP)」而已。

我要發表回答

立即登入回答