【问题标题】:dompdf not displaying some of latin charactersdompdf 不显示某些拉丁字符
【发布时间】:2016-01-28 11:38:06
【问题描述】:

我正在使用最新的稳定 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?

【问题讨论】:

标签: php dompdf


【解决方案1】:

字符编码

PDF 文档的默认编码是 Windows ANSI (1)。此编码提供有限的字符集支持,包括问题中指定的字符(č、ć、đ、ž)。因此,虽然文本在技术上是拉丁编码的,但支持这些字符的特定编码(ISO-8859-5)与 PDF 文档中提供的默认编码不同(Windows-1252,又名 Windows ANSI,几乎是ISO-8859-1 )。

字体指标

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

加载字体

虽然您可以修改 dompdf_font_family_cache.dist.php 文件,但不建议这样做。由于该文件包含在分发中,因此您执行的任何更新都可能覆盖该文件。当使用任何支持的字体加载方法时,dompdf 将创建一个名为 dompdf_font_family_cache.php 的文件来存储自定义字体的名称/位置信息。如果您想调整您的自定义字体信息,您可以在此文件中进行。此文件通常与与自定义字体关联的 TTF 和 AFM 文件一起存储(不一定在 dompdf/lib/fonts 目录中……取决于您的配置)。

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

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


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

【讨论】:

  • 很棒的答案。与其他 pdf 渲染库相比,我更喜欢 dompdf,并期待更新版本。我不是在做大量的 pdf 创建,但是从性能的角度来看,使用“@font-face”加载字体或通过命令行手动加载哪个更好?另外,我尝试使用“@font-face”加载字体,因为我看到字体已更改,但我仍然遇到字符编码问题。
  • 据我所知,我在这一点上失败了“配置 DOMPDF 以支持 Unicode”,但由于 config.inc.php 不包含也不支持,并且通过 Options 类,我无法在运行时设置或启用 Unicode 支持。
  • @AlanKis 如果预加载字体,您可能会看到性能稍好一些。使用@font-face dompdf 时必须确定字体是否已加载(尽管如果已加载,它不会再次处理指标)。就 Unicode 支持而言,始终从 0.7.0 开始启用。
猜你喜欢
  • 2013-04-21
  • 2011-04-08
  • 2013-01-21
  • 2012-11-16
  • 1970-01-01
  • 2018-06-16
  • 1970-01-01
  • 1970-01-01
  • 2011-08-21
相关资源
最近更新 更多