2010-06-30 31 views
7

Ich habe eine Reihe von PDF-Dateien, die ich in TXT konvertieren muss. Leider, wenn ich eines der vielen verfügbaren Utilities verwende, um dies zu tun, verliert es alle Formatierungen und alle Tabellendaten in der PDF werden durcheinander gebracht. Ist es möglich, Python zu verwenden, um den Text aus der PDF-Datei zu extrahieren, indem Sie Positionen usw. angeben?Text aus PDF extrahieren

Danke.

+0

Haben Sie nach einer Bibliothek gesucht, die dabei helfen würde? –

+0

Ich habe keine gefunden, um sie zu lesen, aber eine Menge davon, um sie zu schreiben. –

Antwort

3

PDF-Dateien enthalten keine Tabellendaten, es sei denn, sie enthalten strukturierten Inhalt. Einige Tools beinhalten Heuristiken, um die Datenstruktur zu testen und zu erraten. Ich schrieb einen Blog-Artikel erklärt, die Probleme mit PDF-Text-Extraktion bei http://www.jpedal.org/PDFblog/2009/04/pdf-text/

+0

Gibt es eine Möglichkeit zu überprüfen, ob eine PDF-Datei als strukturierter Inhalt von Adobe markiert ist, wie Sie es in Ihrem Blogbeitrag geschrieben haben? Danke, –

+0

Sie müssen sehen, ob die Tags vorhanden sind. –

+0

Dieser Link scheint tot zu sein. Hast du eine neue URL? –

1

Ich hatte ein ähnliches Problem und am Ende mit XPDF von http://www.foolabs.com/xpdf/ Einem der utils ist PDFtoText, aber ich denke, es kommt alles bis zu, wie die PDF wurde produziert.

+1

Ich habe mehrere Methoden ausprobiert. Ich habe PyPDF und PDF Miner verwendet und sogar Acrobat zum Speichern in Text verwendet. Keiner von ihnen funktionierte so gut wie der pdftotext von xpdf mit der Option -layout. Ich würde mich um nichts anderes kümmern. – chrisfs

1
$ pdftotext -layout thingwithtablesinit.pdf 

erzeugt eine Textdatei thingwithtablesinit.txt mit den Tabellen rechts.

0

Wie in anderen Antworten erläutert, ist das Extrahieren von Text aus PDF keine einfache Aufgabe. Jedoch gibt es bestimmte Python-Bibliotheken wie pdfminer (pdfminer3k für Python 3), die einigermaßen effizient sind.

Das folgende Code-Snippet zeigt eine Python-Klasse, die instanziiert werden kann, um Text aus PDF zu extrahieren. Dies wird in den meisten Fällen funktionieren.

(Quelle - https://gist.github.com/vinovator/a46341c77273760aa2bb)

# Python 2.7.6 
# PdfAdapter.py 

""" Reusable library to extract text from pdf file 
Uses pdfminer library; For Python 3.x use pdfminer3k module 
Below links have useful information on components of the program 
https://euske.github.io/pdfminer/programming.html 
http://denis.papathanasiou.org/posts/2010.08.04.post.html 
""" 


from pdfminer.pdfparser import PDFParser 
from pdfminer.pdfdocument import PDFDocument 
from pdfminer.pdfpage import PDFPage 
# From PDFInterpreter import both PDFResourceManager and PDFPageInterpreter 
from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter 
# from pdfminer.pdfdevice import PDFDevice 
# To raise exception whenever text extraction from PDF is not allowed 
from pdfminer.pdfpage import PDFTextExtractionNotAllowed 
from pdfminer.layout import LAParams, LTTextBox, LTTextLine 
from pdfminer.converter import PDFPageAggregator 
import logging 

__doc__ = "eusable library to extract text from pdf file" 
__name__ = "pdfAdapter" 

""" Basic logging config 
""" 
log = logging.getLogger(__name__) 
log.addHandler(logging.NullHandler()) 


class pdf_text_extractor: 
    """ Modules overview: 
    - PDFParser: fetches data from pdf file 
    - PDFDocument: stores data parsed by PDFParser 
    - PDFPageInterpreter: processes page contents from PDFDocument 
    - PDFDevice: translates processed information from PDFPageInterpreter 
     to whatever you need 
    - PDFResourceManager: Stores shared resources such as fonts or images 
     used by both PDFPageInterpreter and PDFDevice 
    - LAParams: A layout analyzer returns a LTPage object for each page in 
     the PDF document 
    - PDFPageAggregator: Extract the decive to page aggregator to get LT 
     object elements 
    """ 

def __init__(self, pdf_file_path, password=""): 
    """ Class initialization block. 
    Pdf_file_path - Full path of pdf including name 
    password = If not passed, assumed as none 
    """ 
    self.pdf_file_path = pdf_file_path 
    self.password = password 

def getText(self): 
    """ Algorithm: 
    1) Txr information from PDF file to PDF document object using parser 
    2) Open the PDF file 
    3) Parse the file using PDFParser object 
    4) Assign the parsed content to PDFDocument object 
    5) Now the information in this PDFDocumet object has to be processed. 
    For this we need PDFPageInterpreter, PDFDevice and PDFResourceManager 
    6) Finally process the file page by page 
    """ 

    # Open and read the pdf file in binary mode 
    with open(self.pdf_file_path, "rb") as fp: 

     # Create parser object to parse the pdf content 
     parser = PDFParser(fp) 

     # Store the parsed content in PDFDocument object 
     document = PDFDocument(parser, self.password) 

     # Check if document is extractable, if not abort 
     if not document.is_extractable: 
      raise PDFTextExtractionNotAllowed 

     # Create PDFResourceManager object that stores shared resources 
     # such as fonts or images 
     rsrcmgr = PDFResourceManager() 

     # set parameters for analysis 
     laparams = LAParams() 

     # Create a PDFDevice object which translates interpreted 
     # information into desired format 
     # Device to connect to resource manager to store shared resources 
     # device = PDFDevice(rsrcmgr) 
     # Extract the decive to page aggregator to get LT object elements 
     device = PDFPageAggregator(rsrcmgr, laparams=laparams) 

     # Create interpreter object to process content from PDFDocument 
     # Interpreter needs to be connected to resource manager for shared 
     # resources and device 
     interpreter = PDFPageInterpreter(rsrcmgr, device) 

     # Initialize the text 
     extracted_text = "" 

     # Ok now that we have everything to process a pdf document, 
     # lets process it page by page 
     for page in PDFPage.create_pages(document): 
      # As the interpreter processes the page stored in PDFDocument 
      # object 
      interpreter.process_page(page) 
      # The device renders the layout from interpreter 
      layout = device.get_result() 
      # Out of the many LT objects within layout, we are interested 
      # in LTTextBox and LTTextLine 
      for lt_obj in layout: 
       if (isinstance(lt_obj, LTTextBox) or 
         isinstance(lt_obj, LTTextLine)): 
        extracted_text += lt_obj.get_text() 

    return extracted_text.encode("utf-8") 

Hinweis - Es gibt andere Bibliotheken wie PyPDF2, die bei Umwandlung eines PDF gut sind, wie zum Beispiel PDF-Seiten Verschmelzung, Spaltung oder Zuschneiden bestimmte Seiten aus PDF usw.