Cómo extraer texto de PDF con Python: 3 librerías
Extraer texto de un PDF en Python parece algo sencillo, pero cualquier desarrollador que lo haya intentado sabe que está lleno de excepciones, maquetaciones rotas y documentos escaneados que se resisten. Esta guía va al grano. Empezaremos con una comparativa directa de las mejores librerías de Python para leer PDF y extraer texto, para que elijas la herramienta adecuada para tu proyecto desde el primer momento.

Después veremos ejemplos de código con tres de las librerías más eficaces: PyPDF2, pdfplumber y PyMuPDF (Fitz). Cubriremos desde la extracción básica de texto hasta cómo sacar tablas de PDF con Python. También abordaremos el caso más complicado: los PDFs escaneados que requieren OCR, y te mostraremos una forma práctica de convertir un PDF escaneado a texto con Python sin meterte en configuraciones locales complejas. Al final tendrás tanto el código como la estrategia para automatizar el procesamiento de PDF con Python de forma fiable.
Veredicto rápido: mejores librerías de Python para extraer texto de PDF
Antes de entrar en el código, aquí tienes una visión general de las opciones más potentes. La elección depende por completo de si priorizas velocidad, simplicidad o un análisis preciso del layout del documento.
| Librería | Ideal para | Manejo de layout/tablas | Rendimiento | Facilidad de uso (1-5) |
|---|---|---|---|---|
| PyPDF2 | Documentos simples, solo texto; manipulación básica de PDF (unir/dividir) | Limitado (extrae el flujo de texto, sin datos de posición) | Medio | 5 |
| pdfplumber | Extraer tablas de PDF con Python; documentos con estructura definida | Excelente (proporciona coordenadas de texto, líneas y rectángulos) | Más lento | 4 |
| PyMuPDF (Fitz) | Procesamiento por lotes a alta velocidad; manejo de imágenes y anotaciones | Bueno (puede extraer texto con información básica de posición) | Excelente (el más rápido) | 4 |
En resumen: empieza con PyPDF2 para los casos más simples. Pásate a pdfplumber en cuanto aparezcan tablas. Elige PyMuPDF si tu prioridad es el rendimiento.
Antes de empezar: prepara tu entorno de Python
Para mantener limpias las dependencias del proyecto y evitar conflictos, trabaja siempre dentro de un entorno virtual. Es una práctica básica e imprescindible en cualquier proyecto serio de Python.
Así puedes dejarlo listo desde la terminal:
- Crea un entorno virtual:
# En macOS/Linux
python3 -m venv pdf_env
# En Windows
python -m venv pdf_env
```
2. **Actívalo:**
```plaintext
# En macOS/Linux
source pdf_env/bin/activate
# En Windows
.\pdf_env\Scripts\activate
```
Ahora el prompt de tu terminal debería mostrar `(pdf_env)`.
3. **Instala las librerías:** vamos a instalar las tres librerías que estamos comparando para que puedas probarlas fácilmente.
```plaintext
pip install pypdf2 pdfplumber pymupdf
```
Con eso, tu entorno ya está listo para los ejemplos de código que vienen a continuación.
---
## Método 1: extracción básica de texto con PyPDF2
PyPDF2 es la librería de referencia para operaciones básicas con PDF. Es directa, lleva años usándose y funciona muy bien con PDFs nativos, donde el texto se puede seleccionar y no forma parte de una imagen. Si tus documentos son informes sencillos, artículos o exportaciones basadas en texto, PyPDF2 te permite extraer texto de un PDF en Python con muy poco código.
¿Su principal limitación? Lee el flujo interno de texto del PDF, y eso no siempre coincide con el orden visual de lectura, sobre todo en diseños de varias columnas. Además, no entiende las tablas: simplemente junta el texto de todas las celdas sin estructura.
Aquí tienes un script sencillo para extraer todo el texto de un PDF:
```python
# requisitos: pip install pypdf2
import PyPDF2
def extract_text_with_pypdf2(pdf_path):
"""
Extrae texto de un archivo PDF usando la librería PyPDF2.
Args:
pdf_path (str): Ruta del archivo PDF.
Returns:
str: El contenido de texto extraído o un mensaje de error.
"""
try:
with open(pdf_path, 'rb') as file:
reader = PyPDF2.PdfReader(file)
num_pages = len(reader.pages)
print(f"Páginas totales: {num_pages}")
full_text = ""
for page_num in range(num_pages):
page = reader.pages[page_num]
full_text += page.extract_text() + "\n"
return full_text
except FileNotFoundError:
return f"Error: No se encontró el archivo en {pdf_path}."
except Exception as e:
return f"Se produjo un error inesperado: {e}"
# --- Ejemplo de uso ---
pdf_file = 'path/to/your/document.pdf'
extracted_text = extract_text_with_pypdf2(pdf_file)
if "Error" not in extracted_text:
print("--- Texto extraído ---")
print(extracted_text)
else:
print(extracted_text)
Este script funciona muy bien con texto simple en una sola columna. Pero ¿qué pasa si le das un estado financiero con tablas bien organizadas? Obtendrás una mezcla de texto y números sin estructura. Ahí es donde entra en juego la siguiente librería.
Método 2: extraer tablas y analizar el layout con pdfplumber
Cuando necesitas extraer datos estructurados, pdfplumber suele ser la mejor opción. Construido sobre pdfminer.six, está pensado para darte acceso detallado a la geometría de cada página del PDF. "Ve" caracteres, líneas y rectángulos, y además incluye un método muy eficaz para detectar y extraer tablas de PDF con Python.
Esto marca una gran diferencia en tareas de ciencia de datos y automatización empresarial. Piensa, por ejemplo, en extraer resultados trimestrales de un informe financiero en PDF. Con PyPDF2, puede convertirse en una pesadilla de parseo de cadenas. Con pdfplumber, en cambio, puedes obtener los datos como una lista de listas limpia, lista para convertirla en un DataFrame de Pandas.
La razón principal por la que pdfplumber supera a PyPDF2 con datos estructurados es que interpreta la disposición visual del documento, no solo el flujo de texto sin procesar. Entiende que ciertos elementos de texto están alineados en filas y columnas, separados por líneas.
Así puedes extraer tablas de una página PDF:
# requisitos: pip install pdfplumber
import pdfplumber
import pandas as pd
def extract_tables_with_pdfplumber(pdf_path, page_number=0):
"""
Extrae todas las tablas de una página concreta de un PDF usando pdfplumber.
Args:
pdf_path (str): Ruta del archivo PDF.
page_number (int): Número de página de la que extraer tablas (índice desde 0).
Returns:
list of pandas.DataFrame: Lista en la que cada elemento es un DataFrame
que representa una tabla encontrada en la página.
"""
tables = []
try:
with pdfplumber.open(pdf_path) as pdf:
if page_number >= len(pdf.pages):
print(f"Error: la página {page_number} está fuera de rango. El PDF tiene {len(pdf.pages)} páginas.")
return tables
page = pdf.pages[page_number]
# .extract_tables() es el método clave aquí
extracted_tables = page.extract_tables()
for table_data in extracted_tables:
# Convierte la lista de listas en un DataFrame de pandas
df = pd.DataFrame(table_data[1:], columns=table_data[0])
tables.append(df)
return tables
except FileNotFoundError:
print(f"Error: no se encontró el archivo en {pdf_path}.")
return tables
except Exception as e:
print(f"Se produjo un error inesperado: {e}")
return tables
# --- Ejemplo de uso ---
# Necesitarás pandas para este ejemplo: pip install pandas
pdf_file_with_table = 'path/to/your/report.pdf'
all_tables = extract_tables_with_pdfplumber(pdf_file_with_table, page_number=0)
if all_tables:
print(f"Se encontraron {len(all_tables)} tabla(s) en la página 0.")
for i, table_df in enumerate(all_tables):
print(f"\n--- Tabla {i+1} ---")
print(table_df)
else:
print("No se encontraron tablas en la página indicada.")
La contrapartida de esta precisión es la velocidad. pdfplumber hace más trabajo analizando la página, así que por naturaleza es más lento que las librerías que simplemente vuelcan el texto.
Método 3: extracción rápida con PyMuPDF (Fitz)
Cuando necesitas procesar cientos o miles de PDFs con rapidez, el rendimiento pasa a ser el factor decisivo. Ahí es donde PyMuPDF, que se importa como fitz, destaca claramente. Es un binding de Python para MuPDF, una librería ligera escrita en C, y por eso ofrece una velocidad excepcional.
Una vez trabajé en un proyecto en el que había que procesar varios miles de documentos legales de varias páginas. Mi script inicial con pdfplumber iba a tardar horas. Al cambiar a PyMuPDF, el tiempo de ejecución bajó a menos de 30 minutos. La diferencia de rendimiento es así de grande.
Además de rápido, PyMuPDF viene cargado de funciones. Puede renderizar páginas como imágenes —algo clave en flujos OCR PDF Python—, extraer imágenes incrustadas y manejar anotaciones. Aunque su extracción de tablas no es tan directa como la de pdfplumber, su velocidad para extraer texto bruto no tiene rival.
Este sería el equivalente con PyMuPDF para extraer texto rápidamente:
# requisitos: pip install PyMuPDF
import fitz # La librería PyMuPDF
def extract_text_with_pymupdf(pdf_path):
"""
Extrae texto de un archivo PDF usando la librería de alto rendimiento PyMuPDF (Fitz).
Args:
pdf_path (str): Ruta del archivo PDF.
Returns:
str: El contenido de texto extraído o un mensaje de error.
"""
try:
doc = fitz.open(pdf_path)
full_text = ""
for page in doc:
# .get_text() es la función principal
full_text += page.get_text() + "\n"
doc.close()
return full_text
except FileNotFoundError:
return f"Error: no se encontró el archivo en {pdf_path}."
except Exception as e:
# PyMuPDF puede lanzar errores específicos, p. ej., fitz.fitz.FitzError
return f"Se produjo un error con PyMuPDF: {e}"
# --- Ejemplo de uso ---
pdf_file = 'path/to/your/document.pdf'
fast_extracted_text = extract_text_with_pymupdf(pdf_file)
if "Error" not in fast_extracted_text:
print("--- Texto extraído (método rápido) ---")
print(fast_extracted_text)
else:
print(fast_extracted_text)
Si hablamos de rendimiento puro en PDFs con texto seleccionable, PyMuPDF es el claro ganador.
Caso especial: convertir PDF escaneado a texto con OCR
Puede que te estés preguntando: ¿qué pasa cuando ninguno de estos métodos funciona? Si ejecutas el código anterior sobre un documento escaneado —como la imagen de un contrato o una página de libro digitalizada—, lo que obtendrás será una cadena vacía.
Esto ocurre porque no existe una capa de texto. El PDF contiene una imagen, no caracteres. Para resolverlo, necesitas OCR (reconocimiento óptico de caracteres) para "leer" la imagen y convertirla en texto legible por máquina.
La solución estándar en Python es pytesseract, un wrapper del motor Tesseract OCR de Google. Aunque es potente, trae consigo un problema importante: tienes que instalar Tesseract por separado en tu sistema (por ejemplo, con brew en Mac o mediante un instalador en Windows) y asegurarte de que Python pueda encontrar el ejecutable. Esta configuración puede ser frágil, sobre todo al desplegar tu código en un servidor o compartirlo con compañeros.
Alternativa: preprocesar PDFs complejos con una herramienta sin código
Si vas con el tiempo justo o simplemente no quieres lidiar con dependencias de OCR, una alternativa práctica es delegar primero la extracción de texto en una herramienta especializada. Así separas el problema complejo del OCR de la lógica principal de tu script en Python.
Una herramienta con IA como el extractor de texto PDF con IA de Lynote puede servir como un potente preprocesador. Puedes subir tu PDF escaneado problemático y la herramienta se encargará del OCR en segundo plano, devolviéndote texto limpio para pasarlo después a tu script. Esto resulta especialmente útil en tareas puntuales o cuando tienes un lote pequeño de archivos conflictivos.
Así de simple es el flujo de trabajo:
- Sube tu archivo PDF. Ve al espacio de trabajo de Lynote. En la pestaña 'Upload File', puedes arrastrar y soltar tu PDF o buscarlo en tu ordenador para seleccionarlo. Funciona tanto con PDFs basados en texto como con PDFs escaneados basados en imágenes.
- Extrae el texto del PDF. Cuando el archivo se haya subido, haz clic en el botón "Create Note". El motor de IA de Lynote procesa el documento, aplica OCR automáticamente si detecta un archivo basado en imágenes y genera una versión de texto limpia y buscable.
- Copia el texto extraído. Cuando el texto aparezca en el editor, puedes revisarlo, hacer pequeñas correcciones si hace falta y usar el botón de copiar para llevarte todo el contenido. Quedará en tu portapapeles, listo para pegarlo en tu script de Python como una variable de tipo string.


