我在制作使用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规范:
StandardEncoding Adobe标准拉丁文编码。这是 在Type 1拉丁文字体程序中定义的内置编码(但是 通常不在TrueType字体程序中)。
它还表示 WinAnsiEncoding 和 MacRomanEncoding 可以与TrueType字体一起使用。那么我们是否应该避免对标准14字体使用内置或 StandardEncoding ?它的影响似乎是不明确的。似乎Adobe Reader并不打算在使用的TrueType字体中执行从字形名称到字形的正确映射。
使用Win或Mac编码时,提供Differences
数组会产生正确的结果吗?由于这些映射代码指向Type1 / Postscript字形名称,因此没有与TrueType字形的直接链接。
编辑嗯,我觉得字体描述符标志可能对这些标准字体很重要。对于所有字体,我将标志设置为4到现在为止,这似乎适用于True / OpenType字体。
答案 0 :(得分:2)
原来Flags
字典中的FontDescriptor
很重要。对于Times,需要设置 Nonsymbolic 标志(第6位)。 Times实际上是使用TrueType字体排版的事实与它无关。
要使用字体的内置编码,不应设置Type1 Encoding
字典的Font
条目。如果它包含非空Encoding
数组,或者Adobe Reader会出错,则只能添加BaseEncoding
字典(省略Differences
)。
通过这些预防措施,生成的PDF可以在上面列出的所有9个查看器应用程序中正确显示。