Para extraer texto de un PDF tienes varias opciones: desde el clásico copiar y pegar hasta scripts en Python que procesan cientos de archivos de forma automática. El método que necesitas depende de si tu PDF tiene texto seleccionable o es una imagen escaneada, y de si quieres hacerlo una vez o automatizarlo a escala.
Extraer texto de un PDF parece sencillo hasta que lo intentas. Algunos PDFs entregan el contenido perfectamente; otros te devuelven caracteres extraños, columnas mezcladas o simplemente una cadena vacía. En esta guía verás siete métodos reales, con sus ventajas, sus limitaciones y, para los que requieren código, ejemplos que puedes ejecutar directamente.
Los métodos van de lo más simple a lo más avanzado. Si solo necesitas el texto de un documento puntual, los dos primeros te bastarán. Si trabajas con volumen o con documentos de estructura compleja, sigue leyendo hasta los métodos de Python.
Los seis métodos anteriores te dan el texto del PDF como una cadena de caracteres. Si lo que realmente necesitas es extraer campos concretos de documentos de negocio (el número de factura, la fecha de vencimiento, el nombre del proveedor, el importe total), el texto crudo no es el destino final: es solo el punto de partida. Lido está diseñado para ese siguiente paso: extrae campos específicos de documentos estructurados y los organiza automáticamente en tablas o en los destinos que necesites.
No requiere código y funciona tanto con PDFs nativos como con PDFs escaneados. Si procesas documentos repetitivos del mismo tipo (facturas de distintos proveedores, por ejemplo, o contratos con el mismo esquema), Lido aprende la estructura y la aplica de forma consistente. Es la herramienta adecuada cuando el objetivo no es el texto en sí, sino los datos estructurados que contiene ese texto.
Es lo primero que prueba todo el mundo, y funciona bien cuando el PDF tiene texto real incrustado y no está protegido contra copia. Abre el archivo en cualquier lector de PDF, selecciona el texto con el cursor o usa Ctrl+A para seleccionar todo, y pega en el destino que necesites. El resultado varía según el lector: algunos respetan mejor los saltos de línea y los espacios entre palabras.
El problema principal es que no escala y no maneja bien los documentos con estructura. Si tienes varias columnas, el texto suele pegarse en el orden incorrecto, mezclando las líneas de ambas columnas. Las tablas pierden completamente su estructura. Es útil para extraer un párrafo o un dato puntual, pero no para procesar documentos enteros ni para automatizar nada.
Adobe Acrobat Reader permite guardar el contenido de un PDF directamente como texto: ve a Archivo y selecciona Guardar como texto (o Exportar a, según la versión). Esta opción hace un trabajo decente con documentos lineales y preserva mejor la estructura que el simple copiar y pegar. No necesitas la versión de pago para esto.
La limitación es la misma que con el método anterior: no funciona con PDFs escaneados porque no contienen texto seleccionable, solo imágenes. Para documentos con tablas o múltiples columnas, el resultado sigue siendo imperfecto. Aun así, para un documento de texto corrido es la opción más rápida sin necesidad de instalar software adicional ni escribir código.
Sube el PDF a Google Drive, haz clic derecho sobre él y selecciona "Abrir con Google Docs". Google convierte automáticamente el archivo en un documento editable extrayendo el texto. Para PDFs sencillos con un diseño lineal, el resultado es bastante bueno y puedes empezar a editar de inmediato.
Google Drive también aplica OCR básico a algunos PDFs escaneados, aunque la calidad depende de la resolución de la imagen original. La extracción de tablas es mediocre: se convierten en texto plano o en tablas con el formato roto. Es una buena solución para uso ocasional sin instalar nada, pero no es fiable para procesamiento en volumen ni para documentos con estructura compleja como facturas o informes con tablas.
pdfplumber es la librería de Python que mejor funciona para extraer texto de PDF con estructura. Maneja bien las tablas y los espacios entre columnas, respeta los saltos de línea, y tiene una API clara. Está construida sobre pdfminer y añade funciones específicas para trabajar con la geometría de cada página, lo que la hace superior a alternativas más ligeras cuando el layout del documento importa.
Para instalarla: pip install pdfplumber. Aquí tienes un script básico que extrae el texto de todas las páginas de un documento:
import pdfplumber
with pdfplumber.open("documento.pdf") as pdf:
for i, pagina in enumerate(pdf.pages):
texto = pagina.extract_text()
if texto:
print(f"--- Página {i + 1} ---")
print(texto)
Si el PDF tiene tablas, usa pagina.extract_table() en lugar de extract_text(). Este método devuelve la tabla como una lista de listas, lo que facilita convertirla a CSV o a un DataFrame de pandas con una sola línea adicional. pdfplumber es la elección correcta cuando necesitas preservar la estructura del documento además del texto.
PyPDF2 es una librería más ligera con más tiempo en el ecosistema de Python. Es adecuada para tareas de automatización básica: extraer texto de muchos archivos en un bucle, dividir o combinar PDFs, leer metadatos de documentos. Su extracción de texto es menos precisa que pdfplumber con documentos complejos, pero para PDFs lineales sin tablas funciona correctamente y con menos dependencias.
Instalación: pip install pypdf (la versión renombrada y mantenida activamente). Script básico de extracción:
import pypdf
with open("documento.pdf", "rb") as archivo:
lector = pypdf.PdfReader(archivo)
for i, pagina in enumerate(lector.pages):
texto = pagina.extract_text()
print(f"--- Página {i + 1} ---")
print(texto)
Una aclaración práctica: el proyecto original PyPDF2 fue renombrado a pypdf y es ahí donde se hace el desarrollo activo. Si tu código ya usa PyPDF2, sigue funcionando con pip install PyPDF2. Para proyectos nuevos, instala directamente pypdf para tener las últimas correcciones de bugs y mejoras de rendimiento.
Los PDFs escaneados no contienen texto como tal: son imágenes guardadas en un contenedor PDF. Para extraer texto de un PDF de este tipo necesitas OCR, es decir, reconocimiento óptico de caracteres. La combinación de Tesseract y pdf2image es la opción de código abierto que cubre todo el flujo: pdf2image convierte cada página del PDF en una imagen de alta resolución, y Tesseract aplica OCR sobre cada una.
Tesseract es un motor OCR independiente (no una librería de Python) que debes instalar por separado junto con el paquete de idioma español. En Ubuntu: sudo apt install tesseract-ocr tesseract-ocr-spa. En macOS con Homebrew: brew install tesseract tesseract-lang. Después instala las librerías de Python: pip install pdf2image pytesseract.
from pdf2image import convert_from_path
import pytesseract
paginas = convert_from_path("documento_escaneado.pdf", dpi=300)
for i, imagen in enumerate(paginas):
texto = pytesseract.image_to_string(imagen, lang="spa")
print(f"--- Página {i + 1} ---")
print(texto)
La calidad del OCR depende directamente de la resolución del escaneo original. Con 300 DPI obtienes resultados aceptables en la mayoría de los documentos; por debajo de 200 DPI los errores se multiplican. Con documentos borrosos, con sellos encima del texto o con mucho ruido de fondo, los resultados pueden ser pobres. Para documentos críticos en volumen, las soluciones comerciales de OCR tienen modelos de reconocimiento más precisos.
Hay una diferencia importante antes de elegir herramienta. La extracción de texto significa obtener todo el contenido del documento como una cadena de caracteres: lo que ves en la página, aproximadamente en el mismo orden, sin estructura adicional. El resultado es texto plano que puedes leer, buscar o procesar con otras herramientas. Eso es exactamente lo que hacen los seis primeros métodos de esta guía.
La extracción de datos es un concepto diferente. Significa identificar campos específicos dentro del documento: el número de factura, la fecha de emisión, el nombre del proveedor, el importe total antes y después de impuestos. El resultado no es un bloque de texto, sino una fila en una tabla, un objeto JSON con claves y valores, o una entrada en una base de datos. Requiere entender la estructura semántica del documento, más allá de leer sus caracteres de izquierda a derecha.
La mayoría de las personas que buscan cómo extraer texto de PDF en realidad necesitan extracción de datos. Quieren el importe de una factura, no el texto completo de la factura. Quieren las fechas de un contrato, no sus cláusulas completas. Quieren los valores de una tabla de un informe, no los párrafos que rodean esa tabla. Si ese es tu caso, los métodos de Python te llevan hasta la puerta, pero tendrás que añadir lógica adicional con expresiones regulares, pandas o un modelo de lenguaje para llegar al dato que necesitas.
La extracción de texto pura tiene su lugar. Es la herramienta correcta para procesamiento de lenguaje natural, indexación para motores de búsqueda internos, traducción automática de documentos o resumen de contenido. Pero si el objetivo es poblar una base de datos o una hoja de cálculo con información de documentos, estás hablando de extracción de datos estructurados, y es mejor usar desde el principio herramientas pensadas para eso.
Estos son los errores más frecuentes y cómo abordarlos de forma práctica:
Esto ocurre porque los PDFs no guardan el texto como un flujo continuo con retornos de carro: guardan las posiciones absolutas de cada elemento en la página. Al extraer, algunas herramientas concatenan todo sin respetar el layout y terminas con un párrafo enorme sin estructura. Con pdfplumber puedes ajustar los parámetros x_tolerance y y_tolerance en extract_text() para controlar cuándo dos elementos se consideran parte de la misma línea o del mismo bloque de texto. Un valor más alto de y_tolerance agrupa elementos que están más separados verticalmente.
Es el problema más frecuente y el más difícil de resolver con herramientas genéricas. El texto de una tabla puede extraerse en el orden incorrecto o sin los delimitadores de columna, resultando en una mezcla ilegible. La solución más directa es usar pagina.extract_table() de pdfplumber en lugar de extract_text(), ya que este método analiza la geometría de las celdas detectando las líneas de la tabla. Si la tabla no tiene bordes visibles, la detección es más difícil y puede requerir ajustar manualmente los parámetros de detección de columnas. La librería camelot-py es otra opción especializada solo en tablas, con buenos resultados en documentos con estructura tabular consistente.
Los PDFs pueden usar codificaciones de fuente personalizadas que no se mapean directamente a Unicode estándar. El resultado son caracteres extraños, signos de interrogación o espacios donde debería haber acentos o letras con tilde. pdfplumber y pdfminer manejan este problema mejor que PyPDF2 en la mayoría de los casos porque hacen un análisis más detallado de las fuentes del documento. Si el problema persiste, revisa en el PDF si las fuentes están completamente incrustadas o si el documento usa un encoding no estándar: esto suele indicarse en las propiedades del archivo.
Si extract_text() devuelve una cadena vacía o None, lo más probable es que el PDF sea una imagen sin texto seleccionable. Puedes confirmarlo intentando seleccionar texto directamente en el lector de PDF: si el cursor no selecciona nada, el documento no tiene texto incrustado. En ese caso, necesitas OCR con Tesseract como se describe en el método 6. Si el PDF tiene algunas páginas con texto real y otras escaneadas, tendrás que detectar cuáles son cuáles (comprobando si extract_text() devuelve contenido o no) y aplicar el método correcto a cada página por separado.
Un PDF con dos columnas puede extraerse como si leyera toda la columna izquierda seguida de toda la columna derecha, o peor, mezclando líneas de ambas columnas en un orden impredecible. pdfplumber permite definir regiones específicas de la página con pagina.crop((x0, y0, x1, y1)).extract_text(), donde los valores son las coordenadas en puntos de la región que quieres extraer. Si conoces la estructura fija del documento, puedes procesar cada columna por separado y luego combinarlas en el orden lógico correcto. Para documentos con layout variable, este enfoque requiere más trabajo de calibración.
Esta tabla resume las características principales de cada método para que puedas decidir cuál se adapta mejor a tu situación:
| Método | Gratis | PDFs escaneados | Código necesario | Precisión | Mejor para |
|---|---|---|---|---|---|
| Lido | No | Sí | No | Muy alta | Extracción de datos estructurados de documentos de negocio |
| Copiar y pegar | Sí | No | No | Media | Texto puntual de PDFs simples |
| Adobe Acrobat Reader | Sí | No | No | Media-alta | Documentos lineales sin tablas |
| Google Drive | Sí | Parcial | No | Media | Uso rápido ocasional sin instalar nada |
| pdfplumber | Sí | No | Sí | Alta | Tablas y texto con estructura compleja |
| pypdf / PyPDF2 | Sí | No | Sí | Media | Automatización de texto básico en volumen |
| Tesseract + pdf2image | Sí | Sí | Sí | Media-alta | PDFs escaneados con OCR de código abierto |
Depende del tipo de protección. Si el PDF tiene una contraseña de apertura (user password), necesitas esa contraseña para acceder al contenido: tanto pdfplumber como pypdf aceptan contraseñas como parámetro al abrir el archivo, por ejemplo pdfplumber.open("doc.pdf", password="clave"). Si el PDF tiene una contraseña de permisos que bloquea la copia de texto pero permite la lectura (owner password), algunas herramientas pueden ignorar esa restricción técnicamente. Hacerlo sin autorización del propietario del documento puede tener implicaciones legales dependiendo de la jurisdicción y del contenido del archivo, así que actúa solo sobre documentos a los que tienes acceso legítimo.
pdfplumber es la que mejor funciona en la mayoría de los casos porque analiza la geometría de la página y tiene soporte explícito para tablas mediante extract_table(). pypdf es una buena alternativa cuando solo necesitas texto básico, quieres menos dependencias o estás procesando muchos archivos simples en un bucle. Si el documento tiene tablas o columnas, pdfplumber gana claramente en precisión. Para PDFs escaneados, ninguna de las dos sirve por sí sola: necesitas añadir Tesseract a la cadena de procesamiento para aplicar OCR antes de poder extraer texto.
Los PDFs escaneados son imágenes sin texto seleccionable, así que el primer paso es siempre aplicar OCR. La solución de código abierto que cubre todo el flujo es la combinación de pdf2image y pytesseract: pdf2image convierte cada página en una imagen de alta resolución y pytesseract aplica Tesseract sobre ella para reconocer el texto. La calidad del resultado depende directamente de la resolución del escaneo original: por debajo de 200 DPI los errores de reconocimiento se multiplican, y 300 DPI es el mínimo recomendado para resultados aceptables. Para documentos críticos o con condiciones difíciles (texto sobre fondo con ruido, sellos, texto inclinado), las soluciones comerciales de OCR tienen modelos de reconocimiento más robustos.
Sí, siempre se pierde parte del formato. Los atributos visuales como negrita, cursiva, tamaños de fuente y colores no se trasladan al texto plano resultante. Lo que sí puedes preservar con las herramientas adecuadas es la estructura lógica: los párrafos separados correctamente, las filas y columnas de una tabla, y el orden de lectura apropiado cuando hay varias columnas. pdfplumber conserva mejor la estructura que la mayoría de alternativas gratuitas. Si necesitas mantener el formato visual para edición posterior, exportar a Word desde Adobe Acrobat Pro da mejores resultados, aunque con limitaciones en documentos muy complejos.
Sí. pdfplumber tiene el método pagina.extract_tables() (en plural) que detecta y extrae únicamente las tablas de una página, devolviendo cada una como una lista de listas que puedes convertir directamente a un DataFrame de pandas. La librería camelot-py está especializada solo en extracción de tablas de PDFs y ofrece dos modos: "lattice" para tablas con bordes visibles y "stream" para tablas sin bordes definidos por líneas. Para tablas en PDFs escaneados, ninguna de las dos funciona directamente sin OCR previo, y los resultados son menos fiables porque la detección de celdas depende de poder leer el contenido.