我正在解析PDF文件并提取一些文本,我遇到一种情况,我遇到一个名为“C2_0”的字体字典,其中包含一个{{1}的CIDFont(Type 0) CMap。所以,没问题 - 我有工具来解析ToUnicode
CMap并将2字节字符代码映射到Unicode值。
但PDF文件后来包含另一个字体字典对象,也名为“C2_0”,其中包含不同 {{1 CMap。我并不是真的应该如何处理第二个CMap,所以我只是猜测并合并了两个CMap的条目。这实际上有效,并正确提取文本。
但是,我在PDF参考手册中找不到允许这样做的任何内容,甚至无法解决这种情况。我原本以为重复的字体名称会导致未指定的行为,或者至少让第二个覆盖第一个或类似的东西。我只是尝试将它们结合起来作为一个长期的猜测 - 并且惊讶它实际上有效。
有没有人有这方面的经验?是否有人知道PDF是否允许使用重复的字体名称来引用具有不同CMap的不同对象,这些对象在ToUnicode
运算符调用时会“合并”?
答案 0 :(得分:4)
C2_0是/ Font资源字典中的符号名称,它具有本地范围,仅在资源字典所属的内容流中使用。如果C2_0也出现在另一个/字体资源字典中,那不是问题。
在你有相同的/字体资源字典2 C2_0条目:
/ C2_0 X 0 R
/ C2_0 Y 0 R
然后你有一个问题,因为行为是未定义的,由你决定如何处理这种情况
符号名称解析的工作方式如下:如果您在页面内容流中,请在页面的资源字典中搜索字体符号名称(Tf操作数)。如果找不到它,请在页面树中向上搜索每个父页面节点的资源字典(如果存在)。如果到达页面树的顶部并且未找到字体,则行为未定义。此时您可以实现各种后备策略:您可以使用默认字体,您可以搜索页面上XObjects表单中包含的资源,您可以在其他页面中搜索资源字典。
答案 1 :(得分:1)
遗憾的是,您发现许多PDF文件在野外并非“完美”......
如果使用pdftk
等工具将2个PDF文件连接成1,则可能很容易发生您所描述的内容。
重复的字体名称不一定会导致未指定的行为 - 具体取决于PDF阅读器的聪明程度。 PDF阅读器在渲染内容时可以考虑每种字体的对象ID ......或者仅仅依靠字体名来搞乱它。