¿Es posible extraer el texto de un pdf y generar un archivo de texto plano para su posterior tratamiento?

El formato pdf está muy extendido, es el soporte perfecto para cualquier documento que no precise modificación. Compacto, multiplataforma y ligero.

Es posible que tengamos cientos de pdfs con información útil pero a veces es dificil localizar el documento que necesitamos. Ciertas tareas de indexación y extracción de información pueden automatizarse ahorrando costes y tiempo de manera significativa.

Para la manipulación de archivos pdf vamos a utilizar la libreria python pdfminer3k.

Instalación de pdfminer3k

Como siempre, la instalación en sencilla, desde el shell ejecutar.

sudo -H pip3 install pdfminer3k
  • Un consejo, pdfminer3k no es pdfminer.six, si se instalan ambas hay conflicto entre ellas y no funcionarán correctamente.

El código, extracción del texto de un pdf

Bien, el siguiente ejemplo muestra como leer el texto de un pdf y guardarlo en un archivo plano.

Para ello abrimos el pdf y recorremos el mismo, las páginas y los objetos que las contienen.

Los objetos que nos interesan son los LTTextBox, más adelante trabajaremos con las imagenes y haremos OCR de las mismas para mejorar el resultado.

Incluimos las dependencias a pdfminer3k.

# -*- coding: utf-8 -*-
"""
Created on Thu Sep 13 10:55:00 2018
dge
@author: altaruru
"""
from pathlib import Path
from pdfminer.pdfparser import PDFParser, PDFDocument
from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter
from pdfminer.converter import PDFPageAggregator
from pdfminer.layout import LAParams, LTTextBox, LTTextLine, LTImage, LTFigure

Creamos la función pdf2txt con dos parámetros, pdf a tratar y txt de salida:

def pdf2txt(pdfname, txtname):
    btxt=False
    try:
        fp = open(pdfname, 'rb')    
        parser = PDFParser(fp)
        doc = PDFDocument()
        parser.set_document(doc)
        doc.set_parser(parser)
        doc.initialize('')
        rsrcmgr = PDFResourceManager()
        laparams = LAParams()
    
        laparams.char_margin = 1.0
        laparams.word_margin = 1.0
        device = PDFPageAggregator(rsrcmgr, laparams=laparams)
        interpreter = PDFPageInterpreter(rsrcmgr, device)    
        ncount=0
        print("pdf2txt %s..." % pdfname) # informa por consola del nombre de archivo
    
        # abre archivo de texto para la salida
        fptxt = open(txtname, 'w')
        # recorre el documento procesando cada página
        for page in doc.get_pages():
            interpreter.process_page(page)
            layout = device.get_result()
            # recorre la página procesando cada objeto
            for lt_obj in layout:
                if isinstance(lt_obj, LTTextBox) or isinstance(lt_obj, LTTextLine):
                    spagetxt = lt_obj.get_text().strip() + " "
                    if(spagetxt!=""):
                        btxt=True
                        fptxt.write(spagetxt)
                        print(spagetxt)
                elif isinstance(lt_obj, LTFigure):
                    print("LTFigure, pte implementar!")
                    spagetxt=""
            ncount+=1
    
        print("end")
        fptxt.closed
        fp.closed
    except Exception as e:
        print("Error: %s" % (e))        
    return btxt

Y llamamos a la función:

pdf2txt("/home/nuse/Documentos/src/pysrc/imgs/Computer-Vision-Resources.pdf","/home/nuse/Documentos/src/pysrc/imgs/Computer-Vision-Resources.txt")

En el Terminal vemos el texto extraido.

Y el archivo de texto con el resultado:

Referencias

 

Hay una nueva entrada relacionada con esta que puede interesarte: Extraer texto de un pdf con Python II, OCR de imagenes embebidas en el pdf.

 

Namaste!

 

 

Un comentario sobre «Extraer texto de un pdf con Python, pdfminer3k»

  1. Sebastian Chaves

    Muy buen aporte, muchas gracias!!

Deja tu comentario