我认为类似内存文件的对象应该像文件一样运行。我无法让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从内存中的文件或流中读取?
答案 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)。