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

31 投票
3 回答
98207 浏览
提问于 2025-04-15 20:37

我有一些代码是用来从pdf文件中读取内容的。有没有办法用Pypdf在Windows上逐行读取pdf文件的内容(不是按页读取),而且我用的是Python 2.6?

下面是读取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()

3 个回答

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 获取 pdf 内容文本",所以这里有个方法:(这就是我找到这个的方式)

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

在编程中,有时候我们需要处理一些数据,这些数据可能来自不同的地方,比如用户输入、文件或者网络请求。为了让程序能够理解和使用这些数据,我们通常会把它们转换成一种统一的格式。

这种转换的过程就叫做“解析”。解析的意思就是把复杂的东西拆解成简单的部分,方便我们理解和使用。例如,如果我们收到一个包含很多信息的字符串,我们需要把它分开,提取出我们需要的部分。

在编程中,解析的方式有很多种,具体取决于数据的格式。有些数据是以JSON格式存储的,这是一种很常见的轻量级数据交换格式。还有一些数据可能是XML格式,或者是其他格式。

总之,解析就是让程序能够理解和处理数据的一种方法。通过解析,我们可以把各种各样的数据转化为程序可以使用的形式,从而实现更复杂的功能。

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 
14

看起来你有一大段文本数据,想要逐行读取和处理。

你可以使用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())

撰写回答