dompdf 不显示一些拉丁字符

dompdf not displaying some of latin characters

我正在使用最新稳定的 0.6 dompdf 版本,但我无法显示一些拉丁字符,我看到该文档目前已完整。

到目前为止,我正在尝试使用 Open Sans 字体,我什至将其转换为 afm 格式,但仍然有一些显示带有 ?而不是我们的拉丁字符 'č, ć, đ, ž'。

字体下载为ttf,字体定义添加到dompdf_font_family_cache.dist.php文件如下:

'open sans' => 
  array (
    'normal' => $rootDir . '/lib/fonts/OpenSans',
  ),

将 html 内容输出到浏览器可以很好地呈现这些字符。是否有任何官方解决方案,因为缺少 load_font.php 或应该更新到 0.7-beta 并改用 @font-face?

字符编码

PDF 文档的默认编码是 Windows ANSI (1)。此编码提供有限的字符集支持,包括问题中指定的字符(č、ć、đ、ž)。因此,虽然文本在技术上是 latin-encoded 支持这些字符的特定编码 (ISO-8859-5) is not the same as the default one provided provided in PDF documents (Windows-1252, aka Windows ANSI, which is pretty much ISO-8859-1)。

字体规格

考虑到字符编码问题,您通过 loading a font 采取了正确的方法来添加对字符的支持。但是,您完成它的方法不会为您带来预期的结果。 dompdf(当使用 CPDF 后端时)利用字体指标来确定如何布置文档的文本。字体规格有两种形式,AFM(Adobe 字体规格)和 UFM(Unicode 字体规格)。这两种形式对应于dompdf支持的两种可能的编码,WindowsANSI和Unicode。您的字体指标采用 AFM 格式这一事实向 dompdf 表明该字体被编码为 Windows ANSI.

正在加载字体

虽然您 可以 修改 dompdf_font_family_cache.dist.php 文件,但不推荐这样做。由于该文件作为分发的一部分包含在内,因此您执行的任何更新都可以 over-write 该文件。当使用任何支持的 font-loading 方法时,dompdf 将创建一个名为 dompdf_font_family_cache.php 的文件来存储自定义字体的 name/location 信息。如果你想调整你的自定义字体信息,你会在这个文件中这样做。此文件通常存储在与自定义字体关联的 TTF 和 AFM 文件旁边(不一定在 dompdf/lib/fonts 目录中......取决于您的配置)。

我建议不要手动编辑 dompdf_font_family_cache.php。相反,如果没有其他易用性原因,我会使用 CSS @font-face 规则来定义和加载字体。如果您倾向于使用命令行工具来 pre-load 您的字体,那么 load_font.php 脚本仍然包含在 dompdf 的 0.6.x 版本中(不确定您为什么不这么认为)。如果您想移动到 0.7.0,您可以在 dompdf-utils project.

中找到 load_font.php 脚本的更新版本

最后,如果您仍然遇到问题,您可以随时尝试使用捆绑的 DejaVu 字体之一(从 dompdf 0.6.0 开始可用)。


(1) 好的,是的,有几种可能的编码。但在大多数情况下,您可以将 Windows ANSI 视为默认值。