Saltar al contenido

¿Extraer texto de un archivo PDF usando PDFMiner en Python?

Solución:

Aquí hay un ejemplo práctico de extracción de texto de un archivo PDF utilizando la versión actual de PDFMiner (septiembre de 2016)

from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter
from pdfminer.converter import TextConverter
from pdfminer.layout import LAParams
from pdfminer.pdfpage import PDFPage
from io 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 = 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

La estructura de PDFMiner cambió recientemente, por lo que debería funcionar para extraer texto de los archivos PDF.

Editar : Sigue funcionando a partir del 7 de junio de 2018. Verificado en la versión 3.x de Python

Editar: la solución funciona con Python 3.7 el 3 de octubre de 2019. Usé la biblioteca de Python pdfminer.six, lanzado en noviembre de 2018.

excelente respuesta de DuckPuncher, para Python3 asegúrese de instalar pdfminer2 y haga:

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)



    fp.close()
    device.close()
    text = retstr.getvalue()
    retstr.close()
    return text

Esto funciona en mayo de 2020 usando PDFminer six en Python3.

Instalando el paquete

$ pip install pdfminer.six

Importando el paquete

from pdfminer.high_level import extract_text

Usando un PDF guardado en disco

text = extract_text('report.pdf')

O alternativamente:

with open('report.pdf','rb') as f:
    text = extract_text(f)

Usando PDF que ya está en la memoria

Si el PDF ya está en la memoria, por ejemplo, si se recupera de la web con la biblioteca de solicitudes, se puede convertir a una secuencia utilizando el io Biblioteca:

import io

response = requests.get(url)
text = extract_text(io.BytesIO(response.content))

Rendimiento y confiabilidad en comparación con PyPDF2

PDFminer.six funciona de manera más confiable que PyPDF2 (que falla con ciertos tipos de PDF), en particular PDF versión 1.7

Sin embargo, la extracción de texto con PDFminer.six es significativamente más lenta que PyPDF2 en un factor de 6.

He cronometrado la extracción de texto con timeit en un MBP de 15 “(2018), cronometrando solo la función de extracción (sin apertura de archivos, etc.) con un PDF de 10 páginas y obtuve los siguientes resultados:

PDFminer.six: 2.88 sec
PyPDF2:       0.45 sec

pdfminer.six también tiene una huella enorme, que requiere pycryptodome que necesita GCC y otras cosas instaladas empujando una imagen de ventana acoplable de instalación mínima en Alpine Linux de 80 MB a 350 MB. PyPDF2 no tiene un impacto de almacenamiento notable.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *