Go-OCR — Servicio web ligero de OCR con Go y Tesseract
Sistema OCR completo para extraer texto de documentos PDF e imágenes usando Tesseract, con arquitectura limpia, API REST en Go y frontend moderno en React + TypeScript. Desplegable con Docker.
Descripción del proyecto
Go-OCR es un servicio web ligero para la extracción de texto de documentos PDF e imágenes (PNG, JPG, JPEG) utilizando Tesseract OCR como motor de reconocimiento. Cuenta con una API REST en Go y un frontend moderno en React + TypeScript, todo orquestado con Docker Compose.
El sistema detecta palabras con coordenadas y niveles de confianza, genera múltiples formatos de salida (JSON, TXT, Markdown), y está diseñado con arquitectura limpia siguiendo principios SOLID y patrones de diseño bien definidos.
Características principales
- Extracción de texto de PDFs multipágina con Tesseract OCR
- Soporte para imágenes PNG, JPG, JPEG
- Detección de palabras con coordenadas (bounding boxes) y niveles de confianza
- API REST JSON con CORS configurado
- Interfaz web moderna con React + TypeScript + Vite
- Múltiples formatos de salida — JSON, TXT, Markdown generados simultáneamente
- Health check integrado
- Manejo robusto de errores y timeouts con context awareness
- Logging estructurado de peticiones HTTP
- Graceful shutdown del servidor
Tech Stack
Backend
| Tecnología | Rol |
|---|---|
| Go 1.21+ | Lenguaje principal |
| Chi Router v5 | HTTP routing y middleware |
| Tesseract OCR 5.x | Motor de reconocimiento óptico |
| Poppler 23.x | Conversión PDF a imágenes (pdftoppm) |
| gosseract v2 | Bindings de Tesseract para Go |
| gofrs/uuid | Generación de IDs únicos |
Frontend
| Tecnología | Rol |
|---|---|
| React 18 | UI library |
| TypeScript | Type safety |
| Vite | Build tool |
| TanStack Query | Estado asíncrono y caché |
| Lucide React | Iconos |
| CSS puro | Estilos (sin frameworks CSS) |
Infraestructura
| Tecnología | Rol |
|---|---|
| Docker | Containerización |
| Docker Compose | Orquestación multi-contenedor |
| Alpine Linux | Imagen base ligera |
| Nginx | Servidor web para frontend |
Arquitectura
Diagrama de capas
Estructura del proyecto
Patrones de diseño
Strategy Pattern
La interfaz Engine permite intercambiar motores OCR sin cambiar el código cliente:
type Engine interface {
ExtractText(ctx context.Context, img image.Image) (*Result, error)
ExtractTextWithBoxes(ctx context.Context, img image.Image) (*DetailedResult, error)
Close() error
}
Dependency Injection
Las dependencias se inyectan en el constructor, no se crean internamente:
func New(engine ocr.Engine) *Handler {
return &Handler{engine: engine}
}
Factory Pattern
La creación del motor OCR se centraliza en una función factory que encapsula la lógica de inicialización compleja.
Middleware Chain (Chain of Responsibility)
Chi router implementa una cadena de middleware para CORS, logging, recovery y timeouts.
Principios SOLID aplicados
| Principio | Implementación |
|---|---|
| SRP | Handler solo maneja peticiones HTTP, TesseractEngine solo ejecuta OCR, Logger solo registra peticiones |
| OCP | La interfaz Engine permite agregar nuevos motores OCR sin modificar código existente |
| LSP | Cualquier implementación de Engine puede sustituir a otra cumpliendo el contrato |
| ISP | La interfaz Engine solo expone métodos que los clientes necesitan |
| DIP | Handler depende de la abstracción Engine, no de TesseractEngine directamente |
API Endpoints
Extraer texto
POST /api/extract
Content-Type: multipart/form-data
Respuesta:
{
"filename": "documento.pdf",
"full_text": "Texto extraído completo...",
"boxes": [
{
"page": 1,
"text": "palabra",
"confidence": 0.95,
"bbox": { "x": 100, "y": 200, "width": 80, "height": 20 }
}
],
"total_lines": 150,
"total_pages": 3,
"processed_at": "2026-01-08T10:30:00Z"
}
Health Check
GET /health → { "status": "healthy" }
Clean Code
- Nombrado claro y descriptivo — funciones como
ExtractText,NewTesseractEngine - Manejo de errores explícito — errores envueltos con contexto usando
fmt.Errorf - Context awareness — timeouts configurados, cancelación de operaciones largas
- Resource cleanup — uso consistente de
deferpara limpieza de recursos
Repositorio
🔗 github.com/Vic-Lara-Gilles/Go-OCR
Lenguajes: TypeScript 57.2% · Go 23.1% · CSS 5.1%
Licencia: MIT