2015-10-19 81 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可能是最好的选择。