Este enfoque te permite centrarte en el análisis de datos dentro de tu código, en lugar de perder tiempo con la infraestructura y el manejo de errores de una configuración OCR local.
Errores habituales y consejos avanzados
Extraer texto de PDF con Python rara vez es un proceso perfecto. Estos son algunos problemas habituales con los que probablemente te encontrarás:
- Codificación de caracteres: Puede que te aparezca un
UnicodeDecodeError. Esto suele pasar con PDFs antiguos o generados por software poco común. La mayoría de las librerías modernas manejan bienUTF-8, pero indicar la codificación a veces ayuda si la librería lo permite. - PDF protegidos con contraseña: Si un PDF necesita contraseña para abrirse, todas estas librerías fallarán. Debes proporcionar la contraseña al abrir el archivo. Por ejemplo,
PyPDF2.PdfReader(file, password='your_password'). - Pérdida de formato: Ten en cuenta que al extraer texto casi siempre se pierde el formato, como negritas, cursivas, tamaño de fuente y color. Lo que obtienes es el contenido de texto en bruto, no una representación visual.
- Texto desordenado en documentos con columnas: Como comentamos con PyPDF2, los diseños de varias columnas (como en artículos académicos) pueden devolver texto mezclado entre columnas distintas.
pdfplumberlo resuelve mucho mejor porque tiene en cuenta la geometría de la página.
Consejo experto: Prueba siempre tu script con una muestra representativa de tus documentos. Una solución que funciona perfectamente con un PDF puede fallar por completo con otro de una fuente distinta.
Preguntas frecuentes
¿Por qué el texto extraído de mi tabla se convirtió en una cadena larga y desordenada?
Este es el fallo clásico de librerías como PyPDF2, que no hacen análisis de layout de la página. Leen el flujo de texto en bruto en el orden en que está guardado en el archivo, y eso muchas veces no coincide con la estructura visual de filas y columnas. Para solucionarlo, debes usar una librería con reconocimiento de estructura como **pdfplumber**, diseñada específicamente para extraer tablas de PDF y detectar datos tabulares.
¿Puede Python extraer texto de una zona concreta de una página PDF?
Sí, pero necesitas una librería que proporcione información de coordenadas. pdfplumber y PyMuPDF son opciones excelentes para esto. Con pdfplumber, puedes usar el método .crop((x0, top, x1, bottom)) para crear un área delimitada y luego ejecutar .extract_text() o .extract_tables() solo dentro de esa zona recortada.
¿Por qué el texto extraído está vacío en mi PDF escaneado?
Tu PDF contiene una imagen con texto, no datos de texto reales. Las librerías estándar no pueden "leer" imágenes. Necesitas usar un proceso de OCR. Puedes configurar un motor OCR local con pytesseract o utilizar una herramienta de preprocesado como Lynote para convertir primero el PDF escaneado en texto limpio.
¿Cómo puedo procesar PDF con Python cuando tienen varios idiomas?
Las librerías modernas como PyMuPDF y pdfplumber suelen manejar bien Unicode, que da soporte a la mayoría de idiomas. El principal reto aparece durante el OCR. Tesseract, por ejemplo, requiere que descargues e indiques los paquetes de idioma que quieres usar (por ejemplo, -l eng+fra para inglés y francés).
Conclusión: qué herramienta de Python usar para leer PDF
No existe una única librería "mejor" para extraer texto de un PDF en Python. La elección correcta depende siempre del tipo de documentos que tengas y de los objetivos de tu proyecto.
Si lo resumimos en una decisión práctica:
- Si tus PDF son documentos simples basados en texto y solo necesitas el contenido en bruto, PyPDF2 es la opción más fácil y rápida de implementar.
- Si tus PDF contienen tablas o diseños estructurados y necesitas convertirlos en datos (por ejemplo, para cargarlos en una base de datos o en un DataFrame de Pandas), pdfplumber es claramente la mejor opción.
- Si vas a procesar un gran volumen de documentos y la velocidad es tu prioridad principal, PyMuPDF (Fitz) es la alternativa más potente y con mejor rendimiento.
- Si trabajas con PDF escaneados basados en imágenes, necesitas OCR sí o sí. Si buscas una solución rápida y fiable sin complicarte con configuraciones locales, lo más práctico suele ser preprocesar el archivo con una herramienta externa antes de llevar el texto limpio a tu entorno de Python.
Empieza por la herramienta más simple que cubra lo que necesitas y prepárate para pasar a una más potente a medida que aumente la complejidad de tus documentos.


