如何使用PyPdf逐行读取PDF文件?

30

我有一些代码可以从PDF文件中读取内容。是否有一种使用Pypdf,在Windows上使用Python 2.6一行一行地读取PDF文件(而不是一页一页)的方法?

以下是读取PDF页面的代码:

import pyPdf

def getPDFContent(path):
    content = ""
    num_pages = 10
    p = file(path, "rb")
    pdf = pyPdf.PdfFileReader(p)
    for i in range(0, num_pages):
        content += pdf.getPage(i).extractText() + "\n"
    content = " ".join(content.replace(u"\xa0", " ").strip().split())
    return content

更新:

调用代码如下:

f= open('test.txt','w')
pdfl = getPDFContent("test.pdf").encode("ascii", "ignore")
f.write(pdfl)
f.close()

1
pypdf 已经停止开发很久了(我想大约是在2010年左右问这个问题的时候?)。现在请使用 PyPDF2(不是 PyPDF3 也不是 PyPDF4)。 - Martin Thoma
PyPDF2团队的注意事项: PyPDF2项目将回归其起源。PyPDF2==3.0.X将是PyPDF2的最后一个版本。 开发将继续进行,使用pypdf==3.1.0版本。 - undefined
3个回答

13

看起来你有一大块文本数据,想逐行解释它。

你可以使用StringIO类将该内容包装为可寻址的文件样对象:

>>> import StringIO
>>> content = 'big\nugly\ncontents\nof\nmultiple\npdf files'
>>> buf = StringIO.StringIO(content)
>>> buf.readline()
'big\n'
>>> buf.readline()
'ugly\n'
>>> buf.readline()
'contents\n'
>>> buf.readline()
'of\n'
>>> buf.readline()
'multiple\n'
>>> buf.readline()
'pdf files'
>>> buf.seek(0)
>>> buf.readline()
'big\n'
在您的情况下,执行以下操作:
from StringIO import StringIO

# Read each line of the PDF
pdfContent = StringIO(getPDFContent("test.pdf").encode("ascii", "ignore"))
for line in pdfContent:
    doSomething(line.strip())

同样的问题,这不起作用,它给了我整个页面,我只想逐行查看 :) - Rami Jarrar

11

使用 yieldPdfFileReader.pages 可以简化事情。

from pyPdf import PdfFileReader

def get_pdf_content_lines(pdf_file_path):
    with open(pdf_file_path) as f:
        pdf_reader = PdfFileReader(f)
        for page in pdf_reader.pages: 
            for line in page.extractText().splitlines():
                yield line

for line in get_pdf_content_lines('/path/to/file.pdf'):
    print line

另外, 有些人可能会在谷歌上搜索"python get pdf content text",这里是方法:(这就是我找到这里的方式)

from pyPdf import PdfFileReader

def get_pdf_content(pdf_file_path):
    with open(pdf_file_path) as f:
        pdf_reader = PdfFileReader(f)
        content = "\n".join(page.extractText().strip() for page in pdf_reader.pages)
        content = ' '.join(content.split())
        return content


print get_pdf_content('/path/to/file.pdf')

11
import pyPdf  
def getPDFContent(path):
    content = ""
    num_pages = 10
    p = file(path, "rb")
    pdf = pyPdf.PdfFileReader(p)
    for i in range(0, num_pages):
        content += pdf.getPage(i).extractText() + "\n"
    content = " ".join(content.replace(u"\xa0", " ").strip().split())     
    return content 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接