22/01/2025

Scripting

Python : comment générer des présentations PowerPoint ?

I. Présentation

Dans ce tutoriel, je vous montre comment générer des présentations PowerPoint (format PPTX) via du code Python. Nous verrons les points essentiels à comprendre pour facilement utiliser la bibliothèque python-pptx, qui est faite pour !

La génération de fichiers PowerPoint avec du code Python peut être utile dans les contextes où des données structurées et facilement interprétables par du code doivent être présentées visuellement. Il peut s’agir de créer des supports visuels, des rapports ou de synthétiser des données à partir de bases de données, API, notes Markdown ou fichiers CSV, le tout en gagnant du temps !

Nous aborderons ici les bases de la bibliothèque python-pptx, la création de slides à partir de modèles existants, et l'insertion d'éléments tels que du texte ou des images.

II. PowerPoint, layouts et placeholders

A. Maitriser les modèles de slide Powerpoint

Commençons par ouvrir un document vide avec Powerpoint, cela pour mieux comprendre ce que nous allons faire via la bibliothèque python-pptx. 

Les présentations et fichier PowerPoint peuvent contenir des modèles de présentation, c'est-à-dire des diapositives pré-enregistrées pouvant être réutilisées rapidement. Au sein d’un fichier existant, vous pourrez retrouver ces mises en page (aussi appelées layout) en vous rendant dans "ACCUEIL" puis "Nouvelle Diapositive" :

Accès aux modèles de diapositive d’un document PowerPoint.
Accès aux modèles de diapositive d’un document PowerPoint.

Vous aurez alors plusieurs modèles de diapositives proposés (vous pouvez aussi créer les vôtres). Ces modèles seront présents quel que soit le thème utilisé ! Ce qui permet une grande personnalisation, même avec une présentation générée automatiquement.

Cliquer sur l’un de ces layout insère dans votre présentation une nouvelle slide qui aura la disposition souhaitée, et c’est exactement ce que nous allons faire avec notre code Python ! Par exemple, ici, j'ai sélectionné le layout nommé “Titre et contenu” : 

Modèle de diapositive insérée dans une présentation PowerPoint.
Modèle de diapositive insérée dans une présentation PowerPoint.

Vous pouvez voir dans la diapositive qui vient d’être créée deux rectangles en pointillé contenant "Cliquez pour ajouter [...]". C’est ce que l’on nomme des placeholders (espaces réservés). Il s’agit de zones définies, pouvant être colorées ou mises en forme, qui contiendront vos différents éléments (image, graphique, texte, ou autre). Encore une fois, vous pouvez créer les vôtres facilement. Il faut pour cela se rendre dans "Affichage" puis "Masque de Diapositive".

Retenez bien ces termes et cette manipulation concernant Powerpoint : les layout sont des dispositions pré-conçues réutilisables simplement, les placeholders sont des espaces définis dans une diapositive.

B. Afficher les identifiants grâce à Python

Dans un modèle PowerPoint, chaque layout dispose d’un identifiant numérique (1, 2, 3, etc.), et chaque placeholder à l’intérieur également. C’est grâce à ces identifiants que nous pourrons indiquer à notre code Python à quelle position insérer quel élément (texte, image, tableau, etc.). 

Je vous propose dans un premier temps un petit script qui contient une fonction permettant de lire et d'afficher les modèles de slides, les placeholders qu’elles contiennent et leurs identifiants numériques pour le fichier PPTX ciblé.

Si vous n’avez pas encore installé python-pptx, c’est le moment de le faire : 

sudo pip3 install python-pptx

Le script Python permettant l’affichage des ID de layouts et placeholders est disponible en téléchargement sur notre espace GitHub :

Voici comment l’utiliser, il suffit de lui indiquer le fichier PPTX à "analyser" à la suite du paramètre "-f" :

Exemple d’affichage des ID de layout et placeholder d’un fichier PPTX.
Exemple d’affichage des ID de layout et placeholder d’un fichier PPTX.

Dans cet extrait de la sortie de notre petit script, nous voyons 6 layouts (numérotés de 0 à 5), chacun composé de 5 à 8 placeholders. Il est important de se représenter mentalement à quoi correspondent ces identifiants numériques de layout et de placeholder pour ne pas se perdre dans l’utilisation de python-pptx, c’est maintenant chose faite ! 

