Blog ENI : Toute la veille numérique !
🐠 -25€ dès 75€ 
+ 7 jours d'accès à la Bibliothèque Numérique ENI. Cliquez ici
Accès illimité 24h/24 à tous nos livres & vidéos ! 
Découvrez la Bibliothèque Numérique ENI. Cliquez ici
  1. Livres et vidéos
  2. Python 3
  3. Génération de contenu
Extrait - Python 3 Traitement de données et techniques de programmation (2e édition)
Extraits du livre
Python 3 Traitement de données et techniques de programmation (2e édition) Revenir à la page d'achat du livre

Génération de contenu

PDF

1. Présentation

a. Format PDF

PDF est le sigle de Portable Document Format qui est un format de document utilisant un langage de description de page qui est PDL (sigle de Page Document Language) et un protocole d’impression non dépendant d’un constructeur qui est une évolution de Postscript. Il est devenu progressivement le standard pour l’impression des documents et est devenu une norme ISO.

Aujourd’hui, de très nombreux formats de données (textes, dessins, images…) proposent des fonctionnalités d’export vers PDF.

b. Avantages

Ses qualités principales sont :

  • la concordance entre l’affichage à l’écran et ce qui sera réellement imprimé ;

  • son indépendance par rapport au système d’exploitation ;

  • son indépendance par rapport au matériel ;

  • la présence de logiciels ou bibliothèques libres pour ce format ;

  • la très grande diffusion de lecteurs de documents PDF, dont certains sont libres.

c. Inconvénients

Les inconvénients sont de plusieurs ordres :

  • Les droits liés à chaque document dépendent à la fois de ceux liés au format, mais également à ceux liés à tout ce qui est contenu dans le document, à savoir les droits d’auteurs sur les textes, les images embarquées, mais également les polices embarquées.

  • L’évolution du format est majoritairement liée à la politique d’un seul éditeur.

d. Présentation de la bibliothèque libre

ReportLab est une bibliothèque externe écrite en Python qui offre des outils simples et performants pour générer des documents PDF. Cette bibliothèque est maintenue par un éditeur qui propose deux branches, dont une à destination de la communauté qui est celle que nous allons utiliser.

Elle est portée sous Python 3, plus précisément à partir de Python 3.3, et voici le dépôt de code : https://github.com/nakagami/reportlab

2. Bas niveau

a. Bibliothèque de données

La première chose pour créer un document est d’avoir des données préfabriquées. En effet, il est agréable d’avoir des formats tout prêts...

Générer un document PDF depuis une page HTML

1. Présentation

Depuis quelques années, une technique privilégiée pour générer des documents PDF stylisés consiste à générer une page PHML au bon format, puis à utiliser un outil pour convertir cette page HTML en fichier PDF.

Il existe plusieurs alternatives pour réaliser cette opération, nous allons présenter Weasyprint.

2. Installation

Pour installer Weasyprint, il existe plusieurs prérequis dont la plupart sont d’autres bibliothèques Python et Pango.

Pour une débian, il faudra faire ceci :

$ apt install python3-pip python3-cffi python3-brotli libpango-1.0-0 
libpangoft2-1.0-0 
$ pip install weasyprint 

Pour vérifier que l’installation s’est bien passée :

$ weasyprint -info 

Pour plus d’informations, en particulier pour installer sur d’autres plateformes : https://doc.courtbouillon.org/weasyprint/stable/index.html

3. Utilisation

Cet outil peut être utilisé directement depuis la console :

$ weasyprint https://mon-site.fr/ma-page?data=test /path/to/file.pdf 

Ou depuis une console Python ou un code Python :

