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

Bre*_*els 5 pdf fonts postscript

我很难产生使用14种标准PDF字体的PDF。让我们以Times-Roman为例。

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

这对于ASCII字符来说很好用。但是,并非所有PDF查看器都能正确显示诸如“ fi”连字(AdobeStandardEncoding代码174)之类的更奇特的东西:

  • Adobe Reader显示Times-Roman和?的®(Unicode索引174)。时代斜体
  • SumatraPDF(葡萄酒)显示®两种字体
  • Mozilla的PDF.js展示了'AE'两种字体

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

  • 苹果预览/跳过
  • GhostScript
  • PDF-XChange Viewer(葡萄酒)
  • 福昕阅读器(葡萄酒)
  • Chromium的内部PDF查看器
  • 埃文斯(自制)

打开Adobe Reader的“ 文档属性”窗口显示:

Times-Roman
    Type: Type1
    Encoding: Custom
    Actual Font: Times-Roman
    Actual Font Type: TrueType
Run Code Online (Sandbox Code Playgroud)

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

StandardEncoding Adobe标准拉丁文本编码。这是在类型1拉丁文字字体程序中定义的内置编码(但 通常在TrueType字体程序中不是)。

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

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

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

Bre*_*els 5

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

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

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