Lorsque vous créerez votre propre layout vous vous rendrez compte que les identifiants peuvent ne pas tous se suivre, tout comme les placeholders, gardez donc bien ce petit script sous la main pour vous y retrouver facilement. Parfois, vous devrez un peu “tâtonner” pour comprendre exactement quel placeholder correspond à quel emplacement à l’intérieur d’une diapositive.

L’idée va par la suite simplement être d’indiquer à notre code Python "Crée une slide à partir du layout 3, puis insère ce texte dans le placeholder 2".

III. Utiliser python-pptx pour générer un PowerPoint

A. Créer une slide à partir d’un modèle

Nous allons à présent voir comment créer une nouvelle présentation à partir de notre fichier "modèle". 

Voici une base de script commenté que vous pourrez réutiliser pour ces premières opérations :

Contenu du script “generate-pptx-layouts.py”.
Contenu du script “generate-pptx-layouts.py”.

La ligne n°34 permet de créer un objet de type "Presentation" (vient de python-pptx) à partir du modèle renseigné en paramètre "-f" (le fichier PPTX contenant nos layouts et placeholders)

J’ai ensuite créé une fonction "add_slide" qui prend en paramètre notre objet présentation, et l’identifiant de layout à ajouter dans cette présentation. Dans cet exemple (lignes 37 à 38), j’insère une slide depuis le layout 0 et deux slides avec le layout 1. La ligne 42 permet de sauvegarder la présentation générée dans un nouveau fichier PPTX nommé "Nouvelle_presentation.pptx", voici son contenu : 

lides ajoutées à notre présentation à partir des layouts indiqués.
Slides ajoutées à notre présentation à partir des layouts indiqués.

En résultat, nous obtenons bien une slide "Titre" (ID 0) et deux slides “Titres et contenu” (ID 1). Il est important de retenir que les slides sont créées de manière séquentielle, les unes à la suite des autres. Il est possible avec python-pptx de manipuler l’ordre des slides, mais faisons simple pour ce tutoriel d’introduction.

Ce script est disponible en téléchargement sur notre espace GitHub :

Tout cela est plutôt encourageant, mais nos slides sont vides pour le moment, ce qui ne nous sert pas à grand chose. C’est ici qu’interviennent les placeholders, les emplacements réservés propres à chaque layouts.

B. Principe d’utilisation des placeholders

Nous avons vu précédemment ce qu’étaient les placeholders et comment repérer leurs identifiants grâce à python-pptx. Nous allons à présent voir comment remplir ces emplacements réservés suite à l’insertion d’une nouvelle slide à partir d’un layout

Nous allons pour cela utiliser un dictionnaire Python qui aura la structure suivante :

placeholders = {
	0 : "Mon Titre",
	1 : "Mon sous-titre"
}

Le principe est plutôt intuitif, python-pptx attend en paramètre de la création d’une nouvelle slide à partir d’un layout un dictionnaire qui contient en clé (0, 1, 2, etc.), l’ID du placeholder ciblé, et en valeur, le contenu à y insérer. Si l’on utilise ce dictionnaire pour le layoutTitre” ayant l’ID 0, voici ce que sera le résultat :

Contenu ajouté à partir du dictionnaire de placeholders.
Contenu ajouté à partir du dictionnaire de placeholders.

La valeur “Mon Titre” a bien été insérée dans le placeholder 0 et “Mon sous-titre” dans le placeholder 1.

Voici les modifications faites dans mon script pour prendre en compte les placeholders :

Contenu du script Python “generate-pptx-placeholders.py”.
Contenu du script Python “generate-pptx-placeholders.py”.

On peut voir en ligne 45-47, 51-54 et 57-69 leur définition, avant chaque ajout de slide pour que la slide créée le soit avec le contenu souhaité. Les lignes 26 à 29 permettent de parcourir toutes les clés du dictionnaire reçu et d’ajouter une à une les valeurs dans les bons placeholders.

Ce script est disponible en téléchargement sur notre espace GitHub :

