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

时间:2016-04-07 20:36:21

标签: pdf fonts postscript

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

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

这适用于ASCII字符。但是,所有PDF查看器都无法正确显示更像“fi”结扎(AdobeStandardEncoding代码174)的内容:

  • Adob​​e Reader为Times-Roman显示®(unicode index 174),为Times-Italic显示Ă
  • SumatraPDF(wine)显示两种字体
  • Mozilla的PDF.js显示'AE'结合两种字体

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

  • Apple Preview / Skim
  • GhostScript的
  • PDF-XChange Viewer(葡萄酒)
  • 福昕阅读器(葡萄酒)
  • Chromium的内部PDF查看器
  • Evince(自制)

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

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

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

  

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

它还表示 WinAnsiEncoding MacRomanEncoding 可以与TrueType字体一起使用。那么我们是否应该避免对标准14字体使用内置或 StandardEncoding ?它的影响似乎是不明确的。似乎Adobe Reader并不打算在使用的TrueType字体中执行从字形名称到字形的正确映射。

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

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

1 个答案:

答案 0 :(得分:2)

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

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

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