← 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ía Rol
FastAPI Framework API REST
SQLAlchemy ORM y modelos de datos
Alembic Migraciones de base de datos
PostgreSQL 15 + pgvector Base de datos relacional + búsqueda vectorial
Redis 7 Message broker para Celery
Celery Cola de tareas asíncronas
Google Gemini 2.5 Flash Motor OCR y modelo de chat
Gemini Embedding 001 Embeddings para búsqueda semántica
OpenCV Preprocesamiento de imágenes
pdf2image + Poppler Conversión PDF → imágenes
bcrypt Hash seguro de contraseñas
PyJWT Generación y validación de tokens JWT

Frontend

Tecnología Rol
Next.js 16 Framework React con App Router
React 19 Librería de UI
TypeScript 5 Tipado estático
Tailwind CSS 4 Estilos utilitarios
TanStack React Query Estado del servidor y caching
Axios Cliente HTTP
shadcn/ui Componentes de UI
react-dropzone Subida de archivos drag & drop
sonner Notificaciones toast
lucide-react Iconografía
next-themes Tema oscuro/claro del sistema

Arquitectura

Servicios Docker

5 servicios en la red ocr-network — Frontend → Backend → PostgreSQL · Celery · Redis

Backend — Layered Architecture

Controladores delgados → servicios de negocio → repositorios → modelos → base de datos
  • 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) → Components → Hooks (TanStack Query) → Services (Axios) → Types
  • 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

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

API Endpoints

Autenticación (públicos)

Método Endpoint Descripción
GET /health Health check
POST /api/auth/register Registrar usuario
POST /api/auth/login Iniciar sesión

Recursos protegidos (Authorization: Bearer <token>)

Método Endpoint Descripción
GET /api/auth/me Perfil del usuario autenticado
POST /api/upload Subir PDF (multipart/form-data)
POST /api/process/{id} Reprocesar documento vía Celery
GET /api/results/{id} Obtener documento con resultados OCR
GET /api/documents Listar 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:

Servicio Puerto Descripción
frontend 3000 Interfaz web Next.js
backend 8000 API REST FastAPI
db 5432 PostgreSQL 15 + pgvector
redis 6379 Redis 7 (broker Celery)
celery Worker para procesamiento asíncrono

Repositorio

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

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