Todos los proyectos

PrintCost

Estimador automático de costos de impresión

Rol
Desarrollador Full Stack Desktop
Cliente
Uso personal / distribución pública
Duración
15-02-2026 — 05-03-2026
Año
2026
Equipo
1 persona
Desktop AppWindowsAutomatización
Python 3.14CustomTkinterPyMuPDFNumPySQLitePillowWatchdogReportLabOpenPyXLpywin32PystraySumatra PDF
PrintCost

Problema

¿Qué había que resolver?

La estimación manual de costos de impresión es propensa a errores y consume mucho tiempo, especialmente en entornos con alta volumetría de trabajos.

Solución

¿Cómo se resolvió?

Implementar una solución automática que analice visualmente los documentos PDF y calcule los costos de impresión basados en la cobertura de tinta por canal CMYK.

Características

Lo que hace

  • Análisis de cobertura CMYK por página mediante renderizado con PyMuPDF y cálculo vectorizado con NumPy
  • Detección automática de nuevos PDFs en carpeta vigilada via Watchdog
  • Cálculo de costos basado en precio y cantidad de tinta comprada en ml
  • Cola de trabajos con selección de impresora diferente por trabajo
  • Reenvío silencioso a impresora física via Sumatra PDF
  • Historial de trabajos en SQLite con consultas por día, mes y fecha específica
  • Exportación de reportes en Excel, CSV, PDF carta y PDF ticket 80mm
  • Tipos de papel personalizados (opalina, fotográfico, sticker, etc.)
  • Sistema de banners publicitarios con caché local e imágenes descargadas
  • Modo claro y oscuro con paleta completa
  • System tray — vive en segundo plano sin interrumpir el flujo de trabajo
  • Selector de copias con recálculo de costos en tiempo real
  • Precio sugerido editable por trabajo

Responsabilidades

Mi rol en el proyecto

  • Diseño e implementación completa de la arquitectura de la aplicación
  • Desarrollo del motor de análisis CMYK con PyMuPDF y NumPy
  • Implementación de la interfaz gráfica con CustomTkinter
  • Integración con APIs de Windows para gestión de impresoras via pywin32
  • Diseño del sistema de persistencia con SQLite y JSON
  • Implementación del sistema de banners con caché local y descarga asíncrona
  • Generación de reportes en múltiples formatos con ReportLab y OpenPyXL

Retos técnicos

Lo que no fue trivial

Intercepción de impresión

Interceptar trabajos de impresión sin depender de una marca específica de impresora, resuelto usando una impresora virtual como PDFCreator como intermediaria

Estimación CMYK

Estimar cobertura de tinta CMYK con precisión razonable sin acceso al RIP de la impresora, resuelto mediante conversión RGB→CMYK por canal con NumPy sobre páginas renderizadas

Impresión silenciosa en Windows

Reenviar trabajos a impresoras físicas de forma silenciosa y confiable en Windows, resuelto usando Sumatra PDF con cadena de fallback a ShellExecute

Persistencia de datos

Mantener datos del usuario separados del ejecutable para soportar actualizaciones sin pérdida de información, resuelto almacenando todo en AppData/Local/PrintCost

Procesamiento eficiente de documentos

Procesar documentos de 50 a 100 páginas sin bloquear la interfaz, resuelto con ThreadPoolExecutor para análisis paralelo por página y reducción de DPI de renderizado

Resultado

Qué se logró

  • Tiempo de análisis reducido en ~70% al pasar de procesamiento secuencial a paralelo con DPI optimizado
  • Sistema funcional que detecta, analiza y reenvía trabajos de impresión de forma completamente automática
  • Historial completo con cálculo de ganancias por día y mes listo para uso en entorno real de papelería
  • Arquitectura modular que permite escalar a versión SaaS o punto de venta en futuras iteraciones
  • El modo RAW de win32print no es compatible con impresoras de inyección de tinta domésticas — requieren pasar por el driver de Windows
  • CustomTkinter en Python 3.14 tiene comportamientos inconsistentes con grab_set y CTkScrollableFrame que requieren workarounds específicos
  • La conversión RGB→CMYK es una aproximación útil para estimación de costos pero no reemplaza el análisis del RIP real de la impresora
  • Separar los datos del usuario en AppData desde el inicio del proyecto evita problemas de migración al crear el instalador