← Volver a publicaciones

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

Flujo de una petición: el browser llama al HTTP layer, que delega al handler, que invoca el motor OCR vía la interfaz de dominio

Estructura del proyecto

Estructura del proyecto — go-ocr/ como raíz, 4 directorios de primer nivel, cada uno con sus hijos

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 defer para limpieza de recursos

Repositorio

🔗 github.com/Vic-Lara-Gilles/Go-OCR

Lenguajes: TypeScript 57.2% · Go 23.1% · CSS 5.1%

Licencia: MIT