2014-10-21 15 views
49

Python w wersji 2.7Wyodrębnianie tekstu z pliku PDF za pomocą PDFMiner w python?

szukam dokumentacji lub przykładów, w jaki sposób wyodrębnić tekst z pliku PDF za pomocą PDFMiner z Pythona.

Wygląda na to, że PDFMiner zaktualizował swoje API, a wszystkie znalezione przykłady zawierają przestarzały kod (zmieniono klasy i metody). Biblioteki, które znalazłem, które ułatwiają wydobywanie tekstu z pliku PDF, używają starej składni PDFMiner, więc nie jestem pewien, jak to zrobić.

Po prostu patrzę na kod źródłowy, żeby sprawdzić, czy mogę to zrozumieć.

+1

proszę sprawdzić http://stackoverflow.com/help/how-to-ask i http://stackoverflow.com/help/mcve i zaktualizuj odpowiedź, aby była w lepszym formacie i dostosowała się do wytycznych. – Parker

+0

Jakiej dystrybucji Python używasz, 2.7.x lub 3.x.x? Należy zauważyć, że autor * wyraźnie * wyszczególnił, że 'PDFminer' nie działa z Pythonem 3.x.x. To może być powód, dla którego otrzymujesz błędy "importu". Powinieneś użyć 'pdfminer3k' jeśli tak, ponieważ jest to stały import Pythona 3 wspomnianej biblioteki. – Manhattan

+0

@Nanashi, przepraszam, zapomniałem dodać mojej wersji Pythona. To 2.7, więc to nie jest problem. Przeglądałem kod źródłowy i wygląda na to, że restrukturyzowali pewne rzeczy, dlatego import się psuje. Nie mogę znaleźć żadnej dokumentacji dla PDFMinera albo bym po prostu pracował nad tym :( – DuckPuncher

Odpowiedz

115

Oto przykład roboczych od wydobywania tekstu z pliku PDF przy użyciu aktualnej wersji PDFMiner (wrzesień 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 Struktura zmienił niedawno, więc to powinno działać do wydobywania tekstu z plików PDF.

Edit: Nadal pracuje jako z dnia 1 lutego 2017 r

+1

działa dobrze, ale, jak czy mogę zajmować się spacjami, na przykład nazwami? Przypuśćmy, że mam plik pdf zawierający 4 kolumny, w których mam imię i nazwisko w jednym colu, teraz parsuje się imię w jednym wierszu i nazwisko w jednym wierszu, oto przykład http://docdro.id/rRyef3x – Deusdeorum

+2

. błąd importu z tym kodem: ImportError: Brak modułu o nazwie "pdfminer.pdfpage" –

+0

@Jefe, make sur run uruchom make install po pobraniu pdfminer. – Francois

16

wspaniałe odpowiedź od DuckPuncher dla Python3 upewnić zainstalowaniu pdfminer2 i zrobić:

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

To nie działa dla mnie: ModuleNotFoundError: Brak modułu o nazwie "pdfminer.pdfpage". używając pythona 3.6 – Atti

+0

@Atti, na wszelki wypadek, upewnij się, że masz zainstalowany pdfminer2, ponieważ istnieje inny pakiet pdfminer (nienawidzę tego). Działa dla pdfminer2 == 20151206 wersji podczas robienia pip3 freeze. –

+1

dziękuję, że to działa, ostatecznie zainstalowałem pdfminer.six z conda forge – Atti