14种标准PDF字体和字符编码

The 14 standard PDF fonts and character encoding

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

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

这适用于 ASCII 字符。但是,所有 PDF 查看器都无法正确显示 'fi' 连字(AdobeStandardEncoding 代码 174)等更奇特的内容:

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

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

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

我怀疑使用 TrueType 字体而不是 Type1 字体可能与问题有关。 PDF规格:

StandardEncoding Adobe standard Latin-text encoding. This is the built-in encoding defined in Type 1 Latin-text font programs (but generally not in TrueType font programs).

它还说 WinAnsiEncodingMacRomanEncoding 可以 与TrueType 字体。那么我们应该避免对标准 14 种字体使用内置或 StandardEncoding 吗?它的效果似乎是不确定的。 Adobe Reader 似乎没有费心执行从字形名称到正在使用的 TrueType 字体中的字形的正确映射。

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

EDIT 嗯,我觉得字体描述符标志对于这些标准字体可能很重要。到目前为止,我将所有字体的标志设置为 4,这似乎适用于 True/OpenType 字体。

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

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

采取这些预防措施后,生成的 PDF 在上面列出的所有 9 个查看器应用程序中都能正确显示。