Alexander A. E. Full Stack Developer

Herramientas para extraer texto de archivos PDF

Algunos casos de uso en los que se requiera extraer texto de archivos pdf pueden ser:

  • ejecutar análisis de curriculums vitae (hojas de vida)
  • para permitir la búsqueda por contenidos en un archivo
  • obtención de los datos de contacto de empresas desde boletas o facturas de pago
  • conversión a un formato más amigable para su presentación en la web (html) entre otros

A continuación, 3 herramientas que se pueden utilizar para extraer texto de archivos PDF:

1. PDFMiner (python):

Enlace: pdfminer-six

** Instalación **:

pip install pdfminer.six

** Uso **:

pdf2txt.py archivo.pdf

** Características resaltantes **:

  • permite escoger el formato de salida: txt, xml, html
  • selección del rango de páginas a escanear

2. Apache Tika (java):

Apache tika es una herramienta que extrae metadatos y texto desde varios formatos como: doc, ppt, xls, pdf entre otros

** Enlace **: apache-tika

** Instalación y uso **:

Se requiere contar con java instalado, descargar tika y ejecutarlo de forma similar a:

java -jar tika-server.jar

** Características **

  • reconoce múltiples formatos de entrada
  • permite escoger el formato de salida: txt, xml, html
  • extracción de metadata: cantidad de páginas, versión de pdf, extensión del documento, número de páginas entre otros.
  • cuenta con una herramienta gráfica: tika-app.jar que se puede utilizar para realizar pruebas de forma rápida
  • existe un wrapper para utilizarlo con python: tika-python

3. pdftotxt (linux)

Herramienta para extraer pdf incluida por defecto en varias distribuciones linux.

** Documentación **: pdftotext

** Uso **

pdftotext documento.pdf

Con lo anterior, se crea el archivo: documento.txt

** Características **

  • selección del rango de páginas a escanear
  • es la más sencilla de utilizar ya que viene preinstalada

Extraer texto con Python y una API

Las tres herramientas anteriores siguen funcionando, pero para integrarlo en una aplicación conviene usar una librería o una API. Estas son las opciones que recomiendo hoy:

pypdf (Python)

pypdf es la evolución de PyPDF2 y funciona bien con PDFs que ya tienen una capa de texto:

::python
from pypdf import PdfReader

reader = PdfReader("documento.pdf")
texto = "\n".join(page.extract_text() or "" for page in reader.pages)
print(texto)

Instalación: pip install pypdf.

pdfminer.six (Python)

pdfminer.six da más control sobre la extracción y suele manejar mejor PDFs con tablas o columnas:

::python
from pdfminer.high_level import extract_text

texto = extract_text("documento.pdf")
print(texto)

Instalación: pip install pdfminer.six.

Apache Tika como API

Si el PDF es complejo o necesitas extraer metadatos de varios formatos, puedes levantar Tika como servicio y consultarlo desde Python:

::python
import requests

with open("documento.pdf", "rb") as archivo:
    respuesta = requests.put(
        "http://localhost:9998/tika",
        data=archivo,
        headers={"Accept": "text/plain"},
        timeout=60,
    )
print(respuesta.text)

Tika devuelve texto plano, HTML o metadatos según el encabezado Accept. Es la opción más pesada, pero también la más tolerante con documentos raros.

Comparación rápida

Herramienta Ideal para API OCR
pdftotext PDFs simples y scripts rápidos No No
pypdf Aplicaciones Python sencillas Sí No
pdfminer.six PDFs con columnas o tablas Sí No
Apache Tika Muchos formatos y metadatos Sí No

Ninguna de estas herramientas hace OCR: si el PDF es una imagen escaneada, primero hay que pasarlo por Tesseract, OCRmyPDF o un servicio de OCR.

Preguntas frecuentes

¿Qué pasa si el PDF está escaneado?

El texto no existe en el archivo, así que primero hay que aplicar OCR. ocrmypdf documento.pdf documento-con-texto.pdf es una buena opción local; si son muchos archivos, un servicio de OCR suele ser más cómodo.

¿Cuál es la mejor opción para muchos PDFs?

Para documentos simples, pdftotext es imbatible por velocidad. Para una aplicación Python, pypdf o pdfminer.six. Para lotes heterogéneos, Tika.

¿Cómo extraigo solo una página?

Con pypdf puedes leer una página concreta:

::python
from pypdf import PdfReader

reader = PdfReader("documento.pdf")
texto = reader.pages[0].extract_text()

Comentarios finales

  • En general, quien me ha brindado mejores resultados para pdf's complejos ha sido apache tika y pdftotext para documentos sencillos.

  • Si lo que se busca es extraer imágenes de un PDF, en mi caso PDFBox me ha dado buenos resultados también.

Referencia:

Comentarios !

comments powered by Disqus