2014-10-21 10 views
49

Python Version 2.7Extrahieren von Text aus einer PDF-Datei mit PDFMiner in Python?

Ich suche Dokumentation oder Beispiele zur Eingabe von Text aus einer PDF-Datei mit Python PDFMiner zu extrahieren.

Offenbar hat PDFMiner ihre API aktualisiert und alle relevanten Beispiele, die ich gefunden habe, enthalten veralteten Code (Klassen und Methoden haben sich geändert). Die Bibliotheken, die ich gefunden habe, die die Aufgabe erleichtern, Text aus einer PDF-Datei zu extrahieren, verwenden die alte PDFMiner-Syntax, so dass ich mir nicht sicher bin, wie das geht.

So wie es ist, schaue ich nur auf Quellcode, um zu sehen, ob ich es herausfinden kann.

+1

Bitte beachten Sie auch http://stackoverflow.com/help/how-to-ask und http://stackoverflow.com/help/mcve und aktualisiere deine Antwort so, dass sie in einem besseren Format ist und den Richtlinien entspricht. – Parker

+0

Welche Python-Distribution verwenden Sie, 2.7.x oder 3.x.x? Es sei darauf hingewiesen, dass der Autor explizit * ausführte, dass 'PDFminer' nicht mit Python 3.x.x funktioniert. Das könnte der Grund sein, dass Sie "Import" -Fehler bekommen. Sie sollten 'pdfminer3k' verwenden, wenn dies der Fall ist, da es sich um den Python 3 Import dieser Bibliothek handelt. – Manhattan

+0

@Nanashi, sorry, ich habe vergessen, meine Python-Version hinzuzufügen. Es ist 2,7, also ist das nicht das Problem. Ich habe den Quellcode durchgesehen und es sieht so aus, als hätten sie einige Dinge umstrukturiert, weshalb die Importe kaputt gehen. Ich kann auch keine Dokumentation für PDFMiner finden oder ich würde nur davon arbeiten :( – DuckPuncher

Antwort

115

Hier ist ein funktionierendes Beispiel für Text aus einer PDF-Datei extrahiert die aktuelle Version von PDFMiner (September 2016)

from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter 
from pdfminer.converter import TextConverter 
from pdfminer.layout import LAParams 
from pdfminer.pdfpage import PDFPage 
from cStringIO import StringIO 

def convert_pdf_to_txt(path): 
    rsrcmgr = PDFResourceManager() 
    retstr = StringIO() 
    codec = 'utf-8' 
    laparams = LAParams() 
    device = TextConverter(rsrcmgr, retstr, codec=codec, laparams=laparams) 
    fp = file(path, '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) 

    text = retstr.getvalue() 

    fp.close() 
    device.close() 
    retstr.close() 
    return text 

PDFMiner Struktur vor kurzem geändert verwenden, so sollte diese Arbeit von Text aus PDF-Dateien zum Extrahieren.

bearbeiten: Still ab 1. Februar 2017.

+1

funktioniert gut, aber wie kann ich mit Leerzeichen in beispielsweise Namen umgehen? Angenommen, ich habe eine pdf, die 4 Spalten enthält, wo ich Vor- und Nachname in einem col habe, jetzt wird es mit Vorname in einer Zeile und Nachname in einer Zeile geparst, hier ist ein Beispiel http://docdro.id/rRyef3x – Deusdeorum

+2

Derzeit bekommen ein Importfehler mit diesem Code: ImportError: Kein Modul mit dem Namen 'pdfminer.pdfpage' –

+0

@Jefe, make sur Sie ausführen, installieren nach dem Download pdfminer. – Francois

16

hervorragende Antwort von DuckPuncher, für Python3 stellen Sie sicher, Sie installieren pdfminer2 und tun arbeiten:

import io 

from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter 
from pdfminer.converter import TextConverter 
from pdfminer.layout import LAParams 
from pdfminer.pdfpage import PDFPage 


def convert_pdf_to_txt(path): 
    rsrcmgr = PDFResourceManager() 
    retstr = io.StringIO() 
    codec = 'utf-8' 
    laparams = LAParams() 
    device = TextConverter(rsrcmgr, retstr, codec=codec, laparams=laparams) 
    fp = open(path, '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) 

    text = retstr.getvalue() 

    fp.close() 
    device.close() 
    retstr.close() 
    return text 
+0

Es funktioniert nicht für mich: ModuleNotFoundError: Kein Modul mit dem Namen 'pdfminer.pdfpage' ich bin mit Python 3.6 – Atti

+0

@Atti, nur für den Fall, stellen Sie sicher, dass Sie pdfminer2 installiert haben, da es ein anderes Paket pdfminer (ich hasse das). Es funktioniert für pdfminer2 == 20151206 Version, wenn Sie pip3 einfrieren. –

+1

danke ich habe es funktioniert schließlich installiert ich pdfminer.six von Conda Schmiede – Atti