我目前正在尝试从PDF文档中提取文本,但我遇到了一些Tj运算符的奇怪情况。通常我处理过这样的案例:
Tc (SOME_TEXT) TJ
现在我遇到这样的情况:
Tm [
( )1.828
(5)1.841
(2)1.828
(2)1.828
(4)1.841
(9)1.828
(.)1.828
(6)1.841
(4)
]
TJ
哪个转换为字符串' 52249.64'。现在我遇到了另一个奇怪的案例:
我只能找到的信息是这样的:传递给Tj的字符串总是根据字体的Encoding或CMap来解释。 (在这种情况下,我希望它是带有CMap的CIDFont)
Td (
\t\004\007\020\007\016\016\026\020
)
Tj
我仍然不明白。这些索引是否表示某种字符数组中的偏移量,还是我必须解码这些值?谢谢!
答案 0 :(得分:2)
正如@Paulo在评论中已经指出的那样,您应首先查阅PDF规范,即目前ISO 32000-1,其免费副本由Adobe here提供。
关于文本提取的主题,您将在特定的 9.10文本内容提取部分找到,尤其是:
9.10.2将字符代码映射到Unicode值
符合本标准的读者可以在给定的优先级中使用这些方法将字符代码映射到Unicode值。特别是标记的PDF文档应至少提供其中一种方法(参见14.8.2.4.2,“标记PDF中的Unicode映射”):
如果字体字典包含 ToUnicode CMap(请参阅9.10.3,“ToUnicode CMaps”),请使用该CMap将字符代码转换为Unicode。
如果字体是使用预定义编码 MacRomanEncoding , MacExpertEncoding 或 WinAnsiEncoding 之一的简单字体,或者有一个编码,差异数组只包含取自Adobe标准拉丁字符集的字符名称和符号字体中的命名字符集(见附件D):
a)根据表D.1和字体的差异数组将字符代码映射到字符名称。
b)在 Adobe Glyph List 中查找字符名称(参见参考书目)以获取相应的Unicode值。
如果字体是使用表118中列出的预定义CMap之一的复合字体(Identity-H和Identity-V除外)或其后代CIDFont使用Adobe-GB1,Adobe-CNS1,Adobe- Japan1,或Adobe-Korea1字符集:
a)根据字体的CMap将字符代码映射到字符标识符(CID)。
b)从 CIDSystemInfo 字典中获取字体CMap(例如,Adobe和Japan1)使用的字符集的注册表和顺序。
c)通过以注册表 - 排序 -UCS2格式连接步骤(b)中获得的注册表和排序来构造第二个CMap名称(例如,Adobe-日本1-UCS2)。
d)使用步骤(c)中构建的名称获取CMap(可从ASN网站获得;参见参考书目)。
e)根据步骤(d)中获得的CMap映射步骤(a)中获得的CID,产生Unicode值。
注意类型0字体,其后代CIDFonts使用Adobe-GB1,Adobe-CNS1,Adobe-Japan1或Adobe-Korea1字符集合(在 CIDSystemInfo 字典中指定)应具有补充号对应于符合本标准的阅读器支持的PDF版本。有关与给定PDF版本对应的字符集列表,请参阅表3。 (可以使用这些字符集的其他补充,但如果补充的编号高于对应于支持的PDF版本的补充,则只有后一补充中的CID被视为标准CID。)
如果这些方法无法生成Unicode值,则无法确定字符代码表示的内容,在这种情况下,符合本标准的读者可以选择自己选择的字符代码。
如果您不知道此处的某些条款,请在ISO 32000-1或其中引用的其他规范中了解它们。
因此,对于可接受的文本提取结果,请使文本提取器支持该部分中提供的方法。