2014-10-21 33 views
49

Python Versione 2.7Estrazione di testo da un file PDF utilizzando PDFMiner in python?

Cerco documentazione o esempi su come estrarre il testo da un file PDF utilizzando PDFMiner con Python.

Sembra che PDFMiner abbia aggiornato la propria API e tutti gli esempi rilevanti che ho trovato contengano codice obsoleto (le classi e i metodi sono cambiati). Le librerie che ho trovato che semplificano l'estrazione di testo da un file PDF utilizzano la vecchia sintassi di PDFMiner, quindi non sono sicuro di come farlo.

Così com'è, sto solo guardando il codice sorgente per vedere se riesco a capirlo.

+1

Si prega di check out http://stackoverflow.com/help/how-to-ask e http://stackoverflow.com/help/mcve e aggiorna la risposta in modo che sia in un formato migliore e sia conforme alle linee guida. – Parker

+0

Quale distribuzione di Python stai utilizzando, 2.7.xo 3.x.x? Va notato che l'autore * ha esplicitamente * specificato che 'PDFminer' non funziona con Python 3.x.x. Questo potrebbe essere il motivo per cui stai ricevendo errori 'import'. Dovresti usare 'pdfminer3k' se è così, dato che è l'importazione permanente di Python 3 di detta libreria. – Manhattan

+0

@Nanashi, mi dispiace, ho dimenticato di aggiungere la mia versione Python. È 2,7 quindi non è questo il problema. Ho osservato il codice sorgente e sembra che abbiano ristrutturato alcune cose, motivo per cui le importazioni stanno crollando. Non riesco a trovare alcuna documentazione per PDFMiner o mi piacerebbe solo risolverlo :( – DuckPuncher

risposta

115

Ecco un esempio di lavoro di estrazione di testo da un file PDF utilizzando la versione corrente di PDFMiner (settembre 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 

della struttura PDFMiner cambiato di recente, quindi questo dovrebbe funzionare per estrarre il testo dai file PDF.

Edit: Ancora lavorando a partire dal 1 ° febbraio del 2017.

+1

funziona bene, ma, come posso occuparmi di spazi nei nomi di esempio? supponiamo Ho un pdf che contiene 4 colonne in cui ho Nome e cognome in uno col, ora di venire analizzato con cognome in una riga e cognome in una riga, ecco un esempio http://docdro.id/rRyef3x – Deusdeorum

+2

Attualmente ricevendo un errore di importazione con questo codice: ImportError: No module named 'pdfminer.pdfpage' –

+0

@Jefe, fanno sur si esegue make install dopo il download pdfminer. – Francois

16

risposta formidabile da DuckPuncher, per python3 assicurarsi di installare pdfminer2 e fare:

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

Non funziona per me: ModuleNotFoundError: No module named 'pdfminer.pdfpage' I Am usando python 3.6 – Atti

+0

@Atti, per ogni evenienza, assicurati di aver installato pdfminer2, in quanto esiste un altro pacchetto pdfminer (odio questo). Funziona per pdfminer2 == 20151206 versione quando si esegue il congelamento di pip3. –

+1

grazie ho funzionato alla fine, ho installato pdfminer.six da conda forge – Atti