使用 pdfminer 逐页阅读基于图像的 pdf
Read image based pdfs with pdfminer in a page by page fashion
我是 运行 一个使用 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 页面对象作为输出,所以我得到的 return 是 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"
我是 运行 一个使用 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 页面对象作为输出,所以我得到的 return 是 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"