>>> from weasyprint import HTML 
>>> HTML("https://mon-site.fr/ma-page?data=test").write_pdf("test 
/path/to/file.pdf") 

Il est aussi possible de charger le fichier...

OpenDocument

1. Présentation

Soyons clairs dès le départ. OpenDocument est un format de document, partagé par tous les éditeurs de logiciels de bureautique dignes de ce nom. Ce format a été élaboré minutieusement, négocié par les éditeurs qui ont été partie prenante de ce processus. OpenDocument est donc un format qui est censé être partagé par tous les logiciels de bureautique. On ne parle donc pas dans cette section de LibreOffice (la suite bureautique de référence), mais bien d’un format de document universel.

Et à ce niveau-là, le format est assez simple à comprendre. Il s’agit, concrètement, d’un simple fichier compressé au format ZIP et contenant de gros fichiers XML parmi lesquels on trouve content.xml, qui comprend en son sein tout le contenu du document et le format utilisé, incluant le style. Un autre fichier, style.xml, détaille chacun des styles personnalisés du document.

On peut donc accéder au contenu d’un fichier OpenDocument simplement en le dézippant et en utilisant XPath pour le traverser.

Nous allons présenter ici des méthodes de haut niveau pour générer des documents de type OpenDocument et, pour ce faire, la référence est ce site : https://opendocumentformat.org/developers/

2. ezodf2...

Travailler avec des images

1. Représentation informatique d’une image

Lorsque l’on pense image, on pense photographie et donc image bitmap qui, comme son nom l’indique, est une organisation d’octets. L’image a une taille fixe et une résolution donnée qui fait que l’on peut considérer une image comme trois tableaux statiques superposés d’octets, un pour le rouge, un autre pour le vert et un dernier pour le bleu, chaque case du tableau ou point de l’image portant donc comme valeur un 3-uplet d’octets.

Ceci correspond à ce que l’on appelle une image matricielle et est le type d’image le plus commun. C’est ce type d’image que prend un appareil photo, par exemple. En paraphrasant le paragraphe ci-dessus, on peut voir une image comme trois matrices superposées, chaque valeur étant un octet, ou comme une seule matrice de 3-uplets d’octets.

Si d’un premier abord la différence ne saute pas forcément aux yeux, ces façons de voir sont importantes car elles déterminent le contenu des algorithmes.

Ces images sont parfaitement adaptées à une utilisation informatique et à une restitution sur un écran d’ordinateur, puisque les trois composantes, rouge, verte et bleue sont celles de la synthèse additive. C’est-à-dire que l’addition des couleurs donne la couleur blanche et l’absence combinée des trois mêmes couleurs correspond au noir.

Au contraire, la reprographie nécessite d’utiliser la synthèse soustractive, celle qui est à l’œuvre lors des mélanges de pigments (ou de peinture) et qui est un peu plus connue du grand public. Le mélange de magenta et de cyan donne du violet, magenta et jaune de l’orange, jaune et cyan du vert et le mélange des trois donne du marron. Dans la synthèse soustractive, il est très difficile d’obtenir du noir et les niveaux de gris, il faut donc des pigments supplémentaires. C’est la raison pour laquelle la représentation CMJN (cyan, magenta, jaune, noir) a été conçue.

La représentation d’une telle image destinée à la reprographie nécessite donc non plus un 3-uplet, mais un 4-uplet pour chaque pixel ou quatre matrices au lieu de trois...

Fichiers de configuration

Nous allons traiter ici des formats textuels de fichiers utilisés pour configurer des applications, tels que le format YAML ou TOML. Le premier est par exemple utilisé avec docker, par exemple les fichiers docker-compose.yaml. Le second est utilisé avec poetry, par exemple, avec le fichier pyproject.toml.

1. Format YAML

Le format YAML est fait pour être assez simple à lire pour l’œil humain. Il utilise l’indentation et les deux-points pour marquer les blocs de données. Voici un exemple de fichier :

database: "postgres://user:pwd@localhost:5432/db_name" 
max_retries: 3 
data: 
  - key_1: 34 
  - key_2: 24 

Les deux premières lignes sont des données simples, la troisième ligne est une donnée structurée et les deux dernières lignes font partie de cette structure. Celles-ci seront interprétées comme des dictionnaires. Il est aussi possible de décrire une liste :

list: [1, 2, 3] 

Ou de simples dictionnaires :

dict: 
  key: "clé" 
  value: 42 

Et il est possible de combiner ces éléments entre eux.

Voici comment il est possible de lire un tel fichier :

import yaml 
>>> with open("test.yaml") as f: 
...     content = yaml.safe_load(f) 
>>> print(content) ...