Преобразование страниц удаленного PDF во временные изображения для распознавания текста
У меня есть удаленный PDF-файл, который мне нужно читать постранично, и я продолжаю передавать каждый в OCR, который даст мне текст OCR.
import pytesseract
from pyPdf import PdfFileWriter, PdfFileReader
import cStringIO
from wand.image import Image
import urllib2
import tempfile
import pytesseract
from PIL import Image
remoteFile = urllib2.urlopen(urllib2.Request("file:///home/user/Documents/TestDocs/test.pdf")).read()
memoryFile = cStringIO.StringIO(remoteFile)
pdfFile = PdfFileReader(memoryFile)
for pageNum in xrange(pdfFile.getNumPages()):
currentPage = pdfFile.getPage(pageNum)
## somehow convert currentPage to wand type
## image and then pass to tesseract-api
##
## TEMP_IMAGE = some conversion to temp file
## pytesseract.image_to_string(Image.open(TEMP_IMAGE))
memoryFile.close()
Я думал об использовании cStringIO
или же tempfile
но я не могу понять, как использовать их для этой цели.
Как можно решить эту проблему?
1 ответ
Для этого есть несколько вариантов, более совместимый способ, учитывая предоставленный вами код, - временно сохранить изображения в этом каталоге, а затем удалить их после прочтения текста с помощью pytesseract. Я создаю изображение типа палочки, чтобы извлечь каждое изображение из PDF по отдельности, а затем преобразовать его в изображение типа PIL для pytesseract. Вот код, который я использовал для этого, когда обнаруженный текст выводится в массив 'text', где каждый элемент является изображением в исходном PDF, я также обновил некоторые из ваших импортов, чтобы сделать его совместимым с Python3 (cStringIO->io и urllib2->urllib.request).
import PyPDF2
import os
import pytesseract
from wand.image import Image
from PIL import Image as PILImage
import urllib.request
import io
with urllib.request.urlopen('file:///home/user/Documents/TestDocs/test.pdf') as response:
pdf_read = response.read()
pdf_im = PyPDF2.PdfFileReader(io.BytesIO(pdf_read))
text = []
for p in range(pdf_im.getNumPages()):
with Image(filename='file:///home/user/Documents/TestDocs/test.pdf' + '[' + str(p) + ']') as img:
with Image(image = img) as converted: #Need second with to convert SingleImage object from wand to Image
converted.save(filename=tempFile_Location)
text.append(pytesseract.image_to_string(PILImage.open(tempFile_Location)))
os.remove(tempFile_Location)
В качестве альтернативы, если вы хотите избежать создания и удаления временного файла для каждого изображения, вы можете использовать numpy и OpenCV для извлечения изображения в виде большого двоичного объекта, преобразовать его в массив numpy и затем превратить его в изображение PIL для pytesseract для выполнения OCR на ( ссылка)
import PyPDF2
import os
import pytesseract
from wand.image import Image
from PIL import Image as PILImage
import urllib.request
import io
import numpy as np
import cv2
with urllib.request.urlopen('file:///home/user/Documents/TestDocs/test.pdf') as response:
pdf_read = response.read()
pdf_im = PyPDF2.PdfFileReader(io.BytesIO(pdf_read))
text = []
for p in range(pdf_im.getNumPages()):
with Image(filename=('file:///home/user/Documents/TestDocs/test.pdf') + '[' + str(p) + ']') as img:
img_buffer=np.asarray(bytearray(img.make_blob()), dtype=np.uint8)
retval = cv2.imdecode(img_buffer, cv2.IMREAD_GRAYSCALE)
text.append(pytesseract.image_to_string(PILImage.fromarray(retval)))