C’est tout ! Il n’y a rien de plus à comprendre concernant python-pptx, la création de slide ainsi que leur remplissage automatique. Dans un contexte réel, vos dictionnaires “placeholders” seront bien sûr remplis dynamiquement à partir, par exemple, du contenu d’une API, d’une base de données, d’un fichier CSV ou Markdown. Mais, le principe restera exactement le même.

Pour ce qui est de la mise en forme, tout cela reste utilisable, peu importe le thème PowerPoint utilisé, qui peut être choisi avant (dans le modèle PPTX utilisé) ou après la création de notre nouvelle présentation.

C. Insérer une image dans une slide PowerPoint depuis Python

Nous allons à présent voir comment insérer une image dans un placeholder, cela peut rapidement devenir utile pour rendre nos présentations moins ennuyantes. Un pré-requis pour réaliser cette opération est d’avoir le chemin complet de notre image sur le système. Dans mon exemple, mon image sera située dans “/tmp/image.png”.

Dans une présentation PowerPoint par défaut (nouveau fichier), vous devriez avoir un layout nommé “Contenu avec légende” ayant l’identifiant n°8, contenant un placeholder fait pour recevoir des images ayant l’identifiant n°1.

La directive Python pour insérer une image au lieu d’un texte dans un placeholder est légèrement différente : 

placeholder.insert_picture(value)

La valeur passée à la méthode “insert_picture() doit ici être le chemin vers notre fichier.

Pour rendre notre code assez souple pour prendre en compte ces deux cas de figures (texte brut ou chemin d’une image), on peut faire une vérification sur le contenu. Puis, essayer de déterminer s’il s’agit d’un texte ou d’un chemin vers une image, par exemple  : 

# Remplir les placeholders si un dictionnaire a été fourni
if placeholders is not None:
  for key, value in placeholders.items():
    placeholder = slide.placeholders[key]  # Accès à une zone réservée par son index
    
    # Vérifier s'il s'agit d'un chemin vers une image
    if isinstance(value, str) and value.startswith("/") and value.endswith(".png"):
      # Insertion de l'image à partir de son chemin
      placeholder.insert_picture(value)
    
    # Sinon il s'agit d'un texte "brut"
    else :
      placeholder.text = value  # Assignation du texte au placeholder

L’appel qui est fait à notre fonction add_slide() contient bien sûr un dictionnaire “placeholder qui contient un chemin vers une image : 

placeholders = {
    	0: "Mon image",  
    	1: "/tmp/image.png",
    	2: "Logo IT-Connect"  
	}
	presentation = add_slide(presentation, 8, placeholders)

En résultat, nous aurons une nouvelle slide avec notre joli logo 🙂 : 

Contenu et image ajoutée à notre diapositive grâce à python-pptx.
Contenu et image ajoutée à notre diapositive grâce à python-pptx.

Le script Python contenant les modifications nécessaires pour insérer des images est disponible en téléchargement sur notre espace GitHub :

Dans des contextes réalistes, il est tout à fait possible de générer vos propres images et graphiques, par exemple, à partir de la bibliothèque matplotlib et en se basant sur vos propres données.

IV. Conclusion

Nous avons vu dans ce tutoriel comment créer facilement et rapidement une présentation PowerPoint à partir de quelques lignes Python à l’aide de la bibliothèque python-pptx

La chose à retenir est surtout l’utilisation des identifiants de layout et de placeholders. Bien qu’il soit possible d’aller beaucoup plus loin avec cette bibliothèque, en créant, par exemple, des tableaux ou des formes graphiques, en gérant la police et la couleur de fond de chaque élément de notre présentation PowerPoint, tout cela reposera sur la gestion des layout et placeholder.

Si vous souhaitez d’autres tutoriels sur python-pptx ou plus largement sur Python, n’hésitez pas à nous en faire part dans les commentaires ou sur notre serveur Discord.

Pour ceux qui ne peuvent attendre un futur tutoriel, je vous oriente vers la documentation python-pptx, qui est plutôt bien construite pour les habitués du Python : 

author avatar
Mickael Dorigny Co-founder
Co-fondateur d'IT-Connect.fr. Auditeur/Pentester chez Orange Cyberdéfense.
Partagez cet article Partager sur Twitter Partager sur Facebook Partager sur Linkedin Envoyer par mail

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.