← 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íaRol
Go 1.21+Lenguaje principal
Chi Router v5HTTP routing y middleware
Tesseract OCR 5.xMotor de reconocimiento óptico
Poppler 23.xConversión PDF a imágenes (pdftoppm)
gosseract v2Bindings de Tesseract para Go
gofrs/uuidGeneración de IDs únicos

Frontend

TecnologíaRol
React 18UI library
TypeScriptType safety
ViteBuild tool
TanStack QueryEstado asíncrono y caché
Lucide ReactIconos
CSS puroEstilos (sin frameworks CSS)

Infraestructura

TecnologíaRol
DockerContainerización
Docker ComposeOrquestación multi-contenedor
Alpine LinuxImagen base ligera
NginxServidor 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

PrincipioImplementación
SRPHandler solo maneja peticiones HTTP, TesseractEngine solo ejecuta OCR, Logger solo registra peticiones
OCPLa interfaz Engine permite agregar nuevos motores OCR sin modificar código existente
LSPCualquier implementación de Engine puede sustituir a otra cumpliendo el contrato
ISPLa interfaz Engine solo expone métodos que los clientes necesitan
DIPHandler 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