¿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!
Muy buen aporte, muchas gracias!!