2015-10-19 101 views
0

我想將包含特殊Unicode字符'✝'的文檔從html轉換爲包含html2pf的pdf。但是,在呈現文檔時,「✝」顯示爲「?」。我能做些什麼?html2pdf中的特殊unicode字符

+2

您可以嘗試'utf8_encode/utf8_decode'函數。或者,使用'†'表示法。 –

+0

不幸的是,兩者都不起作用 – Ferenjito

+2

您使用的字體可能不包含該字符。我可以讓它與'dejavusans'一起工作。這裏有一個[片段](http://pastie.org/private/j7ynkeo8ywyqg8gs2zug)進行快速測試。 – mermshaus

回答

3

「✝」(U + 271D LATIN CROSS)字符可能無法在PDF文檔中正確呈現,因爲使用的字體不支持它。

這裏有一些想法:

1)用更常見的一種看起來類似替換的字符。 「†」(U + 2020 DAGGER)將是一個明顯的選擇,因爲它是常見的Windows-1252字符集的一部分。

在代碼:

$var = str_replace("\xE2\x9C\x9D", "\xE2\x80\xA0", $var); 

$var必須包含以UTF-8編碼的數據。除此之外,我總是希望通過使用它們的二進制表示法將更多「不常見」字符插入到源代碼中。原因之一是:許多編輯器字體也不包含這些字符。它可以防止問題。

2)將PDF文檔的字體更改爲支持字符的字體。下面是一個例子(與從我的評論摘錄的問題):

$font = 'dejavusans'; 

$content = <<<EOT 
<page> 
<h1>$font</h1> 
\xE2\x9C\x9D U+271D LATIN CROSS 
</page> 
EOT; 

require_once __DIR__ . '/html2pdf_v4.03/html2pdf.class.php'; 

$html2pdf = new HTML2PDF(); 
$html2pdf->setDefaultFont($font); 
$html2pdf->WriteHTML($content); 
$html2pdf->Output(__DIR__ . '/test.pdf', 'F'); 

3)如果你想在PDF文檔中的原始字符,並且不希望更改默認字體,您可以切換到每當你遇到一個支持字符的字體。

$input = <<<EOT 
<h1>Demo</h1> 
<p>This should be Arial.</p> 
<p>\xE2\x9C\x9D - U+271D LATIN CROSS</p> 
EOT; 

$input = str_replace(
    "\xE2\x9C\x9D", 
    "<span style=\"font-family: dejavusans\">\xE2\x9C\x9D</span>", 
    $input 
); 

$content = <<<EOT 
<page> 
$input 
</page> 
EOT; 

require_once __DIR__ . '/html2pdf_v4.03/html2pdf.class.php'; 

$html2pdf = new HTML2PDF(); 
$html2pdf->setDefaultFont('arial'); 
$html2pdf->addFont('dejavusans'); // note this line 
$html2pdf->WriteHTML($content); 
$html2pdf->Output(__DIR__ . '/test.pdf', 'F'); 

渲染PDF輸出:

example

解決方案2和3有一個相當大的缺點,雖然。您可能需要將附加字體嵌入到PDF文檔中(默認情況下,html2pdf會執行該操作),從而將其大小增加了很多。

PDF和tcpdf(建立在html2pdf之上)有一個功能,只添加實際在文檔中出現的字體中的字符(稱爲子集),但html2pdf不公開此功能我可以說。

如果您需要支持許多不常見的Unicode字符,解決方案2可能是最好的選擇。