Cómo Generar Reportes Imprimibles con Python, py3o y LibreOffice

Soy un amante de las tecnologías libres y Python es el lenguaje de programación que más utilizo. Recientemente me enfrenté a la necesidad de encontrar una librería escrita en Python que me facilitara el trabajo a la hora de hacer los reportes imprimibles de los sistemas y aplicaciones que desarrollo de conjunto con mis colegas de trabajo.
El problema concreto surge debido a que se me dio la tarea, en la empresa donde trabajo, de desarrollar una aplicación que dentro de sus funcionalidades principales incluía la de imprimir un reporte en una plantilla pre-impresa.
Traté de utilizar una librería para generar el reporte en formato PDF, pero me fue casi imposible hacer coincidir los datos a imprimir con las posiciones de los escaques en la plantilla pre-impresa.Además de esto, al realizar las pruebas de impresión con el formato PDF el texto era casi ilegible, pues para el trabajo se utilizaría una impresora matricial o de cinta, como se conoce popularmente.Finalmente me convencí de que debía buscar otra solución. Fue entonces que apareció py3o.


Tabla de Contenidos

La Librería py3o

Preguntando a desarrolladores con más experiencia un amigo me recomendó utilizar la librería py3o, con la promesa de que esta me solucionaría los dos problemas con que me enfrentaba.

Según la página del proyecto: “py3o es una solución elegante y escalable para diseñar informes utilizando LibreOffice”. En el momento en que leí esto, supe que era lo que estaba buscando.

Luego de revisar detalladamente la documentación de py3o di con py3o.template, que es el módulo que se sirve para fusionar los datos con un documento en formato ODF que sirve de platilla o template para generar el reporte. Este documento se puede crear fácilmente con la ayuda de LibreOffice / OpenOffice.

Otras de las ventajas de esta librería Python, es que es totalmente independiente de la plataforma o sistema operativo y no requiere que el propio LibreOffice / OpenOffice esté instalado para generar el archivo ODF, haciendo evidente otras de las ventajas del uso de los estándares abiertos.

py3o en Acción

Para comprobar el funcionamiento de py3o, específicamente del módulo py3o.template, puedes utilizar un ejemplo sencillo y muy común en el mundo del desarrollo de software, sí, sí, ese mismo, el “Hello World!!”.

Antes que todo, debes instalar la librería y sus dependencias, para lo cual seguirás las instrucciones que ofrecen en el sitio del proyecto.

Luego creas una carpeta donde guardar los archivos del proyecto. En esta carpeta creas un archivo llamado hello.py con el contenido siguiente:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# file: hello.py

from py3o.template import Template


# Clase Item auxiliar necesaria para pasar los parámetros a la librería py3o.
# Es necesaria debido a que la libreria solo admite la iteración sobre objetos
# con la notación objeto.atributo
class Item:
    """Clase auxiliar para pasar los datos a la librería."""

    def __init__(self, hello=''):
        self.hello = hello

# Se crea la platilla para generar el informe
# hello_world_input.odt: plantilla, documento de entrada
# hello_world_output.odt: informe generado, documento de salida
t = Template("hello_world_input.odt", "hello_world_output.odt")

# Creas el objeto de la clase Item
document = Item()

# Asignas un valor al atributo hello
document.hello = 'Hello World!!'

# Creas un diccionario con los objetos para generar el informe
data = dict(document=document)

# Generas el informe con los valores anteriores
t.render(data)

Seguidamente creas un documento .odt empleando LibreOffice, el cual te servirá como plantilla. Una vez creado, puedes guardarlo en la carpeta del proyecto con el nombre hello_world_input.odt.

Dentro del documento, insertas un campo, para lo cual debes ir a: Menú→Insertar→Campos→Más campos.

En el cuadro de diálogo Campos, selecciona la pestaña Variables. Creas un campo que debe ser de tipo Campo de usuario, y le asignas el nombre py3o.document.hello y el formato Texto.

Nota: El nombre del campo debe construirse a partir del nombre del objeto y del atributo que contendrá el valor a transferir al informe, es decir document.hello. Además, debe hacer referencia a la librería py3o. Es por esto que en este caso el campo debe llamarse py3o.document.hello.

En la figura siguiente se muestra todo el proceso:

Después de realizar estos pasos, guarda todo y ejecuta el script hello.py para generar el informe:

$ python3 hello.py

Al ejecutar el script se genera, en la misma carpeta, el reporte de salida según la plantilla antes definida y se sustituyen los valores de las variables como se puede ver en imagen siguiente:

Conclusión

En esta entrada has podido desarrollar un ejemplo muy sencillo que te ha permitido conocer la forma de trabajar con la librería py3o y con LibreOffice para generar informes imprimibles.

La creación de reportes imprimibles con el empleo de py3o, permite muchas funcionalidades más, como por ejemplo: ciclos, formas condicionales e inserción de imágenes, por solo citar algunas.

Al utilizar py3o en combinación con LibreOffice, ganas en exactitud, pues los datos se insertan en el reporte ocupando exactamente el lugar que seleccionaste.

py3o optimiza el tiempo de desarrollo, pues evita tener que probar una y otra ves el mismo reporte hasta que todo quede en el lugar deseado.

Si bien es cierto que quizás no sirva para todos los reportes que haces, es una excelente opción que siempre debes tener cuenta.

Lecturas Recomendadas

Para ganar en conocimiento y profundizar en los detalles del funcionamiento de py3o, puedes visitar la página del proyecto en Readthedocs. También puedes encontrar ejemplos útiles en el repositorio de desarrollo de la librería en GitHub.

Autores:

Ing. Fidel Jimenez Sanzano
Ing. Yoannis Dominguez Carrero

4 comentarios

Ir al formulario de comentarios

    • Cesar en 28 enero, 2019 a las 2:01 pm

    No lo conocía, eso está genial, si solo hubiese una forma sin muchas dependencias de llevar eso a pdf… voy a buscar.

    Saludos.

    1. Si encuentras algo al respecto me avisas, sería genial.
      saludos,
      lpozo

    • Lorenzo en 28 enero, 2019 a las 8:29 pm

    Muy interesante, en general yo usaba plantillas en html y luego las convertía si hacia falta, pero siempre es bueno conocer otras alternativas, yo también voy a investigar un poco mas del tema es que python es tan grande que uno nunca sabes lo que te puedes encontrar en internet.

    Saludos

    1. Que si es grande!! El ecosistema Python es lo más interesante del lenguaje, hay de todo un poco.
      saludos y suerte con la búsqueda,
      lpozo

Los comentarios han sido desactivados.