Versión en inglés: docs/README.en.md
API Python/Flask de procesamiento documental con IA, patrones de diseño y arquitectura limpia. Proyecto de portafolio que demuestra cómo transformar documentos no estructurados (PDF) en datos estructurados mediante un pipeline extensible: diagnóstico OCR, extracción regex o IA, y respuesta JSON estandarizada.
No es un script OCR aislado: es una plataforma de inteligencia documental donde OCR, extractores y proveedores de IA son capas intercambiables.
Recibe documentos PDF (nativos o escaneados), analiza su contenido, decide si requiere OCR, extrae campos relevantes según el tipo de documento y devuelve una respuesta estructurada lista para integrarse en flujos de validación o automatización.
Casos de uso actuales:
- CSF (Constancia de Situación Fiscal): extracción regex de RFC, CURP, nombre, régimen fiscal, etc.
- INE: extracción vía IA con hints de CURP y soporte multimodal (Gemini).
- Otros tipos registrados (
comprobante_domicilio,estado_cuenta,licencia_profesional) funcionan conextractor=aio devuelven campos vacíos con regex.
- Arquitectura limpia: Controller → Service → Factory → Processor/Extractor, con contratos e inversión de dependencias.
- Patrones de diseño: Strategy (procesadores, extractores, OCR) y Factory (selección dinámica por tipo de archivo y documento).
- Pipeline PDF inteligente: PyMuPDF diagnostica densidad de texto y decide entre extracción embebida u OCR.
- OCR con preprocesamiento: Tesseract + OpenCV (escala de grises, contraste, reducción de ruido) + imágenes temporales para IA multimodal.
- IA intercambiable:
AiExtractorcon providers Gemini (imagen + texto) y Groq (solo texto). - Validación de entrada: Marshmallow schemas, excepciones centralizadas, logging estructurado.
- Contenedorización: Docker + nginx como reverse proxy.
| Área | Estado | Detalle |
|---|---|---|
API Flask (health, documents/process) |
✅ Estable | Endpoints funcionales con respuesta estandarizada |
| Procesamiento PDF (PyMuPDF) | ✅ Estable | Metadatos, rango de páginas, diagnóstico OCR |
| Pipeline OCR (Tesseract + OpenCV) | ✅ Estable | Preprocesamiento, temp images, cleanup |
CSF (extractor=regex) |
✅ Estable | CsfExtractor con tests unitarios |
INE (extractor=ai) |
✅ Estable | Gemini multimodal + hints CURP |
| Multi-provider AI (Gemini, Groq) | ✅ Estable | Seleccionable por request |
| Docker + nginx | ✅ Estable | docker-compose up |
comprobante_domicilio, estado_cuenta, licencia_profesional |
🔄 Parcial | Registrados; sin extractor regex dedicado |
| Validación de reglas de negocio | 🔄 Pendiente | Capa definida conceptualmente |
| Tests de integración API / IA | 🔄 Pendiente | Solo tests unitarios de CSF |
| Procesadores Image, Excel, CSV, Word | 📋 Planificado | Arquitectura preparada, no implementados |
| Extractores regex INE, comprobante, etc. | 📋 Planificado | — |
| Providers Claude, Azure, AWS | 📋 Planificado | — |
| Capa | Tecnología |
|---|---|
| Lenguaje | Python 3.12 |
| Framework | Flask 3 |
| PyMuPDF, pdf2image | |
| OCR | Tesseract, pytesseract |
| Imagen | Pillow, OpenCV |
| Validación | Marshmallow |
| IA | Google Gemini, Groq |
| Tests | pytest |
| Infra | Docker, nginx |
Client
↓
POST /api/v1/documents/process
↓
Controller → DocumentService
↓
DocumentProcessorFactory → PdfProcessor
↓
Diagnosis (OCR required?)
├── NO → Embedded text extraction
└── YES → TesseractOcr (+ OpenCV preprocess → temp images)
↓
ExtractorFactory
├── CsfExtractor (regex)
├── AiExtractor → Gemini / Groq
└── PassthroughExtractor (fallback regex)
↓
JSON Response (camelCase fields)
Documentación técnica detallada: README_CONTEXT.md
document-intelligence-engine/
├── app/
│ ├── config/
│ ├── contracts/
│ ├── controllers/
│ ├── exceptions/
│ ├── extractors/
│ │ └── ai/ # gemini_extractor, groq_extractor, base_ai_extractor
│ ├── factories/
│ ├── helpers/
│ ├── ocr/
│ ├── processors/
│ │ ├── base/
│ │ └── pdf/
│ ├── routes/
│ ├── schemas/
│ ├── services/
│ ├── utils/ # curp_decoder, case_converter
│ └── validators/
├── docker/
├── nginx/
├── storage/
│ ├── debug/
│ ├── logs/
│ └── temp_images/
├── tests/
│ └── extractors/
├── docs/
│ └── README.en.md
├── docker-compose.yml
├── index.py
├── requirements.txt
├── README.md
├── README_CONTEXT.md
├── NOTICE.txt
└── .env.example
- Python 3.12
- Tesseract OCR con paquete de idioma
spa - poppler-utils (requerido por pdf2image)
- Claves de API (solo si usas
extractor=ai):GEMINI_API_KEYy/oGROQ_API_KEY
git clone <repo-url>
cd document-intelligence-engine
python -m venv venv
source venv/bin/activate # Windows: venv\Scripts\activate
pip install -r requirements.txt
cp .env.example .env
# Edita .env con tus claves de IA si aplica
python index.py
# API disponible en http://localhost:5000cp .env.example .env
docker compose up --build
# API disponible en http://localhost (nginx → app:5000)Consulta .env.example. Variables principales:
| Variable | Descripción |
|---|---|
APP_ENV |
Entorno (local, production) |
APP_DEBUG |
Modo debug Flask |
MAX_FILE_SIZE_MB |
Tamaño máximo de archivo (default: 10) |
DEFAULT_EXTRACTOR |
Extractor por defecto (regex o ai) |
AI_PROVIDER |
Provider IA por defecto (gemini o groq) |
GEMINI_API_KEY |
Clave API de Google Gemini |
GROQ_API_KEY |
Clave API de Groq |
Base URL: /api/v1
Verifica que el servicio esté activo.
Response:
{
"ok": true,
"status": 200,
"message": "Success request",
"data": {
"message": "Document Intelligence Engine is running"
},
"meta": {
"request_id": "uuid",
"env": "local",
"timestamp": "2026-07-11T07:00:00+00:00"
}
}Procesa un documento PDF y extrae campos según tipo y estrategia.
Content-Type: multipart/form-data
| Parámetro | Tipo | Requerido | Descripción |
|---|---|---|---|
file |
file | Sí | PDF (máx. 10 MB) |
document_type |
string | Sí | ine, csf, comprobante_domicilio, estado_cuenta, licencia_profesional |
fields |
list | No | Campos a extraer (usa defaults por tipo si se omite) |
extractor |
string | No | regex (default) o ai |
provider |
string | No | gemini o groq (solo con extractor=ai) |
force_ocr |
bool | No | Forzar OCR aunque el PDF tenga texto embebido |
from_page / to_page |
int | No | Rango de páginas (1-indexed) |
all_fields |
bool | No | Extraer todos los campos detectables (IA) |
include_raw_text |
bool | No | Incluir texto crudo en respuesta (default: true) |
debug_mode |
bool | No | Guardar imágenes OCR en storage/debug |
curl -X POST http://localhost:5000/api/v1/documents/process \
-F "file=@csf.pdf" \
-F "document_type=csf" \
-F "extractor=regex" \
-F "fields=rfc" \
-F "fields=curp" \
-F "fields=full_name"Response (parcial):
{
"ok": true,
"status": 200,
"message": "Success request",
"data": {
"fileType": "pdf",
"pages": 2,
"processedPages": { "from": 1, "to": 2 },
"hasText": true,
"isScanned": false,
"processingMethod": "text_extraction",
"ocrRequired": false,
"extractedFields": {
"rfc": "XAXX010101AAA",
"curp": "XAXX010101HDFAAA09",
"fullName": "JUAN PEREZ LOPEZ"
},
"diagnosis": {
"reason": "sufficient_text_density",
"confidence": "high"
}
}
}curl -X POST http://localhost:5000/api/v1/documents/process \
-F "file=@ine.pdf" \
-F "document_type=ine" \
-F "extractor=ai" \
-F "provider=gemini" \
-F "include_raw_text=false"Response (parcial):
{
"ok": true,
"status": 200,
"message": "Success request",
"data": {
"fileType": "pdf",
"processingMethod": "ocr",
"ocrRequired": true,
"extractedFields": {
"nombre": "JUAN",
"apellidoPaterno": "PEREZ",
"apellidoMaterno": "LOPEZ",
"curp": "XAXX010101HDFAAA09",
"claveElector": "PRPLJN01010109H000"
},
"text": null
}
}Screenshots de Postman:
docs/screenshots/.
# Activar entorno virtual
source venv/bin/activate
# Ejecutar tests
pytest tests/ -vCobertura actual: tests unitarios del extractor CSF (tests/extractors/test_csf_extractor.py).
- README_CONTEXT.md — visión del proyecto, SOLID, patrones, decisiones de arquitectura y estado de implementación.
- Extractores regex para INE y comprobante de domicilio
- Capa de validación de reglas de negocio
- Procesadores para Image, Excel, CSV, Word
- Tests de integración API e IA
- Providers adicionales (Claude, Azure Document Intelligence, AWS Textract)
Este proyecto no está licenciado para uso público. Todos los derechos reservados. Para obtener permisos de uso, contacta al propietario del proyecto en chichohdzjesus@gmail.com.
Consulta la licencia completa en NOTICE.txt.



