2010-11-17 49 views
6

我试图使用pyPdf从多页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

请注意,extractText()在正确提取文本时仍存在问题。从文档extractText()

这非常适用于某些PDF文件, 但不良他人,根据 使用的发电机。这将是未来精炼的 。不要依赖 这个函数产生的文本顺序,因为如果这个函数变得更复杂,它将会改变。

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

来调用使用Python,你可以这样做:

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

文本从forms.pdf提取并保存到output

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

+0

感谢您的帮助。我试过pdftotext并通过它,因为它只能部分解决问题。我需要根据在每个页面上找到的UID将PDF拆分为单独的文件。然而,pyPdf可以提取的最后10页左右没有文本页面标签,所以使用pdftotext,虽然它给了我所有的文本,但并没有给我一种为给定的UID生成页面列表的方法。 – DrJAKing 2010-11-17 11:26:00

+0

这不会输出PDF文本,但不会保留表格格式。 – s2t2 2017-07-13 19:50:25

1

你也可以尝试pdfminer库(也在python中),看看它在提取文本方面是否更好。然而,对于分裂,你将不得不坚持使用pyPdf,因为pdfminer不支持。

+0

我已经尝试过pdfminer ...后一页由于某种原因无法正确提取。 – DrJAKing 2010-11-17 15:25:01

0

我发现它有时是有用的将其转换为ps(尝试pdf2pspdftops的电位差),然后回到pdfps2pdf)。然后再次尝试您的原始脚本。

+0

我很有希望,但它似乎所做的一切就是让原始文件更大,并减缓提取空文本! – DrJAKing 2010-11-17 15:23:57

+0

@DrJAKing:对不起,它对我有用“有时”,并不总是。 – Danosaure 2010-11-23 16:12:18

0

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

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

1

这不是一个真正的答案,但pyPdf的问题是这样的:它还不支持CMaps。 PDF允许字体使用CMaps将字符ID(PDF中的字节)映射到Unicode字符代码。当你有一个包含非ASCII字符的PDF时,可能有一个CMap正在使用,甚至有时候没有非ASCII字符。当pyPdf遇到不是标准Unicode编码的字符串时,它只会看到一堆字节码;它不能将这些字节转换为Unicode,所以它只是给你空字符串。我实际上也遇到了同样的问题,目前我正在处理源代码。这很耗时,但我希望在2011年左右的时候向维护人员发布补丁。

0

我有类似的问题,对某些PDF文件和Windows,这是对我工作的优良:

1.-下载xpdf工具从xpdf的 - 工具 - 窗户

2:复制pdftotext.exe赢得-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)