关于 unicode:PDF:使用不同的 ToUnicode Cmap 重复字体名称

PDF: Duplicate font names with different ToUnicode Cmaps

我正在解析一个 PDF 文件并提取一些文本,我遇到了一种情况,我遇到了一个名为 "C2_0" 的字体字典,其中包含一个 CIDFont (Type 0) 和一个ToUnicode CMap。所以,没问题 - 我有工具来解析 ToUnicode CMap 并将 2 字节字符代码映射到 Unicode 值。

但 PDF 文件稍后包含另一个字体字典对象,也称为 "C2_0",其中包含不同的 ToUnicode CMap。我真的不知道应该如何处理第二个 CMap,所以我只是猜测并结合了两个 CMap 的条目。这实际上有效,并正确提取了文本。

但是,我在 PDF 参考手册中找不到任何内容表明这是允许的,甚至无法解决这种情况。我会认为重复的字体名称会导致未指定的行为,或者至少让第二个覆盖第一个或其他东西。我只是尝试将它们组合起来作为一个长期的猜测 - 并且很惊讶它确实有效。

有人有这方面的经验吗?有谁知道是否允许 PDF 具有重复的字体名称,这些字体名称引用具有不同 CMap 的不同对象,当由 Tf 运算符调用时"组合"?


C2_0 是/Font 资源字典中的符号名,具有本地作用域,仅在资源字典所属的内容流中使用。如果 C2_0 也出现在另一个 /Font 资源字典中,那不是问题。
在您有相同的 /Font 资源字典 2 C2_0 条目:
/C2_0 X 0 R
/C2_0 是 0 读
那么你就有问题了,因为行为是未定义的,如何处理这种情况取决于你。
符号名称解析的工作方式如下:如果您在页面内容流中,则在页面的资源字典中搜索字体符号名称(Tf 操作数)。如果找不到它,请在页面树中向上搜索每个父页面节点的资源字典(如果存在)。如果您到达页面树的顶部并且没有找到字体,则行为未定义。此时你可以实现各种回退策略:可以使用默认字体,可以在页面上搜索表单 XObjects 中包含的资源,可以在其他页面中搜索资源字典。


很遗憾,您发现很多 PDF 文件并不"完美"...

如果您使用 pdftk.

之类的工具将 2 个 PDF 文件连接成 1 个文件,您所描述的可能很容易发生

重复的字体名称不一定会导致未指定的行为——取决于 PDF 阅读器的聪明程度。 PDF 阅读器可以在呈现内容时考虑每种字体的对象 ID……或者仅依靠字体名称来搞砸它。