PDFminer 空输出
PDFminer empty output
在使用 pdfminer (pdf2txt.py) 处理 file 时,我收到空输出:
dan@work:~/project$ pdf2txt.py docs/homericaeast.pdf
dan@work:~/project$
谁能告诉我这个文件有什么问题,我可以做些什么来从中获取数据?
这里是 dumppdf.py docs/homericaeast.pdf
输出:
<trailer>
<dict size="4">
<key>Info</key>
<value><ref id="2" /></value>
<key>Root</key>
<value><ref id="1" /></value>
<key>ID</key>
<value><list size="2">
<string size="16">on ¤µF¤5Á>ó_ýv¬`</string>
<string size="16">on ¤µF¤5Á>ó_ýv¬`</string>
</list></value>
<key>Size</key>
<value><number>27</number></value>
</dict>
</trailer>
<trailer>
<dict size="4">
<key>Info</key>
<value><ref id="2" /></value>
<key>Root</key>
<value><ref id="1" /></value>
<key>ID</key>
<value><list size="2">
<string size="16">on ¤µF¤5Á>ó_ýv¬`</string>
<string size="16">on ¤µF¤5Á>ó_ýv¬`</string>
</list></value>
<key>Size</key>
<value><number>27</number></value>
</dict>
</trailer>
问题是 pdfminer
不理解您在此 PDF 中使用的 CMap。
如果你在 psparser.py
中打开 STRICT=1
的 pdfminer 自定义构建,你会得到一个类似这样的错误:
pdfminer.psparser.PSTypeError: Literal required: <PDFStream(21): raw=267, {u'Filter': /'FlateDecode', u'CMapName': /u'OneByteIdentityH', u'Type': /u'CMap', u'CIDSystemInfo': <PDFObjRef:20>, u'Length': 266}>
我不是很熟悉代码,但即使允许它通过也无济于事,因为它无法识别映射(即使我将名称硬编码为 OneByteIdentityH
并询问它查一下)。最终结果是 CMap 不包含任何映射,因此它将 PDF 中的每个字符转换为空字符串(好吧 None
如果我挑剔的话)。
修复可能是为此 CMap 创建一个映射,该映射只是 returns 传入的字符类似于 cmapdb.py
中已经实现的其他身份映射
现在我已经解决了 /OneByteIdentityH
的问题,类似于两字节 unicode 映射 /Identity-H
的代码。补丁在PR #179
在使用 pdfminer (pdf2txt.py) 处理 file 时,我收到空输出:
dan@work:~/project$ pdf2txt.py docs/homericaeast.pdf
dan@work:~/project$
谁能告诉我这个文件有什么问题,我可以做些什么来从中获取数据?
这里是 dumppdf.py docs/homericaeast.pdf
输出:
<trailer>
<dict size="4">
<key>Info</key>
<value><ref id="2" /></value>
<key>Root</key>
<value><ref id="1" /></value>
<key>ID</key>
<value><list size="2">
<string size="16">on ¤µF¤5Á>ó_ýv¬`</string>
<string size="16">on ¤µF¤5Á>ó_ýv¬`</string>
</list></value>
<key>Size</key>
<value><number>27</number></value>
</dict>
</trailer>
<trailer>
<dict size="4">
<key>Info</key>
<value><ref id="2" /></value>
<key>Root</key>
<value><ref id="1" /></value>
<key>ID</key>
<value><list size="2">
<string size="16">on ¤µF¤5Á>ó_ýv¬`</string>
<string size="16">on ¤µF¤5Á>ó_ýv¬`</string>
</list></value>
<key>Size</key>
<value><number>27</number></value>
</dict>
</trailer>
问题是 pdfminer
不理解您在此 PDF 中使用的 CMap。
如果你在 psparser.py
中打开 STRICT=1
的 pdfminer 自定义构建,你会得到一个类似这样的错误:
pdfminer.psparser.PSTypeError: Literal required: <PDFStream(21): raw=267, {u'Filter': /'FlateDecode', u'CMapName': /u'OneByteIdentityH', u'Type': /u'CMap', u'CIDSystemInfo': <PDFObjRef:20>, u'Length': 266}>
我不是很熟悉代码,但即使允许它通过也无济于事,因为它无法识别映射(即使我将名称硬编码为 OneByteIdentityH
并询问它查一下)。最终结果是 CMap 不包含任何映射,因此它将 PDF 中的每个字符转换为空字符串(好吧 None
如果我挑剔的话)。
修复可能是为此 CMap 创建一个映射,该映射只是 returns 传入的字符类似于 cmapdb.py
现在我已经解决了 /OneByteIdentityH
的问题,类似于两字节 unicode 映射 /Identity-H
的代码。补丁在PR #179