Textract无法读取JpegImageFile(StringIO对象)

时间:2017-04-04 16:17:09

标签: python text-extraction stringio

我认为类似内存文件的对象应该像文件一样运行。我无法让Textract“读”一个

<StringIO.StringIO instance at 0x05039EB8>

虽然如果我将JPEG文件保存到磁盘并在正常过程中读取,程序运行正常。

根据Ned Batchelder的优秀博客Extracting JPGs from PDFs,正在从pdf中提取jpeg文件。相关代码如下:

type(jpg) --> str (on 2.7)
buff = StringIO.StringIO()
buff.write(jpg)
buff.seek(0)
type(buff) --> instance
print buff --><StringIO.StringIO instance at 0x05039EB8>
dt=Image.open(buff)
print dt --><PIL.JpegImagePlugin.JpegImageFile image mode=RGB size=2630x597 at 0x58C2A90>
text=textract.process(dt)`

此行失败。 Textract无法读取JpegImageFile 如果我做

text=textract.process(buff.getvalue())

我收到错误:must be encoded string without NULL bytes, not str

如何让Textract从内存中的文件或流中读取?

1 个答案:

答案 0 :(得分:0)

我找到了解决方案;内存中的文件不是处理遗留代码的方法。将jpg提取路由到硬编码的tempfile工作。

tempfile.NamedTemporaryFile

将数据流写入tempfile和textract.process它有点乏味;我无法弄清楚BytesIO / StringIO方式将字节流传递给textract。根据Textract文档,它需要一个文件。更新的解决方法代码段:

pdf = file('file name', "rb").read()

startmark = "\xff\xd8"
startfix = 0
endmark = "\xff\xd9"
endfix = 2
i = 0

njpg = 0
while True:
    istream = pdf.find("stream", i)
    if istream < 0:
        break
    istart = pdf.find(startmark, istream, istream+20)
    if istart < 0:
    i = istream+20
        continue
    iend = pdf.find("endstream", istart)
    if iend < 0:
        raise Exception("Didn't find end of stream!")
    iend = pdf.find(endmark, iend-20)
    if iend < 0:
        raise Exception("Didn't find end of JPG!")

    istart += startfix
    iend += endfix
    print "JPG %d from %d to %d" % (njpg, istart, iend)
    jpg = pdf[istart:iend]

    njpg += 1
    i = iend

import tempfile
temp=tempfile.NamedTemporaryFile(delete=False,suffix='.jpg')
temp.write(jpg)
temp.close()
text=textract.process(temp.name)
print text

信息:Win7上的Python 2.7;强制UTF-8编码

reload(sys)
sys.setdefaultencoding('UTF8'). 

希望这有助于某人,因为textract实际上是一段很棒的代码。 pdf到jpeg转换器代码是礼貌的Ned Batchelder Extracting JPGs from PDFs(2007)。