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)等更奇特的内容:
- Adobe Reader 显示 ®(unicode 索引 174)用于 Times-Roman 和 Ă 用于 Times-Italic
- SumatraPDF(葡萄酒)显示两种字体的 ®
- Mozilla 的 PDF.js 显示 'AE' 两种字体的连字
我试过的所有其他 PDF 查看器都能正确显示 'fi' 连字。它们还正确显示 € 符号,该符号使用 Encoding
字典中的 Differences
数组进行额外映射(因为它不包含在 AdobeStandardEncoding 中):
- 苹果Preview/Skim
- GhostScript
- PDF-XChange 查看器(葡萄酒)
- 福昕Reader(酒)
- Chromium 的内部 PDF 查看器
- Evince(自制软件)
打开 Adobe 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).
它还说 WinAnsiEncoding 和 MacRomanEncoding 可以 与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
),否则 Adobe Reader 会出错。
采取这些预防措施后,生成的 PDF 在上面列出的所有 9 个查看器应用程序中都能正确显示。
我在生成使用 14 种标准 PDF 字体的 PDF 时遇到困难。我们以Times-Roman为例。
我创建了一个 Font
类型 Type1
的字典,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(葡萄酒)显示两种字体的 ®
- Mozilla 的 PDF.js 显示 'AE' 两种字体的连字
我试过的所有其他 PDF 查看器都能正确显示 'fi' 连字。它们还正确显示 € 符号,该符号使用 Encoding
字典中的 Differences
数组进行额外映射(因为它不包含在 AdobeStandardEncoding 中):
- 苹果Preview/Skim
- GhostScript
- PDF-XChange 查看器(葡萄酒)
- 福昕Reader(酒)
- Chromium 的内部 PDF 查看器
- Evince(自制软件)
打开 Adobe 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).
它还说 WinAnsiEncoding 和 MacRomanEncoding 可以 与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
),否则 Adobe Reader 会出错。
采取这些预防措施后,生成的 PDF 在上面列出的所有 9 个查看器应用程序中都能正确显示。