【问题标题】:Converting a remote PDF's pages to temporary images for OCR将远程 PDF 的页面转换为 OCR 的临时图像
【发布时间】:2015-06-28 00:39:11
【问题描述】:

我有一个远程 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()

我曾想过使用cStringIOtempfile,但我不知道如何将它们用于此目的。

如何解决这个问题?

【问题讨论】:

    标签: python pdf wand python-tesseract


    【解决方案1】:

    有几个选项可以做到这一点,考虑到您提供的代码,更兼容的方式是将图像临时存储在该目录中,然后在使用 pytesseract 读取文本后删除它们。我创建了一个 wand 类型的图像以分别从 PDF 中提取每个图像,然后将其转换为 pytesseract 的 PIL 类型图像。这是我用于此的代码,将检测到的文本写入数组“文本”,其中每个元素都是原始 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 将图像提取为 blob,将其转换为 numpy 数组,然后将其转换为 pytesseract 的 PIL 图像在 (reference) 上执行 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)))
    

    【讨论】:

      猜你喜欢
      • 2012-01-21
      • 2015-09-18
      • 2011-08-03
      • 1970-01-01
      • 1970-01-01
      • 2011-05-30
      • 2022-10-20
      • 2014-06-06
      • 2015-08-12
      相关资源
      最近更新 更多