【问题标题】:The 14 standard PDF fonts and character encoding14种标准PDF字体和字符编码
【发布时间】:2016-07-28 22:57:39
【问题描述】:

我在制作使用 14 种标准 PDF 字体的 PDF 时遇到了困难。我们以 Times-Roman 为例。

我创建了一个Type1 类型的Font 字典,其中BaseFont 设置为Times-Roman。如果我在Font 字典中省略了Encoding 条目,或者在没有BaseEncoding 集的情况下添加Encoding 字典,则PDF 查看器应用程序应该使用字体的内置编码。对于 Times-Roman,这是 AdobeStandardEncoding

这适用于 ASCII 字符。但是,并非所有 PDF 查看器都能正确显示像“fi”连字(AdobeStandardEncoding 代码 174)这样更奇特的东西:

  • Adobe Reader 显示 ®(unicode 索引 174)代表 Times-Roman 和 Ă 代表 Times-Italic
  • SumatraPDF (wine) 显示两种字体的 ®
  • Mozilla 的 PDF.js 显示两种字体的“AE”连字

我尝试过的所有其他 PDF 查看器都可以正确显示“fi”连字。它们还正确显示了 € 符号,该符号还使用 Encoding 字典中的 Differences 数组进行映射(因为它不包含在 Adob​​eStandardEncoding 中):

  • Apple 预览/浏览
  • GhostScript
  • PDF-XChange 查看器(酒)
  • 福昕阅读器(酒)
  • Chromium 的内部 PDF 查看器
  • Evince(自制)

打开 Adob​​e Reader 的 文档属性 窗口显示:

Times-Roman
    Type: Type1
    Encoding: Custom
    Actual Font: Times-Roman
    Actual Font Type: TrueType

我怀疑使用 TrueType 字体而不是 Type1 字体这一事实可能与问题有关。 PDF 规范:

StandardEncoding Adob​​e 标准拉丁文本编码。这是 在 Type 1 拉丁文本字体程序中定义的内置编码(但 一般不在 TrueType 字体程序中)。

它还说 WinAnsiEncodingMacRomanEncoding 可以与 TrueType 字体一起使用。那么我们应该避免对标准 14 字体使用内置或 StandardEncoding 吗?它的影响似乎是不确定的。似乎 Adob​​e Reader 不会费心执行从字形名称到正在使用的 TrueType 字体中的字形的正确映射。

在使用 Win 或 Mac 编码时提供Differences 数组会产生正确的结果吗?由于这些将代码点映射到 Type1/Postscript 字形名称,因此没有直接链接到 TrueType 字形。

编辑 嗯,我感觉字体描述符标志对于这些标准字体可能很重要。到目前为止,我将所有字体的标志设置为 4,这对于 True/OpenType 字体似乎工作正常。

【问题讨论】:

  • 请注意标准的 14 种字体并不完全是用于它们的真正字体程序。它们是抽象,在不同的查看器中可能由不同的实际字体支持。因此,依靠某些标准编码肯定会在某些查看器或其他查看器或同一版本的某些版本中失败。此外,标准字体的特殊处理早就被宣布弃用了……
  • @mkl 现在我设置了 Nonsymbolic 标志,它似乎在上面列出的所有 PDF 查看器中都能正常工作。根据我对规范的理解,标准字体的特殊处理只与Fonts 字典中的FirstCharLastCharWidthsFontDescriptor 条目有关。只要包含这些条目,您仍然可以使用 14 种标准字体而无需嵌入它们。

标签: pdf fonts postscript


【解决方案1】:

原来Flags 字典中的Flags 很重要。对于 Times,需要设置 Nonsymbolic 标志(位 6)。 Times 实际上是使用 TrueType 字体排版的事实与此无关。

要使用字体的内置编码,不应设置 Type1 Font 字典的 Encoding 条目。如果Encoding 字典包含非空的Differences 数组,则只能添加Encoding 字典(省略BaseEncoding),否则Adobe Reader 会出错。

通过这些预防措施,生成的 PDF 可以在上面列出的所有 9 个查看器应用程序上正确显示。

【讨论】:

  • PDF 32000:2008 表 114 中指定 - 编码字典中的条目BaseEncoding (Optional) - The base encoding—that is, the encoding from which the Differences entry (if present) describes differences— shall be the name of one of the predefined encodings MacRomanEncoding, MacExpertEncoding, or WinAnsiEncoding. If this entry is absent, the Differences entry shall describe differences from an implicit base encoding.
  • @dwarring 我不确定你的意思,但我已经更新了我认为应该如何处理差异的答案。
  • 如果我根本不指定 FontDescriptor 字典(14 种标准字体允许),它在所有查看器中的行为是否应该相同?
猜你喜欢
  • 2019-12-17
  • 1970-01-01
  • 1970-01-01
  • 2023-03-08
  • 1970-01-01
  • 2012-07-22
  • 1970-01-01
  • 1970-01-01
  • 2012-06-07
相关资源
最近更新 更多