2016-10-18 2 views
0

나는 pdfminer (https://pypi.python.org/pypi/pdfminer2)를 사용하여 pdf 변환을 시도하는 scrapy spider에서 작업 중입니다. 실제 PDF를 디스크에 저장하는 것에 관심이 없으므로 io.bytesIO 하위 클래스 https://docs.python.org/2/library/io.html#buffered-streams을 살펴 보도록 권유 받았습니다. Creating bytesIO object을 바탕으로, 나는 PDF 본체와 bytesIO 클래스를 초기화했지만, 지금은 데이터를 열고 따라 필요 예를 들어 지금까지 나는이 http://zevross.com/blog/2014/04/09/extracting-tabular-data-from-a-pdf-an-example-using-python-and-regular-expressions/에 따라 기본적인 사용 http://www.unixuser.org/~euske/python/pdfminer/programming.html 같은 :읽기 용으로 pdf bytestring 열기

in_memory_pdf = BytesIO(bytes(response.body)) 
    in_memory_pdf.seek(0) 

    rsrcmgr = PDFResourceManager() 
    retstr = StringIO() 

    codec = 'utf-8' 
    laparams = LAParams() 
    device = TextConverter(rsrcmgr, retstr, codec=codec, laparams=laparams) 

    fp = file(in_memory_pdf, 'rb') 

    interpreter = PDFPageInterpreter(rsrcmgr, device) 
    password = "" 
    maxpages = 0 
    caching = True 
    pagenos=set() 
    for page in PDFPage.get_pages(fp, pagenos, maxpages=maxpages, password=password,caching=caching, check_extractable=True): 
     interpreter.process_page(page) 
    fp.close() 
    device.close() 
    st = retstr.getvalue() 
    retstr.close() 
    print st 

내가 실행 이걸 얻을 :

fp = file(in_memory_pdf, 'rb') 
TypeError: coercing to Unicode: need string or buffer, _io.BytesIO found 

처리를 위해이 PDF 바이 트린을 어떻게 열 수 있습니까? 내가 갖는 제안 된 변경 후

:

2016-10-17 23:59:35 [root] DEBUG: exec: ET 
2016-10-17 23:59:35 [root] DEBUG: nexttoken: (2819L, /'Q') 
2016-10-17 23:59:35 [root] DEBUG: do_keyword: pos=2819L, token=/'Q', stack=[] 
2016-10-17 23:59:35 [root] DEBUG: add_results: ((2819L, /'Q'),) 
2016-10-17 23:59:35 [root] DEBUG: nextobject: (2819L, /'Q') 
2016-10-17 23:59:35 [root] DEBUG: exec: Q 

Traceback (most recent call last): 
    File "C:\\site-packages\twisted\internet\defer.py", line 588, in _runCallbacks 
    current.result = callback(current.result, *args, **kw) 
    File "C:\j1\spiders\j1_spider.py", line 235, in parse_pdf_to_html 
    interpreter.process_page(page) 
    File "C:\\site-packages\pdfminer\pdfinterp.py", line 835, in process_page 
    self.device.end_page(page) 
    File "C:\\site-packages\pdfminer\converter.py", line 53, in end_page 
    self.receive_layout(self.cur_item) 
    File "C:\\site-packages\pdfminer\converter.py", line 206, in receive_layout 
    render(ltpage) 
    File "C:\\site-packages\pdfminer\converter.py", line 196, in render 
    render(child) 
    File "C:\\site-packages\pdfminer\converter.py", line 196, in render 
    render(child) 
    File "C:\\site-packages\pdfminer\converter.py", line 196, in render 
    render(child) 
    File "C:\\site-packages\pdfminer\converter.py", line 198, in render 
    self.write_text(item.get_text()) 
    File "C:\\site-packages\pdfminer\converter.py", line 189, in write_text 
    self.outfp.write(text) 
TypeError: unicode argument expected, got 'str' 
+0

'fp = file (in_memory_pdf, 'rb')'를'fp = in_memory_pdf'로 변경해보십시오. –

+0

부분적으로 작동했습니다. 편집 – user61629

답변

1

이 두 가지 문제가 있습니다

  1. in_memory_pdfstr (또는 Py3에서 bytes)에 대한 파일 - 류의 객체가 이미이 될 수 있습니다 열지 않고 직접 사용. 따라서 fp = file(in_memory_pdf, 'rb')fp = in_memory_pdf으로 부분적으로 변경하십시오.
  2. TextConverter의 두 번째 매개 변수는 str (또는 Py3의 경우 bytes)의 파일과 비슷한 객체 여야합니다. 하지만 은 unicode (또는 Py3에서는 str)입니다. 따라서 retstr = StringIO()retstr = BytesIO()으로 변경해야합니다.
+0

고맙습니다. – user61629