使用pdfminer逐页阅读基于图像的pdf

问题描述

我正在运行一个脚本,该脚本使用 pdfminer 来拆分页面并逐页分析文档。 我的脚本是这样一页一页的:

from pdfminer.pdfinterp import PDFResourceManager,pdfpageInterpreter
from pdfminer.pdfpage import pdfpage
from pdfminer.converter import TextConverter
from pdfminer.layout import LAParams
from io import StringIO
from pdfminer.pdfdocument import PDFDocument
import PyTesseract

fp = open(pdf_path,'rb')
data = []
rsrcmgr = PDFResourceManager()
retstr = StringIO()
codec = 'utf-8'
laparams = LAParams()
device = TextConverter(rsrcmgr,retstr,laparams=laparams)
# Create a PDF interpreter object.
interpreter = pdfpageInterpreter(rsrcmgr,device)
# Process each page contained in the document.

for pageNumber,page in enumerate(pdfpage.get_pages(fp)):
    # Read PDF page,write text into stream
    interpreter.process_page(page)
    text = retstr.getvalue()

但是,有时我会得到基于图像的 pdf 并且我的 text 变量变空。我找不到“convert_image_to_string”pdfminer 函数,所以我找到了一个带有 pdf2image 的选项

for pageNumber,page in enumerate(pdfpage.get_pages(fp)): #prevIoUs code
    # Read PDF page,write text into stream               #prevIoUs code
    interpreter.process_page(page)                        #prevIoUs code
    text = retstr.getvalue()                              #prevIoUs code

    if len(text)<100:                                     #new code
        from pdf2image import convert_from_path           #new code
        img=convert_from_path(page,350)                   #new code
        text=PyTesseract.image_to_string(page)            #new code

但我需要在 pdf2image.convert_from_path 中输入一个文件路径,并且由于我之前的代码一个 pdfminer 页面对象作为输出,我得到的返回是 TypeError: expected str,bytes or os.pathLike object,not pdfpage。因此,我非常感谢您提出以下建议:

a) 使用 pdfminer 将图像 pdf 转换为文本或;

b) 使用 pdfminer 以某种方式将 pdf 页面保存在某处,我可以使用 file_path 作为 pdf2image.covert_from_path

的输入

解决方法

好吧,没有人回答,我发现的解决方法是放弃 pdf miner,专注于 pdf2image 和 pytesseract。希望它可以帮助有相同问题的人。

from pdf2image import convert_from_path
import pytesseract

pdf=PdfFileReader(pdf_path)
numpages=pdf.getNumPages()

for pageNumber in range(numpages):
    page = pdf.getPage(pageNumber)
    text=page.extractText()
    if len(text)<100:
        pdfWriter=PdfFileWriter()
        pdfWriter.addPage(pdf.getPage(pageNumber))
        with open("pdfpage.pdf",'wb') as f:
            pdfWriter.write(f)
            f.close()
        
        imgpath="/Users/pdfpage.pdf"
        img=convert_from_path(imgpath,350)[0]
        try:text=pytesseract.image_to_string(img)
        except:text="no text"