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

时间:2010-11-17 10:20:49

标签: python pdf

我正在尝试使用pyPdf从多页PDF中提取和打印页面。问题是,文本不是从某些页面中提取的。我在这里放了一个示例文件:

http://www.4shared.com/document/kmJF67E4/forms.html

如果运行以下命令,前81页将不返回任何文本,而最后11页正确提取。有人可以帮忙吗?

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

6 个答案:

答案 0 :(得分:8)

请注意,extractText()仍然无法正确提取文本。来自extractText()的文档:

  

适用于某些PDF文件,   但对其他人来说很糟糕,取决于   使用的发电机。这将会   在未来精炼。不要依赖   文本的顺序来自于此   功能,如果这样会改变   功能变得更加复杂。

由于它是您想要的文本,因此您可以使用Linux命令pdftotext

要使用Python调用它,您可以这样做:

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

文本摘自forms.pdf并保存到output

这适用于您的PDF文件,并提取您想要的文本。

答案 1 :(得分:1)

您也可以尝试pdfminer库(也在python中),看看它是否更好地提取文本。但是,为了分裂,你必须坚持使用pyPdf,因为pdfminer不支持。

答案 2 :(得分:1)

这不是一个真正的答案,但pyPdf的问题是:它还不支持CMaps。 PDF允许字体使用CMap将字符ID(PDF中的字节)映射到Unicode字符代码。如果您的PDF包含非ASCII字符,则可能正在使用CMap,有时甚至在没有非ASCII字符时也是如此。当pyPdf遇到不是标准Unicode编码的字符串时,它只会看到一堆字节代码;它不能将这些字节转换为Unicode,因此它只给你空字符串。我实际上有同样的问题,我正在研究源代码。这很费时间,但我希望在2011年中期左右向维护者发送补丁。

答案 3 :(得分:0)

我发现有时将其转换为ps(尝试使用pdf2pspdftops获取潜在差异)然后返回pdfps2pdf) 。然后再次尝试原始脚本。

答案 4 :(得分:0)

我开始认为我应该采用凌乱的两部分解决方案。 PDF有两个部分,pp 1-82有文本页面标签(pdftotext可以提取),pp 83-end没有页面标签但是pyPDF可以提取并且它明确地知道页面。

我想我需要将两者结合起来。笨重,但我没有看到它的任何方式。可悲的是,我不得不在Windows机器上执行此操作。

答案 5 :(得分:0)

我遇到过类似的问题,对于一些pdf和windows,这对我来说非常好:

1.-下载适用于Windows的Xpdf工具

2.-将pdpdotext.exe从xpdf-tools-win-4.00 \ bin32复制到C:\ Windows \ System32,再复制到C:\ Windows \ SysWOW64

3.-使用子进程从控制台运行命令:

import subprocess

try:
    extInfo = subprocess.check_output('pdftotext.exe '+filePath + ' -',shell=True,stderr=subprocess.STDOUT).strip()
except Exception as e:
    print (e)