如何使用 PyPDF2 在 Python 3 中将 PDF 中的所有页面作为单个字符串检索

How to retrieve ALL pages from PDF as a single string in Python 3 using PyPDF2

为了从多页 PDF 中获取单个字符串,我正在这样做:

import PyPDF2
pdfFileObject = open('sample.pdf', 'rb')
pdfReader = PyPDF2.PdfFileReader(pdfFileObject)
count = pdfReader.numPages
for i in range(count):
    page = pdfReader.getPage(i)
    output = page.extractText()
output

结果是来自 单页 (文档中的最后一页)的字符串 - 正如根据 PyPDF2 documentation 应有的那样。我应用此方法是因为我读到一些人建议它阅读整个 PDF,但在我的情况下不起作用。

很明显,这是一个基本操作,对于我的经验不足,我提前表示歉意。我尝试了其他解决方案,如 Tika、PDFMiner 和 Textract,但到目前为止,PyPDF 似乎是唯一让我满意的解决方案。

如有任何帮助,我们将不胜感激。

更新:

按照建议,我将 output 定义为一个列表,然后将所有页面附加到它(正如我所想的那样)循环中的所有页面,如下所示:

for i in range(count):
    page = pdfReader.getPage(i)
    output = []
    output.append(page.extractText())

认为结果是列表中的单个字符串,如 ['sample content from the last page of PDF']

难道是因为这一行:

output = page.extractText()

试试这个:

output += page.extractText()

因为在您的代码中,您要覆盖 "output" 变量的值而不是附加到它。不要忘记在 for 循环之前声明 "output" 变量。所以 output = ''for i in range(count):

之前

您每次都在覆盖 output 变量。

虽然您可以使用 output += 将字节连接在一起,但使用列表可能更安全,在这种情况下,您可以在循环外定义 output = [],并替换 output = page.extractText()output.append(page.extractTest()).

此代码有效:

import os, glob, PyPDF2, sys

file_path = 'C:/Users/ipeter/Desktop/Webdriverdownloads'
read_files = glob.glob(os.path.join(file_path,'*.pdf'))

for files in read_files:
    pdfReader = PyPDF2.PdfFileReader(files)
    count = pdfReader.numPages
    output = []
    for i in range(count):
        page = pdfReader.getPage(i)
        output.append(page.extractText())
    print(output)

第一个循环读取文件夹中的所有文件。第二个循环读取 pdf 中的所有页面。

output[0] = pdfpage1
output[1] = pdfpage2
output[2] = pdfpage3

... 等等

如果您需要一个字符串中的整个 pdf,您可以保存 newoutput 使用连接函数:

seperator = ','
newoutput = seperator.join(output)

或简化:

newoutput = ','.join(output)

首先尝试将输出创建为空字符串..

output = ""
for i in range(pdfReader.numPages):
    pageObj = pdfReader.getPage(i)
    output += pageObj.extractText()