我很难生成使用14种标准PDF字体的PDF。让我们以Times-Roman为例。
我创建了Font
类型的Type1
字典,并将BaseFont
设置为Times-Roman
。如果我在Encoding
字典中省略了Font
条目,或者添加了未设置Encoding
的BaseEncoding
字典,则PDF查看器应用程序应使用字体的内置编码。对于Times-Roman,这是AdobeStandardEncoding。
这对于ASCII字符来说很好用。但是,并非所有PDF查看器都正确显示诸如'fi'连字之类的更奇特的东西(AdobeStandardEncoding代码174):
我尝试过的所有其他PDF查看器都正确显示了“fi”连字。它们还会正确显示€符号,并使用
Differences
字典中的Encoding
数组另外映射了该符号(因为AdobeStandardEncoding中未包含该符号):打开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/