udistrital / sga_cliente

:heavy_check_mark: Check: cliente del Sistema de Gestión Académica (SGA)
Other
1 stars 3 forks source link

Revisión del flujo de consulta del servicio de generación de pdf de syllabus, optimizar el tiempo de respuesta del generador en ambiente de pruebas. #1495

Closed fabianbarreto02 closed 7 months ago

fabianbarreto02 commented 9 months ago

Se requiere realizar la Revisión del flujo de consulta del servicio de generación de pdf de syllabus, optimizar el tiempo de respuesta del generador en ambiente de pruebas.

Sub Tareas

Criterios de aceptación

Requerimientos

No aplica

Definition of Ready - DoR

Definition of Done - DoD - Desarrollo

milo19980525 commented 8 months ago

@edwargl7 por favor comentar avances y tareas realizadas.

edwargl7 commented 8 months ago

Pruebas Locales

Se toma como segunda opción la realización de la plantilla y su el llenado de cada campo empleando el lenguaje Go, por medio de las librerías excelize para el uso y generación de un archivo XLSX y la conversión de este a PDF usando la librería gofpdf. Estas librerías ya fueron usadas en el proyecto de SGA para realizar reportes tanto en XLSX como en PDF, obteniendo buenos tiempos de respuesta.

Se realizan diferentes pruebas para generar el PDF.

Pruebas realizadas

1. Uso de la librería Excelize con un archivo XLSX base

Se realiza la prueba partiendo de una plantilla con la estructura del documento esperado como base para construir la plantilla, sin embargo, el resultado al realizar la conversión a PDF no fue el esperado y el manejo de las dimensiones fue más difícil que al realizar la creación desde cero usando la librería. output.pdf

2. Uso de la librería Excelize creación de la plantilla desde cero

Parte 1 Se realiza la creación de la plantilla desde cero, creando cada celda usando la librería y se presenta el mismo problema de espacios grandes al finalizar cada hoja con textos grandes (error encontrado en las pruebas usando la librería weasyprint con python en la otra solución antes de usar la versión con la imagen de docker).

Parte 2 Se obtiene un resultado viable y se procede a realizar la prueba creando la función lambda con este código base para validar dependencias adicionales de las librerías en la imagen base de la lambda y se encuentra que con la compilación y ejecución normal funciona correctamente. Obteniendo una disminución en las pruebas locales de 6 segundos respecto la solución con Python.

Parte 3 Se procede a realizar unas funciones que permitan dividir el contenido de texto dependiendo el espacio restante en cada hoja para tratar de cubrir los espacios en el final de cada hoja. Se realiza un primer acercamiento a la solución partiendo de obtener un aproximado de cantidad de caracteres por cada línea o renglón del PDF (en este caso se tomaron 140 caracteres por línea) y se aproxima cuantas líneas caben para un tamaño de celda por defecto de 15.

Se realizan varias pruebas con diferentes cantidades de texto combinando párrafos Lorem con saltos de línea y sin saltos de línea de diferentes longitudes. Encontrando que este primer calculo para determinar los lugares donde se debe partir el texto en diferentes celdas, es impreciso entre mayor cantidad de texto se tiene. Adicional, los saltos de línea y los diferentes escenarios validados (espacios grandes, medianos, pequeños en cada hoja para los párrafos) permitieron identificar que no se podía superar una altura de celda de 400 sin importar si se contaba con dicha longitud sobrante en la hoja (Prueba para determinar altura máxima). output4.pdf

Por lo que se realiza la creación de una plantilla de celdas que permitiera identificar con mayor exactitud el área disponible de trabajo por hoja. output3.pdf

Se realizaron diversos ajustes para alcanzar un mejor comportamiento en el cálculo de altura y textos largos y cortos, por medio, del operador % y definición de valores dentro de rangos para agregar más altura dependiendo la longitud, sin embargo el resultado no era el esperado. Por lo que se planteó encontrar un valor para altura aproximado que permitiera un control más cercano a cada renglón del texto. Y manejando unos renglones de error dado que al no ser el texto justificado se presentaron casos en los que al encontrarse al final de las líneas palabras largas que se pasaban al siguiente renglón, generaban más líneas que las esperadas al dividir por 140.

Se emplea el valor de altura por renglón de 10 y un incremento de línea por cada salto de línea encontrado +1, y adicionalmente una adición de 1 para textos cortos y medianos que permitan mitigar las líneas adicionales generadas explicado anteriormente. Se obtienen mejores resultados.

Fue necesario para la separación de textos en diferentes celdas calcular cuantos caracteres podían agregarse en la primera celda y con esta establecer una ventana o cantidad de caracteres del final de esa división para buscar el último espacio en blanco de dichos caracteres y tomar este como el indice en el que se realizaría la división del texto para mantener una división más natural.

3. Uso de la librería gofpdf como opción directa en la construcción del template

Se realiza la investigación de la posibilidad de poder aplicar la alineación de texto justificado, dentro de la cual se encuentra la función MultiCell de dicha librería, que cuenta con unas ventajas y es poder aplicar la alineación requerida, además, de facilitar la división del texto sin requerir funciones de calculo de altura y separación de texto al finalizar cada hoja, lo cual permitía tener un resultado mejor. Pero se encontró un problema al aplicar dicha solución el la tabla de propuestas, ya que al finalizar cada columna el final de la hoja y requerir más espacio vertical en la siguiente hoja para el contenido faltante, en la primer columna esta función agrega una hoja y ubica correctamente el texto restante, pero al pasar a la siguiente columna, este crea una nueva página adicional, sin importar que la hoja creada por la primera columna cuenta con el espacio suficiente para agregar en esta cada columna siguiente, comportamiento que no es el correcto para esa sección del documento, por lo que, se decide volver a la solución partiendo del documento de excel.

pruebadir.pdf

edwargl7 commented 7 months ago

Resultado final :x:

Se realizaron diferentes pruebas con tamaños de contenido variados para revisar el comportamiento en el diseño. Pero los resultados obtenidos pasando del XLSX a PDF no fueron los esperados, se trataron de realizar la mayor cantidad de ajustes para tener un buen resultado pero se encontraron varios fallos en el diseño que no podían ser mejorados.

Observaciones

edwargl7 commented 7 months ago

Código fuente

Código fuente del experimento realizado. Código_prueba_XLSX_2_PDF.zip

fabianbarreto02 commented 7 months ago

Se da por finalizada la issue