2017-04-04 175 views
0

我认为内存中类似文件的对象应该像文件一样行为。我没能获得Textract“读”一个Textract无法读取JpegImageFile(StringIO对象)

<StringIO.StringIO instance at 0x05039EB8> 

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

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

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从内存中的文件或流读?

回答

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)。