2010-06-30 80 views
7

Tengo un montón de archivos PDF que necesito convertir a TXT. Desafortunadamente, cuando uso una de las muchas utilidades disponibles para hacer esto, pierde todo el formato y todos los datos tabulados en el PDF se confunden. ¿Es posible usar Python para extraer el texto del PDF especificando posiciones, etc.?Extraer texto del PDF

Gracias.

+0

¿Has buscado una biblioteca que te ayude con esto? –

+0

No he encontrado ninguno para leerlos, pero un montón de ellos por escribirlos. –

Respuesta

3

Los archivos PDF no contienen datos tabulares a menos que contengan contenido estructurado. Algunas herramientas incluyen heurística para tratar de adivinar la estructura de datos y regresarla. Me escribió un artículo en el blog que explica los problemas con la extracción de texto PDF en http://www.jpedal.org/PDFblog/2009/04/pdf-text/

+0

¿Hay alguna manera de verificar si un PDF está etiquetado como contenido estructurado de Adobe como escribió en su publicación de blog? Gracias, –

+0

. Necesita ver si las etiquetas están presentes. –

+0

Ese enlace parece estar muerto. ¿Tienes una nueva URL? –

1

tuve un problema similar y terminó usando XPDF de http://www.foolabs.com/xpdf/ Una de las utilidades se pdftotext, pero supongo que todo viene haciendo, cómo el PDF fue producido.

+1

Intenté varios métodos también. Utilicé PyPDF, PDF Miner e incluso el uso de Acrobat para guardar en texto. Ninguno de ellos funcionó tan bien como cualquiera de los pfftotext de xpdf usando la opción -layout. No me molestaría con nada más. – chrisfs

1
$ pdftotext -layout thingwithtablesinit.pdf 

producirá un archivo de texto thingwithtablesinit.txt con las tablas correctas.

0

Como se explica en otras respuestas, extraer texto de PDF no es una tarea sencilla. Sin embargo, hay ciertas bibliotecas de Python como pdfminer (pdfminer3k para Python 3) que son razonablemente eficientes.

El siguiente fragmento de código muestra una clase de Python que se puede crear una instancia para extraer texto de PDF. Esto funcionará en la mayoría de los casos.

(fuente - 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") 

Nota - Hay otras bibliotecas como PyPDF2 que son buenos en la transformación de un PDF, tales como la fusión de las páginas en PDF, dividir o recortar las páginas específicas de PDF, etc.

Cuestiones relacionadas