PDF字体映射错误

时间:2011-08-21 19:15:02

标签: pdf character-encoding fonts embedded-fonts

渲染PDFCreator 0.9.x生成的PDF文件时。我注意到它在字符映射中包含错误。现在,PDF文件中的错误无可置疑,Acrobat在渲染错误的PDF文件方面确实奇迹,因此许多PDF生成器创建的PDF不完全符合PDF标准。

我想创建一个小示例文件:http://test.continuit.nl/temp/Document.pdf

单页使用Tj命令呈现单个字形(大写A)(参见流5 0 obj)。所选字体(7 0 obj)包含嵌入了单个字形的字体。到现在为止还挺好。 char由char#1引用。鉴于字体的编码,它包含差异部分:[1 / A]。因此,char 1 - >字符/ A.现在在嵌入式子集字体中有一个cmap,它在字符65处没有匹配字形(例如,大写字母A),字体的cmap部分确实按照PDF文件中的顺序定义字符字体 - >编码 - >差异数组。

看起来字符映射/编码完成了两次。只有来自PDFCreator 0.9.x的文件似乎受到影响。

我的问题是:这是否正确(或者我犯了错误并且PDF是否正确),为了解决渲染问题,您将采取什么措施来检测这种情况。

注意:我确实需要能够渲染这些PDF ..

解决方案

在ISO32000文件中有一个注释,即符号TrueType字体(字体描述符中的标志位3打开)不允许编码,您应该使用简单的1on1编码来忽略它。总而言之,如果它是一个符号字体,我完全忽略了编码对象,这就解决了这个问题。

1 个答案:

答案 0 :(得分:2)

第一点是文件在Acrobat中打开并正确呈现,因此几乎可以肯定该文件是正确的。事实上,它可以在各种PDF消费者中正确打开和呈现,因此实际上它是正确的。

有问题的字体是TrueType字体,所以实际上是,有两种'编码'。首先是PDF / PostScript编码。这会将字符代码映射到字形名称。在您的情况下,它将字符代码1映射到字形名称/ A.

在PostScript字体中,我们将在CharStrings字典中查找名称/ A,这将为我们提供字符描述,然后我们将执行该字符描述。但是,TrueType字体的情况有所不同。

您可以在1.7 PDF参考手册的第430页找到此信息,其中声明:

“TrueType字体程序的内置编码通过称为”cmap“的内部数据结构直接从字符代码映射到字形描述(不要与第5.6.4节”CMaps“中描述的CMap混淆)“。

我相信你只需要在CMAP子表中直接使用字符代码(0x01)。这将给你一个36的GID。