如何将提取的图像写入文件对象而不是文件系统?

时间:2014-12-15 09:38:24

标签: python pdf io stream pdfminer

我使用Python pdfminer library从PDF中提取文本和图像。由于TextConverter class默认写入sys.stdout,因此我使用StringIO将文本作为变量捕获,如下所示(请参阅粘贴:

def extractTextAndImagesFromPDF(rawFile):
    laparams = LAParams()
    imagewriter = ImageWriter('extractedImageFolder/')    
    resourceManager = PDFResourceManager(caching=True)

    outfp = StringIO()  # Use StringIO to catch the output later.
    device = TextConverter(resourceManager, outfp, codec='utf-8', laparams=laparams, imagewriter=imagewriter)
    interpreter = PDFPageInterpreter(resourceManager, device)
    for page in PDFPage.get_pages(rawFile, set(), maxpages=0, caching=True, check_extractable=True):
        interpreter.process_page(page)
    device.close()    
    extractedText = outfp.getvalue()  # Get the text from the StringIO
    outfp.close()
    return extractedText 

这适用于提取的文本。此功能的作用还包括提取PDF中的图像并将其写入'extractedImageFolder/'。这也很好,但我现在希望图像被写入&#34; <文件对象而不是文件系统,以便我可以对它们进行一些后期处理。

ImageWriter class定义一个文件(fp = file(path, 'wb')),然后写入该文件。我想要的是我的extractTextAndImagesFromPDF()函数也可以返回文件对象列表,而不是直接将它们写入文件。我想我也需要使用StringIO,但我不知道如何。部分原因还在于写入文件发生在pdfminer中。

有人知道如何返回文件对象列表而不是将图像写入文件系统吗?欢迎所有提示!

1 个答案:

答案 0 :(得分:1)

这是一个hack,允许您提供自己的文件指针来写入:

   # add option in aguments to supply your own file pointer
   def export_image(self, image, fp=None):
        ...
        # change this line:
        # fp = file(path, 'wb')
        # add instead:
        fp = fp if fp else file(path, 'wb')
        ...
        # and this line:
        # return name
        # add instead:
        return (fp, name,) if fp else name

现在你需要使用:

# create file-like object backed by string buffer
fp = stringIO.stringIO()
image_fp, name = export_image(image, fp)

,您的图片应存储在fp

请注意export_image的行为,如果在其他地方使用,则保持不变。