2016-10-18 4 views
0

Ich arbeite an einer Scrapy Spider, versuchen, pdfs zu konvertieren, mit pdfminer (https://pypi.python.org/pypi/pdfminer2). Ich habe kein Interesse daran, die aktuelle PDF-Datei auf der Festplatte zu speichern. Daher wurde mir geraten, in die io.bytesIO-Unterklasse unter https://docs.python.org/2/library/io.html#buffered-streams zu schauen. Basierend auf Creating bytesIO object habe ich die bytesIO Klasse mit dem pdf Körper initialisiert, aber jetzt muss ich die Daten öffnen und folgen und als Beispiel, wie die grundlegende Verwendung http://www.unixuser.org/~euske/python/pdfminer/programming.html Bisher basiert auf http://zevross.com/blog/2014/04/09/extracting-tabular-data-from-a-pdf-an-example-using-python-and-regular-expressions/ ich habe:Öffnen eines PDF-Bytestring zum Lesen

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 

Wenn ich laufen dies erhalte ich:

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

Wie kann ich diesen PDF-Bytestring zur Verarbeitung öffnen?

Nach der vorgeschlagenen Änderung Ich erhalte:

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

Versuchen Sie 'fp = file (in_memory_pdf, 'rb')' in 'fp = in_memory_pdf' zu ändern. –

+0

Dies teilweise funktioniert, siehe bearbeiten – user61629

Antwort

1

Es gibt zwei Probleme:

  1. in_memory_pdf ist bereits eine Datei-ähnliches Objekt für str (oder bytes in PY3) kann sein direkt benutzt ohne zu öffnen. So verändert sich fp = file(in_memory_pdf, 'rb') zu fp = in_memory_pdf teilweise gearbeitet.
  2. Der zweite Parameter von TextConverter sollte auch ein dateiähnliches Objekt für str (oder bytes in Py3) sein. Aber retstr in der Frage ist für unicode (oder str in Py3). Daher sollte retstr = StringIO() zu retstr = BytesIO() geändert werden.
+0

Vielen Dank! – user61629

Verwandte Themen