【发布时间】: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 数组进行映射(因为它不包含在 AdobeStandardEncoding 中):
- Apple 预览/浏览
- GhostScript
- PDF-XChange 查看器(酒)
- 福昕阅读器(酒)
- Chromium 的内部 PDF 查看器
- Evince(自制)
打开 Adobe Reader 的 文档属性 窗口显示:
Times-Roman
Type: Type1
Encoding: Custom
Actual Font: Times-Roman
Actual Font Type: TrueType
我怀疑使用 TrueType 字体而不是 Type1 字体这一事实可能与问题有关。 PDF 规范:
StandardEncoding Adobe 标准拉丁文本编码。这是 在 Type 1 拉丁文本字体程序中定义的内置编码(但 一般不在 TrueType 字体程序中)。
它还说 WinAnsiEncoding 和 MacRomanEncoding 可以与 TrueType 字体一起使用。那么我们应该避免对标准 14 字体使用内置或 StandardEncoding 吗?它的影响似乎是不确定的。似乎 Adobe Reader 不会费心执行从字形名称到正在使用的 TrueType 字体中的字形的正确映射。
在使用 Win 或 Mac 编码时提供Differences 数组会产生正确的结果吗?由于这些将代码点映射到 Type1/Postscript 字形名称,因此没有直接链接到 TrueType 字形。
编辑 嗯,我感觉字体描述符标志对于这些标准字体可能很重要。到目前为止,我将所有字体的标志设置为 4,这对于 True/OpenType 字体似乎工作正常。
【问题讨论】:
-
请注意标准的 14 种字体并不完全是用于它们的真正字体程序。它们是抽象,在不同的查看器中可能由不同的实际字体支持。因此,依靠某些标准编码肯定会在某些查看器或其他查看器或同一版本的某些版本中失败。此外,标准字体的特殊处理早就被宣布弃用了……
-
@mkl 现在我设置了 Nonsymbolic 标志,它似乎在上面列出的所有 PDF 查看器中都能正常工作。根据我对规范的理解,标准字体的特殊处理只与
Fonts字典中的FirstChar、LastChar、Widths和FontDescriptor条目有关。只要包含这些条目,您仍然可以使用 14 种标准字体而无需嵌入它们。
标签: pdf fonts postscript