← Volver a publicaciones

OCR Platform — Extracción inteligente de documentos PDF

Plataforma production-ready de OCR que extrae texto, tablas y datos estructurados de documentos PDF usando Google Gemini 2.5 Flash. Incluye pipeline RAG para consultas en lenguaje natural sobre documentos procesados.

Descripción del proyecto

OCR Platform es un sistema production-ready para la extracción de texto, tablas y datos estructurados desde documentos PDF, utilizando Google Gemini 2.5 Flash como motor de inteligencia artificial. Incluye un pipeline RAG (Retrieval-Augmented Generation) que permite hacer preguntas en lenguaje natural sobre el contenido de los documentos procesados mediante una interfaz de chat.

El sistema está completamente orquestado con Docker Compose (5 servicios), implementa autenticación JWT, procesamiento asíncrono con Celery, y búsqueda híbrida vectorial + full-text con pgvector.


Características principales

  • OCR con IA — Extrae texto, tablas y campos clave-valor de PDFs usando Gemini 2.5 Flash
  • Preprocesamiento de imágenes — Corrección automática de inclinación (deskew) y eliminación de ruido (denoise) con OpenCV
  • Procesamiento paralelo — Múltiples páginas se procesan concurrentemente vía ThreadPoolExecutor
  • Procesamiento asíncrono — PDFs se procesan en segundo plano con Celery + Redis
  • RAG con búsqueda híbrida — Chunking semántico, embeddings vectoriales (pgvector) y full-text search con re-ranking RRF
  • Chat sobre documentos — Interfaz de chat para hacer preguntas sobre el contenido de cualquier documento procesado
  • Descarga de resultados — Exporta texto plano o JSON estructurado desde la interfaz
  • Autenticación — Registro e inicio de sesión con bcrypt + JWT (HS256). Todas las rutas protegidas por token Bearer
  • Dark mode — Tema oscuro/claro con toggle manual y detección automática del sistema (next-themes)

Tech Stack

Backend

TecnologíaRol
FastAPIFramework API REST
SQLAlchemyORM y modelos de datos
AlembicMigraciones de base de datos
PostgreSQL 15 + pgvectorBase de datos relacional + búsqueda vectorial
Redis 7Message broker para Celery
CeleryCola de tareas asíncronas
Google Gemini 2.5 FlashMotor OCR y modelo de chat
Gemini Embedding 001Embeddings para búsqueda semántica
OpenCVPreprocesamiento de imágenes
pdf2image + PopplerConversión PDF → imágenes
bcryptHash seguro de contraseñas
PyJWTGeneración y validación de tokens JWT

Frontend

TecnologíaRol
Next.js 16Framework React con App Router
React 19Librería de UI
TypeScript 5Tipado estático
Tailwind CSS 4Estilos utilitarios
TanStack React QueryEstado del servidor y caching
AxiosCliente HTTP
shadcn/uiComponentes de UI
react-dropzoneSubida de archivos drag & drop
sonnerNotificaciones toast
lucide-reactIconografía
next-themesTema oscuro/claro del sistema

Arquitectura

Servicios Docker

Backend — Layered Architecture

  • Routes — Controladores delgados: validan input, delegan a services/repositories, retornan esquemas Pydantic
  • Services — Lógica de negocio: UploadService, PDFService, GeminiOCRService, RagService, AuthService
  • Repositories — Acceso a datos: DocumentRepository, ChunkRepository, UserRepository (SQLAlchemy ORM)
  • Models — Entidades: Document, DocumentChunk, User
  • Dependenciesget_current_user() extrae y valida JWT del header Authorization: Bearer

Frontend — Component Architecture

  • Pages — App Router: landing, dashboard, results/[id], chat/[id], login, register
  • Components — Organizados por feature: upload/, results/, documents/, ProtectedRoute
  • Hooks — Encapsulan toda la comunicación con el servidor (TanStack Query) + useAuth (contexto de sesión)
  • Services — Cliente Axios centralizado con interceptor de token Bearer
  • Types — Interfaces TypeScript que reflejan los esquemas del backend

Principios SOLID aplicados

PrincipioImplementación
SRPCada servicio tiene una única responsabilidad: PDFService (preprocesamiento), GeminiOCRService (OCR), UploadService (flujo de subida), RagService (búsqueda y chat)
OCPOCRService(ABC) permite agregar nuevos providers sin modificar los existentes. ResultViewer acepta prop renderers para intercambiar renderizadores
LSPGeminiOCRService extiende OCRService cumpliendo el contrato process_image()
ISPInterfaces pequeñas y enfocadas — un hook por operación de datos
DIPConfiguración centralizada vía pydantic BaseSettings, repositorios inyectados vía constructor

API Endpoints

Autenticación (públicos)

MétodoEndpointDescripción
GET/healthHealth check
POST/api/auth/registerRegistrar usuario
POST/api/auth/loginIniciar sesión

Recursos protegidos (Authorization: Bearer <token>)

MétodoEndpointDescripción
GET/api/auth/mePerfil del usuario autenticado
POST/api/uploadSubir PDF (multipart/form-data)
POST/api/process/{id}Reprocesar documento vía Celery
GET/api/results/{id}Obtener documento con resultados OCR
GET/api/documentsListar documentos del usuario
POST/api/rag/{id}Indexar documento para búsqueda RAG
POST/api/chat/{id}Hacer pregunta sobre documento indexado

Formato de respuesta OCR

{
  "texto": "Texto completo extraído del documento...",
  "tablas": [
    {
      "headers": ["Columna 1", "Columna 2"],
      "rows": [["valor 1", "valor 2"]]
    }
  ],
  "campos": {
    "fecha": "07/03/2026",
    "monto_total": "$15,000.00",
    "numero_factura": "FAC-001"
  }
}

Despliegue

El sistema se despliega completamente con Docker Compose, creando 5 contenedores en la red ocr-network:

ServicioPuertoDescripción
frontend3000Interfaz web Next.js
backend8000API REST FastAPI
db5432PostgreSQL 15 + pgvector
redis6379Redis 7 (broker Celery)
celeryWorker para procesamiento asíncrono

Repositorio

🔗 github.com/Vic-Lara-Gilles/Ocr-Next.js

Lenguajes: TypeScript 49.8% · Python 44.6% · CSS 3.8%