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

我创建了Font类型的Type1字典,并将BaseFont设置为Times-Roman。如果我在Encoding字典中省略了Font条目,或者添加了未设置EncodingBaseEncoding字典,则PDF查看器应用程序应使用字体的内置编码。对于Times-Roman,这是AdobeStandardEncoding。

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

  • Adob​​e Reader对Times-Roman显示®(unicode索引174),对于Times-Italic显示Ă(Unicode索引
  • )
  • SumatraPDF(葡萄酒)显示®两种字体
  • Mozilla的PDF.js显示'AE'连字这两种字体

  • 我尝试过的所有其他PDF查看器都正确显示了“fi”连字。它们还会正确显示€符号,并使用Differences字典中的Encoding数组另外映射了该符号(因为AdobeStandardEncoding中未包含该符号):
  • Apple预览/跳过
  • GhostScript
  • PDF-X更改查看器(葡萄酒)
  • Foxit阅读器(葡萄酒)
  • Chromium的内部PDF查看器
  • 埃文斯(自制)

  • 打开Adobe Reader的“文档属性”窗口显示:
    Times-Roman
        Type: Type1
        Encoding: Custom
        Actual Font: Times-Roman
        Actual Font Type: TrueType
    

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



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

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

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

    最佳答案

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

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

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

    关于pdf - 14种标准PDF字体和字符编码,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36486716/

    10-14 17:05
    查看更多