Transcribe lo que quieras con GLM OCR. Plug and play
Python
11
2 commits
updated Mar 20, 2026
Proyecto para testear las capacidades de GLM-OCR (modelo de 0.9B parámetros) ejecutándose en local con Ollama para transcripción de texto desde imágenes y PDFs, generando JSONs estructurados consistentes.
glm-ocr:latest (2.2GB, 128K contexto)Nota: Requiere Ollama 0.18.1+ (versiones anteriores tienen un bug con el procesamiento de imágenes del modelo glmocr).
GLM-OCR/
├── config/
│ └── settings.py # Configuración central (rutas, prompts, modelo)
├── input/
│ ├── images/ # ← PON TUS IMÁGENES AQUÍ (.png, .jpg, .jpeg, .webp)
│ └── pdfs/ # ← PON TUS PDFs AQUÍ
├── output/
│ ├── json/ # JSONs estructurados generados
│ ├── markdown/ # Resultados en Markdown
│ └── raw/ # Respuestas crudas del modelo
├── src/
│ ├── ocr_client.py # Cliente Ollama API con preprocesamiento SDK
│ ├── invoice_parser.py # Parser regex de facturas → JSON estructurado
│ ├── pdf_handler.py # Conversión PDF → imágenes
│ ├── processor.py # Orquestador del pipeline
│ ├── result_formatter.py # Parseo y guardado de resultados
│ └── utils.py # Utilidades (logger, base64, etc.)
├── logs/ # Logs de ejecución
├── run.py # Procesar TODOS los archivos
├── run_single.py # Procesar UN archivo individual
├── check_setup.py # Verificar que todo está listo
└── requirements.txt # Dependencias Python
ollama pull glm-ocr:latest
pip install -r requirements.txt
python check_setup.py
input/images/input/pdfs/# Procesar facturas → JSON estructurado (default)
python run.py --mode invoice
# Otros modos
python run.py --mode text # Solo texto plano
python run.py --mode table # Reconocimiento de tablas
python run.py --mode markdown # Conversión a Markdown
python run.py --mode structured_json # JSON genérico
# Procesar un archivo individual
python run_single.py input/images/factura1.PNG --mode invoice
El pipeline opera en dos fases:
OCR con GLM-OCR: El modelo extrae texto/markdown de la imagen usando el endpoint /api/generate de Ollama, con preprocesamiento de imagen compatible con el SDK oficial (smart_resize a 28px, conversión RGBA→RGB, codificación JPEG).
Estructuración con Parser: Para el modo invoice, el texto OCR se parsea con regex en invoice_parser.py extrayendo: número de factura, fechas, emisor/receptor, líneas de detalle (descripción, cantidad, precio, total), subtotal, descuento, IVA, retención, total y datos de pago.
| Modo | Descripción | Output |
|---|---|---|
structured_json | Extrae texto y lo estructura en JSON con tipos de bloque | output/json/ |
text | Reconocimiento de texto plano | output/markdown/ |
table | Reconocimiento de tablas | output/markdown/ |
markdown | Documento completo en Markdown | output/markdown/ |
figure | Reconocimiento de figuras/gráficos | output/markdown/ |
{
"pages": [
{
"page": 1,
"blocks": [
{
"type": "title",
"content": "Título del documento",
"order": 1
},
{
"type": "paragraph",
"content": "Texto del párrafo extraído...",
"order": 2
},
{
"type": "table",
"content": "| Col1 | Col2 |\n|------|------|\n| A | B |",
"order": 3
}
]
}
]
}
Edita config/settings.py para ajustar:
OLLAMA_BASE_URL — URL de Ollama (default: http://localhost:11434)OLLAMA_MODEL — Modelo a usar (default: glm-ocr:latest)PDF_DPI — Calidad de conversión PDF→imagen (default: 300)PROMPTS — Prompts personalizados para cada modo2 commits
Python
100.0%
Transcribe lo que quieras con GLM OCR. Plug and play
Python
11
2 commits
updated Mar 20, 2026
Proyecto para testear las capacidades de GLM-OCR (modelo de 0.9B parámetros) ejecutándose en local con Ollama para transcripción de texto desde imágenes y PDFs, generando JSONs estructurados consistentes.
glm-ocr:latest (2.2GB, 128K contexto)Nota: Requiere Ollama 0.18.1+ (versiones anteriores tienen un bug con el procesamiento de imágenes del modelo glmocr).
GLM-OCR/
├── config/
│ └── settings.py # Configuración central (rutas, prompts, modelo)
├── input/
│ ├── images/ # ← PON TUS IMÁGENES AQUÍ (.png, .jpg, .jpeg, .webp)
│ └── pdfs/ # ← PON TUS PDFs AQUÍ
├── output/
│ ├── json/ # JSONs estructurados generados
│ ├── markdown/ # Resultados en Markdown
│ └── raw/ # Respuestas crudas del modelo
├── src/
│ ├── ocr_client.py # Cliente Ollama API con preprocesamiento SDK
│ ├── invoice_parser.py # Parser regex de facturas → JSON estructurado
│ ├── pdf_handler.py # Conversión PDF → imágenes
│ ├── processor.py # Orquestador del pipeline
│ ├── result_formatter.py # Parseo y guardado de resultados
│ └── utils.py # Utilidades (logger, base64, etc.)
├── logs/ # Logs de ejecución
├── run.py # Procesar TODOS los archivos
├── run_single.py # Procesar UN archivo individual
├── check_setup.py # Verificar que todo está listo
└── requirements.txt # Dependencias Python
ollama pull glm-ocr:latest
pip install -r requirements.txt
python check_setup.py
input/images/input/pdfs/# Procesar facturas → JSON estructurado (default)
python run.py --mode invoice
# Otros modos
python run.py --mode text # Solo texto plano
python run.py --mode table # Reconocimiento de tablas
python run.py --mode markdown # Conversión a Markdown
python run.py --mode structured_json # JSON genérico
# Procesar un archivo individual
python run_single.py input/images/factura1.PNG --mode invoice
El pipeline opera en dos fases:
OCR con GLM-OCR: El modelo extrae texto/markdown de la imagen usando el endpoint /api/generate de Ollama, con preprocesamiento de imagen compatible con el SDK oficial (smart_resize a 28px, conversión RGBA→RGB, codificación JPEG).
Estructuración con Parser: Para el modo invoice, el texto OCR se parsea con regex en invoice_parser.py extrayendo: número de factura, fechas, emisor/receptor, líneas de detalle (descripción, cantidad, precio, total), subtotal, descuento, IVA, retención, total y datos de pago.
| Modo | Descripción | Output |
|---|---|---|
structured_json | Extrae texto y lo estructura en JSON con tipos de bloque | output/json/ |
text | Reconocimiento de texto plano | output/markdown/ |
table | Reconocimiento de tablas | output/markdown/ |
markdown | Documento completo en Markdown | output/markdown/ |
figure | Reconocimiento de figuras/gráficos | output/markdown/ |
{
"pages": [
{
"page": 1,
"blocks": [
{
"type": "title",
"content": "Título del documento",
"order": 1
},
{
"type": "paragraph",
"content": "Texto del párrafo extraído...",
"order": 2
},
{
"type": "table",
"content": "| Col1 | Col2 |\n|------|------|\n| A | B |",
"order": 3
}
]
}
]
}
Edita config/settings.py para ajustar:
OLLAMA_BASE_URL — URL de Ollama (default: http://localhost:11434)OLLAMA_MODEL — Modelo a usar (default: glm-ocr:latest)PDF_DPI — Calidad de conversión PDF→imagen (default: 300)PROMPTS — Prompts personalizados para cada modo2 commits
Python
100.0%