如何使用 PyPDF2 从 PDF 中以正确的顺序提取文本?

How do I extract text in the right order from PDF using PyPDF2?

我目前正在做一个提取 PDF 内容的项目。代码运行流畅,我能够提取文本,但提取的文本顺序不正确。该代码以一种奇怪的方式提取文本。文本的顺序无处不在。它没有从上到下,真的很混乱。

我在网上查了一下,但对如何订购文本提取的帮助很少。大多数教程都得出了相同的结果。作为参考,这是我目前正在测试的 PDF(第 5 页):https://www.pidm.gov.my/PIDM/files/13/134b5c79-5319-4199-ac68-99f62aca6047.pdf

    import PyPDF2

with open('pdftest2.pdf', 'rb') as pdfTest:
    reader = PyPDF2.PdfFileReader(pdfTest)
    page5 = reader.getPage(4)
    text = page5.extractText()
    print(text)

提取的文本总是从页面的页脚开始,然后从下到上。我注意到在下一页中它会从上到下开始,但只针对几个特定的​​句子。然后它会从页面的不同位置提取文本,而不是从它停止的地方继续。

确实提取了所有文本,但提取的顺序各不相同。这个问题有解决办法吗?

我不得不处理一个类似的问题,结果发现模块 pdfplumberPyPDF 工作得更好。我想这取决于文件本身,你应该试试。

否则,您的问题的另一个答案是使用 pdf2image 模块将 PDF 视为图像并使用 pytesseract 提取其中的文本。然而,它可能不是完美的方法,因为 pdf2image 方法 convert_from_path 可能需要很长时间才能 运行.

如果你有兴趣,我会把一些代码放在这里。

首先确保安装所有必要的依赖项以及 Tesseract 和 ImageMagik。您可以在网站上找到有关安装的任何信息。如果您正在使用 windows,那么有一篇很好的 Medium 文章 here

要使用 pdf2image 将 PDF 转换为图像:

如果您正在处理 windows,请不要忘记添加您的 poppler 路径。它应该看起来像这样 r'C:\<your_path>\poppler-21.02.0\Library\bin'

def pdftoimg(fic,output_folder, poppler_path):
    # Store all the pages of the PDF in a variable 
    pages = convert_from_path(fic, dpi=500,output_folder=output_folder,thread_count=9, poppler_path=poppler_path) 

    image_counter = 0

    # Iterate through all the pages stored above 
    for page in pages: 
        filename = "page_"+str(image_counter)+".jpg"
        page.save(output_folder+filename, 'JPEG') 
        image_counter = image_counter + 1
        
    for i in os.listdir(output_folder):
        if i.endswith('.ppm'):
            os.remove(output_folder+i)

从图片中提取文字:

你的 tesseract 路径将是这样的:r'C:\Program Files\Tesseract-OCR\tesseract.exe'

def imgtotext(img, tesseract_path):
    # Recognize the text as string in image using pytesserct 
    pytesseract.pytesseract.tesseract_cmd = tesseract_path
    text = str(((pytesseract.image_to_string(Image.open(img))))) 
    text = text.replace('-\n', '')
    
    return text