Преобразование страниц удаленного 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)))
Другие вопросы по тегам