2017-04-04 14 views
0

메모리 내 파일과 유사한 객체가 파일처럼 작동한다고 가정합니다. 내가 Textract은 "읽기"로 얻을 수 없습니다 오전Textract에서 JpegImageFile (StringIO 객체)을 읽을 수 없습니다.

<StringIO.StringIO instance at 0x05039EB8> 

내가 디스크에 JPEG 파일을 저장하고 정상 과정에서 읽으면 프로그램이 잘 실행하지만.

jpeg 파일은 Ned Batchelder의 우수한 블로그 Extracting JPGs from PDFs에 따라 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이 메모리 파일이나 스트림에서 읽을 수 어떻게 must be encoded string without NULL bytes, not str

: 나는

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

을 할 경우 Textract 내가 오류를 얻을 JpegImageFile 를 읽을 수 없습니다?

답변

0

해결책을 찾았습니다. 메모리 내 파일은 레거시 코드를 다루는 방법이 아닙니다. jpg 추출물을 하드 코딩 된 tempfile으로 라우팅합니다.

tempfile.NamedTemporaryFile 

데이터 스트림을 임시 파일에 쓰고 textract.process it을 작성하는 것은 지루한 일입니다. BytesIO/StringIO 방식으로 바이트 스트림을 textract로 토퍼 아웃하는 방법을 알 수 없습니다. Textract docs에 따르면, 파일을 기대합니다. 업데이트 된 해결 방법 코드 조각 :

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 

정보 : Py7.7, Win7; textract 실제로 코드의 큰 부분이기 때문에 강제로 UTF-8 인코딩

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

희망이 사람을 도와줍니다. pdf에서 jpeg 로의 변환 코드는 Ned Batchelder Extracting JPGs from PDFs (2007)입니다.