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
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 - Dependencies —
get_current_user()extrae y valida JWT del headerAuthorization: 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
| 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%