pyPdf无法从我的PDF某些页面提取文本

8 投票
6 回答
18971 浏览
提问于 2025-04-16 07:12

我正在尝试使用pyPdf这个工具来提取和打印一个多页PDF文件中的页面。问题是,有些页面的文字提取不出来。

如果你运行下面的代码,前81页不会返回任何文字,而最后11页则能正常提取。有没有人能帮我解决这个问题?

from pyPdf import PdfFileReader  
input = PdfFileReader(file("forms.pdf", "rb"))  
for page in input1.pages:  
    print page.extractText()  

6 个回答

2

这段话其实不是一个答案,而是在说pyPdf这个工具的问题:它目前不支持CMaps。PDF文件允许使用CMaps来把字符ID(PDF中的字节)映射到Unicode字符代码。当你的PDF里有非ASCII字符时,通常会用到CMap,有时候即使没有非ASCII字符也会用到。当pyPdf遇到那些不是标准Unicode编码的字符串时,它只看到一堆字节代码;它无法把这些字节转换成Unicode,所以最后只给你空字符串。我自己也遇到过这个问题,现在正在处理源代码。这个过程比较耗时间,但我希望能在2011年中左右把修复的代码发给维护者。

2

你也可以试试这个叫做 pdfminer 的库(也是用Python写的),看看它提取文本的效果是否更好。不过,如果你想要分割PDF文件的话,就得继续使用pyPdf,因为pdfminer不支持这个功能。

10

请注意,extractText()在提取文本时仍然存在一些问题。从extractText()的说明中可以看到:

这个方法在某些PDF文件上效果很好,但在其他文件上效果就差了,这主要取决于生成PDF的工具。未来会对这个方法进行改进。不要依赖这个函数输出文本的顺序,因为如果这个函数变得更复杂,输出的顺序可能会改变。

既然你想要的是文本,可以使用Linux命令pdftotext

如果你想用Python来调用这个命令,可以这样做:

>>> import subprocess
>>> subprocess.call(['pdftotext', 'forms.pdf', 'output'])

文本会从forms.pdf中提取出来,并保存到output中。

这个方法在你的PDF文件中有效,可以提取出你想要的文本。

撰写回答