Jose Luis Matos

Data Analyst

Freelancer

Jose Luis Matos

Data Analyst

Freelancer

Script de Extracción Híbrida: De PDF (Digital o Escaneado) a CSV Estructurado

  • Creado por: Jose Luis Matos
  • Fecha: 20/01/2026
  • Cliente: Proyecto propio
  • Categoría: Codigo
Hola a todos. Aquí comparto un script desarrollado en Python diseñado para resolver un problema común en el mundo de Data Science: extraer texto de lotes de archivos PDF de manera íntegra, incluso cuando algunos están escaneados.
 
💡 El Problema
Muchos scripts de extracción fallan porque solo leen texto digital. Si el PDF es una imagen (escaneo), devuelven una página en blanco. Este script soluciona eso mediante un enfoque híbrido.
 
🛠️ Lo que hace este script:
  1. Detección Automática: Primero intenta extraer texto nativo (rápido y 100% preciso).
  2. OCR de Respaldo: Si la página no tiene texto digital, activa Tesseract OCR para leer la imagen.
  3. Trazabilidad Total: Genera un archivo CSV/Excel donde cada fila indica el nombre del archivo original y el número de página, manteniendo el orden lógico del contenido.
  4. Limpieza Mínima: Preserva la estructura de las oraciones sin alterar el contenido original.

💻 El Código.

import fitz # PyMuPDF
import pandas as pd
from PIL import Image
import pytesseract
import os

# — CONFIGURACIÓN —
# Ruta al motor OCR (Ajustar según tu instalación)
pytesseract.pytesseract.tesseract_cmd = r”C:\Users\USUARIO\AppData\Local\Programs\Tesseract-OCR\tesseract.exe”

# Rutas de entrada y salida
pdf_path = r”tu_archivo_entrada.pdf”
output_path = r”texto_extraido_final.csv”
# ———————

def extraer_texto_pdf(path):
doc = fitz.open(path)
rows = []

for page_num in range(len(doc)):
page = doc[page_num]

# 1. Intento de extracción nativa
texto_final = page.get_text(“text”).strip()

# 2. Si no hay texto, aplicamos OCR (Fallback)
if not texto_final:
pix = page.get_pixmap(dpi=300)
img = Image.frombytes(“RGB”, [pix.width, pix.height], pix.samples)
texto_final = pytesseract.image_to_string(img, lang=”spa”).strip()

rows.append({
“archivo”: os.path.basename(path),
“pagina”: page_num + 1,
“texto”: texto_final
})
return rows

# Ejecución y guardado
datos = extraer_texto_pdf(pdf_path)
df = pd.DataFrame(datos)
df.to_csv(output_path, index=False, encoding=’utf-8-sig’)

print(f”✅ Proceso completado. Datos guardados en: {output_path}”)

📋 Requisitos para su uso.

Para quienes deseen replicarlo, asegúrense de tener instalado:
  • Python 3.x
  • Tesseract OCR instalado en el sistema.
  • Asegurarse de tener el archivo spa.traineddata 
    este en la carpeta de la instalación Tesseract-OCR\tessdata. Encaso de que no esté descargarlo (https://github.com/tesseract-ocr/tessdata)
  • Librerías necesarias: pip install pymupdf pandas pytesseract pillow