我正在使用Python pdfminer库从PDF中提取文本和图像。由于 TextConverter 类默认写入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/'
。这也很好用,但是我现在希望将图像"写入"文件对象而不是文件系统,以便我可以对它们进行一些后期处理。
类定义一个文件(fp = file(path, 'wb')
(,然后写入该文件。我想要的是我的extractTextAndImagesFromPDF()
函数也可以返回文件对象列表,而不是直接将它们写入文件。我想我也需要使用StringIO
,但我不知道怎么做。部分原因是写入文件发生在pdfminer中。
有谁知道我如何返回文件对象列表而不是将图像写入文件系统?欢迎所有提示!
这里有一个技巧,允许您提供自己的文件指针来写入:
# 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
在其他地方使用,则行为保持不变。