我想将包含特殊unicode字符'✝'的文档从html转换为pdf with html2pf。但是,在渲染文档时,“✝”显示为“?”。我该怎么办?
答案 0 :(得分: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输出:
然而,解决方案2和3有一个相当大的缺点。你可能不得不将附加字体嵌入到PDF文档中(默认情况下html2pdf会这样做),大大增加了它的大小。PDF和tcpdf(基于html2pdf构建)中的一个功能是仅添加文档中实际出现的字体(称为子集)中的字符,但html2pdf不会公开此功能,我可以告诉你。
如果您需要支持许多不常见的Unicode字符,解决方案2可能就是这样。