2

渲染由 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 文件 Font -> Encoding -> Differences 数组中的顺序定义了字符。

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

我的问题是:这是否正确(或者我是否犯了错误并且 PDF 是否正确)以及您将如何检测这种情况以解决渲染问题。

注意:我确实需要能够呈现这些 PDF。

解决方案

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

4

1 回答 1

2

第一点是该文件在 Acrobat 中打开并正确呈现,因此几乎可以肯定该文件是正确的。事实上,它在广泛的 PDF 使用者中正确打开和呈现,所以事实上它是正确的。

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

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

您可以在 1.7 PDF 参考手册的第 430 页找到此内容,其中指出:

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

我相信在您的情况下,您只需要直接在 CMAP 子表中使用字符代码 (0x01)。这将为您提供 36 的 GID。

于 2011-08-22T07:18:36.130 回答