La génération de rapports
Introduction
Par génération de rapport, il faut comprendre génération automatique de documents. Il n’est pas rare de devoir envoyer un mail quand un fichier arrive, générer un état des disques ou des tables dans la base de données.
Bref, il faut communiquer de l’information et dans ce cas, on utilise généralement un format dédié : le format PDF.
Mais parfois, il faut aussi présenter les choses de manière simple et compréhensible pour tout le monde, et là, rien ne remplace le format HTML.
Ce chapitre est dédié à la génération automatique de document, mais aussi à la manière de générer des sites statiques à vocation interne.
La génération de PDF : Reportlab
La génération de rapports sur l’état des serveurs, la liste des machines virtuelles, le volume des bases de données… tout cela peut devenir fastidieux, même s’il s’agit de faire un copier/coller dans un document bureautique, document bureautique que l’on va envoyer au format PDF, qui est un format non modifiable (ou presque).
PDF (ou Portable Document Format) est un format créé par la société Adobe dans les années 1990, et qui est devenu depuis une norme ISO.
Le format PDF permet de présenter du texte, des images et d’autres médias, et ce quel que soit le système d’exploitation. Il est couramment utilisé dans le monde professionnel pour diffuser de l’information que l’on souhaite non modifiable.
Pourquoi ne pas générer directement le fichier PDF ?
On s’aperçoit très vite que les recherches Python sur la génération de PDF mènent quasiment toutes vers ce site : https://www.reportlab.com/
ReportLab est une entreprise commerciale, mais propose deux versions de son moteur de génération de PDF, dont l’une est open source et fait partie de quasiment toutes les distributions Linux.
Et pour finir, c’est écrit en Python.
L’outil est suffisamment imposant pour que des livres en fassent leur sujet (la documentation fournie sur le site fait quand même plus de 130 pages) : https://www.reportlab.com/docs/reportlab-userguide.pdf
Mais voici quelques scripts et conseils pour bien commencer.
Prérequis : pip install reportlab
Et le début en informatique est "hello world".
1. Hello World en PDF et Reportlab
#fichier : report/hello_reportlab.py
from reportlab.pdfgen import canvas
c = canvas.Canvas("hello.pdf")
c.drawString(100,100,"Bonjour le monde en pdf avec reportlab")
c.save()
Voici comment exécuter le script :
$ python hello_reportlab.py && evince hello.pdf
Normalement, un fichier hello.pdf a été généré et s’affiche, dans notre cas, grâce à la commande evince, mais il y a beaucoup d’autres visionneurs PDF.
On peut constater que le point d’origine de la page se trouve en bas à...
Le moteur de patrons Jinja2
Jinja est ce que l’on appelle un moteur de templates (patrons en français…).
Le framework Django l’utilise, mais dans une version modifiée, essentiellement pour le rendre plus sécure.
L’intérêt de Jinja est qu’il est écrit en Python et très fortement intégré à ce langage.
L’installation se fait avec ’pip install jinja2’.
Les moteurs de templates fonctionnent quasiment tous de la même manière : à partir d’un patron (template), on effectue le rendu en transmettant un contexte.
Un patron est constitué de parties fixes et de parties variables ; Jinja fournit même des boucles et des tests. Il est ainsi possible de générer différentes sorties avec un même patron en fonction du contexte.
Voici un exemple très simple :
#fichier : jinja/j1.py
from jinja2 import Template
reponse = input("Votre nom : ")
tm = Template("Bonjour {{ nom }}")
texte = tm.render(nom=reponse)
print(texte)
Le résultat est sans surprise :
$ python j1.py
Votre nom : chris
Bonjour chris
Mais c’est juste pour comprendre le principe.
1. Jinja et le HTML
En fait, Jinja a été créé pour la génération de pages HTML. Dans un site web, beaucoup de choses reviennent de page en page comme l’en-tête, le pied et certains paramétrages.
Jinja permet de préparer l’équivalent d’un fond de page et de générer une page avec ce fond. Par contre, cela impose une certaine structure dans les fichiers, car Jinja doit pouvoir retrouver les fichiers appelés par d’autres.
C’est pour cette raison qu’il est nécessaire de créer un répertoire (ex : tmpl) pour stocker les patrons. Ces derniers seront des fichiers avec le suffixe .jinja, mais c’est juste pour bien les différencier, il n’y a pas d’obligation de ce côté.
Maintenant, voici comment fonctionne le principe de base de Jinja :
Un patron pour servir de base à toutes les pages ; il doit définir la structure de chaque page par la définition de bloc. Son nom : base.jinja.
Un patron...
Un autre moteur de patron : Pug/Jade
Jinja est un des moteurs de templates fortement liés à Python. Et pourtant, il y a du côté de node.js et du langage JavaScript un moteur de template très appréciable et qui devrait plaire à beaucoup de pythonistes.
Le nommer est un peu compliqué, car son nom de départ est ’Jade’, mais comme il s’agit d’un nom déposé, il a dû être renommé en ’Pug’. Bientôt, tout ceci devrait se simplifier. Mais sur le net, on trouve encore parfois de la doc avec un nom et parfois avec l’autre nom.
Pourquoi parle-t-on de ce moteur de template ?
Il a adopté l’indentation comme syntaxe pour écrire du HTML, ce qui nous réconcilie avec le HTML.
Un petit exemple pour comprendre :
// ==================
//- Hello . jade
// ==================
doctype html(lang="fr")
html
head
include /include/head.jade
title HELLO : PUG/JADE
body
.container
h3(class="text-muted") HELLO PUG/JADE : A Propos
include /include/nav.jade
.jumbotron
h1(class="display-3") A propos de ce site
p(class="lead text-justify")
| Quelques explications sur ce site : <br/>
| <br/>
| Utilisation de <br/>
| - Jade / pug <br/>
| - Bootstrap <br/>
include /include/footer.jade
include /include/scripts.jade
Et tout de suite, le HTML devient lisible et, en plus, le résultat est joli avec l’aide de Bootstrap. De plus, cela fonctionne sur beaucoup de types...
Résumé
Encore un exemple où Python se révèle être un outil précieux.
Reportlab est une librairie pour générer du PDF.
Jinja est un moteur de templates écrit en Python, bien pratique.
Pug/Jade n’est pas du Python, mais vu que cela utilise l’indentation comme syntaxe...
Make reste encore un outil incontournable malgré son ancienneté.