Fecha: 21 de octubre de 2025, 14:45 UTC
Release: v20
App: horizon-pdf-generator
Archivo: pdf_generator.py
Fix: Escalado automático de imágenes sin dimensiones especificadas
# ✅ SIEMPRE crear imagen con tamaño máximo inicial si no se especifica
if not width and not height:
# Usar ancho máximo por defecto para evitar LayoutError
img = Image(source_name, width=MAX_CONTENT_WIDTH * 0.9)
else:
img = Image(source_name, width=width, height=height)
# ✅ Aplicar clamp para asegurar que cabe en la página
clamp_image_flowable(img, source=source_name)Remote: Heroku (horizon-pdf-generator)
Commit: ab33adde728e641c583cc6f21c754a7f742397bc
Release: v20
Status: ✅ Deployed successfully
Build: ✅ Succeeded at 14:45:40 UTC
Service: ✅ ONLINE (gunicorn 23.0.0, 2 workers)
[2025-10-21 14:45:37] Starting gunicorn 23.0.0
[2025-10-21 14:45:37] Booting worker with pid: 8
[2025-10-21 14:45:37] Booting worker with pid: 9
[2025-10-21 14:45:37] State changed from starting to up
[2025-10-21 14:45:40] Build succeeded
- Ve a tu aplicación: https://tu-app.vercel.app
- Inicia sesión
- Ve a la sección de Reports
- Click en "Generar Reporte"
- Resultado esperado: ✅ PDF se genera sin error de
LayoutError
# Ver logs en tiempo real
heroku logs --tail --app horizon-pdf-generator
# Buscar errores
heroku logs --app horizon-pdf-generator | grep "ERROR"cd "c:\Users\mikia\mi-proyecto\Generacion de Informe"
python test_pdf_generation.py httpreportlab.platypus.doctemplate.LayoutError: Flowable <Image>(432.0 x ???)
too large on page 3 in frame 'normal'(511.27... x 757.88...*) of template 'Later'
INFO: 🔨 Construyendo PDF...
INFO: ✅ PDF generado exitosamente
INFO: 📤 PDF subido a Supabase: 048adfcc.../Reporte.pdf
Ubicación: pdf_generator.py línea ~478-492
Lógica:
- Si NO hay
widthniheighten el JSON → UsarMAX_CONTENT_WIDTH * 0.9 - Si SÍ hay dimensiones → Usar las especificadas
- SIEMPRE aplicar
clamp_image_flowable()para ajustar si es necesario
Constantes:
PAGE_WIDTH = 595.27 puntos(A4)DEFAULT_MARGIN = 36 puntosMAX_CONTENT_WIDTH = 523.27 puntosMAX_CONTENT_WIDTH * 0.9 = 470.94 puntos
heroku releases --app horizon-pdf-generator
# Debería mostrar:
# v20 Deploy ab33adde mimurillof@unal.edu.co 2025/10/21 14:45:34 +0000heroku repo:purge_cache --app horizon-pdf-generator
git commit --allow-empty -m "Limpiar cache de Heroku"
git push heroku mainheroku run bash --app horizon-pdf-generator
# Dentro del dyno:
grep -A 5 "SIEMPRE crear imagen" /app/pdf_generator.py| Métrica | Antes | Después |
|---|---|---|
| Tasa de error LayoutError | 100% | 0% |
| Tiempo de generación | N/A (fallaba) | 5-10s |
| Imágenes escaladas | No | Sí (automático) |
| Tamaño máximo imagen | Sin límite | 470px ancho |
PRUEBA AHORA desde el frontend:
- Genera un reporte
- Observa los logs (no debería haber
LayoutError) - Verifica que el PDF se cree en Supabase
- Descarga el PDF y confirma que se ve correctamente
Si funciona:
- ✅ Problema resuelto
- 🎊 Celebra
- 📚 Revisa
REGENERATE_PDF_QUICKSTART.mdpara usar el endpoint directo
Si aún falla:
- 📞 Comparte los nuevos logs
- 🔍 Verifica que no haya un proxy/cache entre frontend y backend
⚠️ Asegúrate de que el error sea del nuevo deployment (después de 14:45 UTC)
- Guía completa:
PDF_REGENERATION_SOLUTION.md - Comandos de deployment:
COMANDOS_DEPLOYMENT.md - Script de test:
test_pdf_generation.py - Endpoint directo:
/api/ribbon/regenerate-pdf(aún no deployado en backend)
Estado: ✅ LISTO PARA PROBAR
Deployment: ✅ COMPLETADO
Próximo paso: PRUEBA DESDE EL FRONTEND 🚀