Création, édition et analyse de PPTX
Un fichier .pptx est une archive ZIP de fichiers XML. Choisissez votre approche en fonction de la tâche :
| Tâche | Approche |
|---|---|
| Créer un nouveau diaporama | Écrire un script pptxgenjs — voir les pièges ci-dessous |
| Éditer un diaporama existant, ou construire à partir d'un modèle | décompresser → éditer ppt/slides/slideN.xml → recompresser |
| Lire le contenu | markitdown deck.pptx (un bloc par diapositive sous les marqueurs <!-- Slide number: N -->) ; grille visuelle : python scripts/thumbnail.py deck.pptx |
Scripts
Les chemins sont relatifs au répertoire de cette compétence. Tout le reste est en Python pur, node ou shell.
| Script | Ce qu'il fait |
|---|---|
scripts/thumbnail.py deck.pptx [prefix] | Grille étiquetée de chaque diapositive, pour choisir les mises en page du modèle. .pptx uniquement. Passez prefix — par défaut thumbnails, ce qui écrase les grilles de tout autre diaporama effectué dans le même répertoire |
scripts/add_slide.py unpacked/ slide2.xml [--after slideN.xml] | Dupliquer une diapositive (ou un slideLayoutN.xml) avec toute la comptabilité du package. Accepte aussi un .pptx directement avec -o out.pptx |
scripts/clean.py unpacked/ | Supprimer les diapositives, médias et relations qui ne sont plus référencés. À exécuter après que <p:sldIdLst> soit final |
scripts/office/validate.py deck.pptx [--original src.pptx] | Vérifications de schéma, relations, types de contenu, graphiques et diapositives ; chaque échec nomme son correctif. Passez --original pour tout diaporama dérivé d'un modèle : il établit une référence des vérifications de schéma par rapport au modèle, de sorte que les propres erreurs XSD du modèle ne soient pas considérées comme les vôtres |
scripts/office/soffice.py --headless --convert-to pdf deck.pptx | Wrapper LibreOffice — soffice nu se bloque dans ce bac à sable |
Création avec pptxgenjs — pièges
pptxgenjs est préinstallé — n'exécutez pas npm install d'abord ; écrivez le script et require('pptxgenjs') directement. Seulement si ce require échoue : npm install pptxgenjs. Le modèle connaît l'API ; voici les pièges :
- Définissez
pres.layoutavant d'ajouter des diapositives. Le canevas par défaut estLAYOUT_16x9= 10" × 5.625", pas 13,3" de large. Les coordonnées au-delà du bord sont écrites, non limitées — la forme n'est simplement pas sur la diapositive. (LAYOUT_WIDEfait 13,3" × 7,5".) - Couleurs hexadécimales : jamais
#, jamais 8 chiffres.color: "FF0000"."#FF0000"ou l'alpha intégré à l'hex ("00000020") corrompt le fichier. Pour la translucidité :transparency: 0-100sur les remplissages et les images,opacity: 0.0-1.0sur les ombres — chacun est ignoré silencieusement sur l'autre. - pptxgenjs modifie les objets d'options sur place (convertit les valeurs en EMU lors de la première utilisation). Ne partagez jamais un seul objet
shadow/options entre deux appelsadd*— construisez un nouvel objet à chaque fois. offsetd'ombre doit être ≥ 0 — un offset négatif corrompt le fichier. Pour projeter une ombre vers le haut, utilisezangle: 270avec un offset positif.letterSpacingest ignoré silencieusement — la vraie option estcharSpacing.- Listes :
bullet: truesur chaque élément, jamais un•littéral (rend des doubles puces). DéfinissezbreakLine: truesur chaque élément du tableau sauf le dernier. Espacez les paragraphes à puces avecparaSpaceAfter, paslineSpacing(énormes écarts). - Un
new pptxgen()par fichier de sortie — ne réutilisez jamais une instance. rectRadiusfonctionne uniquement surROUNDED_RECTANGLE, pas surRECTANGLE.- Les remplissages par dégradé ne sont pas pris en charge — utilisez plutôt une image de dégradé comme arrière-plan.
- Les zones de texte ont un remplissage interne intégré — définissez
margin: 0chaque fois que le texte doit s'aligner avec une forme, une ligne ou une icône au même x. - Les notes de l'orateur vont dans
slide.addNotes("...")(texte brut, une fois par diapositive), jamais dans une zone de texte sur la diapositive. - Conservez les graphiques natifs. Utilisez
addChart()pour tout ce que PowerPoint peut représenter (passez un tableau de{type, data, options}pour les combinaisons). Pour les fonctionnalités natives de PowerPoint que la bibliothèque n'expose pas (courbes de tendance, barres d'erreur), calculez vous-même les séries supplémentaires ou post-traitez le OOXML généré — ne recourez pas à une image rendue. Seuls les types de graphiques dont PowerPoint n'a pas de forme native (Sankey, réseau, corde) sont intégrés sous forme d'images. - Les graphiques par défaut sont rendus nus — pas de titre, pas d'étiquettes de données, palette datée. Définissez
showTitle+title,showValue: true+dataLabelPosition,chartColors: [...]de votre palette, et rendez le cadre discret (catAxisLabelColor/valAxisLabelColor,valGridLine: { color, size },catGridLine: { style: "none" },showLegend: falsepour une seule série). - Sur un graphique à barres ou à colonnes empilées,
dataLabelPositiondoit êtrectr,inEndouinBase.outEndcorrompt le fichier. - Une série combinée utilisant
secondaryValAxis/secondaryCatAxisa besoin à la fois devalAxesetcatAxesdans les options du graphique, deux entrées chacun. Sans eux, pptxgenjs écrit des ids d'axes qu'il ne déclare jamais, et PowerPoint supprime ce graphique et signale le fichier comme corrompu. Fournir uniquementvalAxesne suffit pas. - Après
writeFile(), exécutezpython scripts/office/validate.py deck.pptx. Il signale les deux défauts de graphique ci-dessus et les défauts de slide-XML que PowerPoint refuse, et nomme le correctif pour chacun. Corrigez-les dans votre générateur, pas en éditant manuellement le XML emballé. - Ne réordonnez jamais les enfants de
<p:presentation>. pptxgenjs écrit<p:notesMasterIdLst>juste après<p:sldIdLst>et pointe les deux masques vers une seule partie de thème. PowerPoint lit cela heureusement — déplacez l'élément et le même diaporama devient impossible à ouvrir. - Icônes : rendez
react-iconsen SVG (ReactDOMServer.renderToStaticMarkup), rasterisez avecsharpà ≥256px, et insérez viaaddImage({ data: "image/png;base64," + buf.toString("base64") })— le préfixeimage/png;base64,est requis (react-icons,react,react-dometsharpsont préinstallés —npm install react-icons react react-dom sharpseulement si un require échoue).
Édition de diaporamas et modèles existants
Choisissez d'abord les mises en page : python scripts/thumbnail.py template.pptx template-thumbs écrit une grille étiquetée de chaque diapositive et affiche le(s) fichier(s) créé(s) — template-thumbs.jpg, divisé en template-thumbs-N.jpg au-delà de 12 diapositives. Passez toujours ce deuxième argument, nommé d'après le diaporama. Par défaut, il est thumbnails, donc deux diaporamas dont les vignettes sont créées dans un même répertoire écrasent silencieusement les grilles de l'autre — celles du premier diaporama sont simplement perdues (analyse du modèle uniquement — le contrôle visuel qualité a besoin des rendus en pleine résolution de Conversion en images ; il n'accepte que le .pptx, donc copiez d'abord un .potx vers un nom .pptx). Utilisez-le avec markitdown pour mapper chaque section de contenu sur une diapositive du modèle, et variez les mises en page — ne mettez pas chaque section sur la même diapositive de titre et de puces.
python3 -c "import sys,zipfile; zipfile.ZipFile(sys.argv[1]).extractall('unpacked')" deck.pptx
python scripts/add_slide.py unpacked/ slide2.xml --after slide2.xml # dupliquer une diapositive (ou slideLayoutN.xml) ; affiche le chemin de la nouvelle diapositive
# réorganiser / supprimer des diapositives = modifier <p:sldIdLst> dans ppt/presentation.xml
python scripts/clean.py unpacked/ # après les suppressions : supprime les diapositives, médias, relations orphelins
# modifier le contenu de la diapositive dans ppt/slides/slideN.xml
(cd unpacked && rm -f ../out.pptx && zip -Xr ../out.pptx .) # compresser DEPUIS L'INTÉRIEUR du répertoire ; rm d'abord ou les parties supprimées survivent
python scripts/office/validate.py out.pptx --original deck.pptx
- Effectuez tout le travail structurel — ajouter, supprimer, réorganiser — avant de modifier le contenu d'une diapositive.
add_slide.pycopie un fichier de diapositive textuellement, donc dupliquer après avoir édité clone le contenu édité ; etclean.pysupprime toute diapositive manquante dans<p:sldIdLst>, y compris celle que vous venez d'écrire. - Ne copiez jamais un fichier de diapositive manuellement —
add_slide.pyeffectue chaque enregistrement dont une nouvelle diapositive a besoin et signale ce qu'il a fait (Created ppt/slides/slide17.xml from slide2.xml). Il fonctionne aussi directement sur un fichier :add_slide.py deck.pptx slide2.xml -o out.pptx— passez-o, ou il réécrit le diaporama d'entrée sur place. Une diapositive dupliquée référence toujours les parties de graphique/SmartArt/objet incorporé de sa source plutôt que de les cloner, donc éditer le graphique d'une diapositive modifie celui de l'autre. - Si vous utilisez
python-pptx, trois choses qu'il ne fera pas : dupliquer une diapositive (son seul point d'entrée estadd_slide(layout)), préserver la mise en forme viatext_frame.text = "..."(cela réduit le paragraphe à une seule exécution sans style — utilisez plutôtrun.text), ou lire le SVG/EMF utilisé par la plupart des images de modèle (add_picturelèveUnidentifiedImageError). - Les fichiers
.ppthérités doivent d'abord être convertis :python scripts/office/soffice.py --headless --convert-to pptx file.ppt. Les modèles.potxse décompressent et se compressent de manière identique — conservez l'extension.potxsur la sortie. - Pour réutiliser une icône ou une image de modèle, dupliquez une diapositive ou une mise en page qui la contient déjà.
Lors du remplissage d'un modèle :
- Si vous scriptez une transformation XML, analysez avec
defusedxml.minidom— le passage aller-retour de OOXML viaxml.etree.ElementTreeréécrit les préfixes de namespace et corrompt le diaporama. - Les emplacements du modèle ≠ les éléments source. Si le modèle montre 4 membres d'équipe et que vous en avez 3, supprimez tout le groupe du 4ème membre (image + zones de texte), pas seulement son texte — puis vérifiez les visuels orphelins dans le contrôle qualité.
- Un
<a:p>par élément de liste — ne concaténez jamais les éléments en un seul paragraphe. Copiez le frère<a:pPr>pour préserver l'espacement, et mettezb="1"sur le<a:rPr>des titres, en-têtes de section et étiquettes en ligne (Statut :,Propriétaire :). - Laissez les puces hériter de la mise en page ; n'ajoutez
<a:buChar>,<a:buAutoNum>(numérotées) ou<a:buNone>que pour remplacer — jamais un•littéral dans le texte. - Le texte avec des espaces de début ou de fin a besoin de
xml:space="preserve"sur son<a:t>.
Idées de design
Ne créez pas de diapositives ennuyeuses. Les simples puces sur un fond blanc n'impressionneront personne. Considérez les idées de cette liste pour chaque diapositive.
Avant de commencer
- Choisissez une palette de couleurs audacieuse et informée par le contenu : La palette doit sembler conçue POUR ce sujet. Si l'échange de vos couleurs dans une présentation complètement différente « fonctionnait » encore, vous n'avez pas fait de choix suffisamment spécifiques.
- Dominance sur l'égalité : Une couleur doit dominer (60-70 % de poids visuel), avec 1 à 2 tons de soutien et un accent vif. Ne donnez jamais un poids égal à toutes les couleurs.
- Contraste sombre/clair : Arrière-plans sombres pour les diapositives de titre et de conclusion, clairs pour le contenu (structure « sandwich »). Ou optez pour le sombre partout pour une sensation premium.
- Engagez-vous sur un motif visuel : Choisissez UN élément distinctif et répétez-le — cadres d'image arrondis, icônes dans des cercles colorés. Portez-le sur chaque diapositive. N'utilisez pas de barre de couleur ou de bande d'accent comme motif (voir la liste des éléments à éviter).
Palettes de couleurs
Choisissez des couleurs qui correspondent à votre sujet — ne vous contentez pas du bleu générique par défaut. Utilisez ces palettes comme inspiration :
| Thème | Primaire | Secondaire | Accent |
|---|---|---|---|
| Midnight Executive | 1E2761 (bleu marine) | CADCFC (bleu glacier) | FFFFFF (blanc) |
| Forest & Moss | 2C5F2D (forêt) | 97BC62 (mousse) | F5F5F5 (crème) |
| Coral Energy | F96167 (corail) | F9E795 (or) | 2F3C7E (bleu marine) |
| Warm Terracotta | B85042 (terre cuite) | E7E8D1 (sable) | A7BEAE (sauge) |
| Ocean Gradient | 065A82 (bleu profond) | 1C7293 (sarcelle) | 21295C (minuit) |
| Charcoal Minimal | 36454F (charbon) | F2F2F2 (blanc cassé) | 212121 (noir) |
| Teal Trust | 028090 (sarcelle) | 00A896 (écume de mer) | 02C39A (menthe) |
| Berry & Cream | 6D2E46 (baie) | A26769 (rose poussiéreux) | ECE2D0 (crème) |
| Sage Calm | 84B59F (sauge) | 69A297 (eucalyptus) | 50808E (ardoise) |
| Cherry Bold | 990011 (cerise) | FCF6F5 (blanc cassé) | 2F3C7E (bleu marine) |
Pour chaque diapositive
Chaque diapositive a besoin d'un élément visuel — image, graphique, icône ou forme. Les diapositives uniquement textuelles sont oubliables.
Options de mise en page :
- Deux colonnes (texte à gauche, illustration à droite)
- Lignes icône + texte (icône dans un cercle coloré, en-tête en gras, description en dessous)
- Grille 2x2 ou 2x3 (image d'un côté, grille de blocs de contenu de l'autre)
- Image demi-débordante (côté gauche ou droit entier) avec superposition de contenu
Affichage des données :
- Grands chiffres clés (grands nombres 60-72pt avec petites étiquettes en dessous)
- Colonnes de comparaison (avant/après, avantages/inconvénients, options côte à côte)
- Chronologie ou flux de processus (étapes numérotées, flèches)
Polissage visuel :
- Icônes dans de petits cercles colorés à côté des en-têtes de section
- Texte d'accent en italique pour les statistiques clés ou les slogans
Typographie
Les noms de polices que vous écrivez dans le .pptx sont rendus par le PowerPoint de l'utilisateur, pas par cet environnement. Votre rendu de contrôle qualité visuel passe par LibreOffice, qui substitue les polices qu'il n'a pas — et pour certaines polices, le substitut a des largeurs différentes, donc votre aperçu de contrôle qualité peut montrer un débordement de texte (ou un ajustement) que le vrai diaporama n'aura pas. Pour maintenir la fiabilité de votre contrôle qualité :
- Polices sûres (rendent à largeur réelle dans le contrôle qualité et sont fournies avec Office) : Arial, Calibri, Cambria, Times New Roman, Courier New, Bookman Old Style, Century Schoolbook. Utilisez-les pour le corps du texte et tout ce où l'ajustement compte.
- En-têtes avec personnalité sans risque de contrôle qualité : associez un en-tête serif de la liste sûre (Cambria, Bookman Old Style, Century Schoolbook) avec un corps sans-serif de la liste sûre (Calibri ou Arial). Vous obtenez un contraste visuel sans renoncer à des vérifications fiables de débordement.
- Si l'utilisateur demande une police en dehors de la liste sûre (par exemple Georgia ou Trebuchet MS) : utilisez-la là où l'utilisateur l'a demandée, mais dimensionnez ces conteneurs avec une marge supplémentaire (~10 %) et ne faites pas confiance à l'ajustement du texte du contrôle qualité sur ces éléments — l'aperçu de cette police est approximatif. Si l'utilisateur n'a pas spécifié, préférez les polices de la liste sûre pour le corps du texte.
- Polices non fiables pour le contrôle qualité (le substitut a des largeurs différentes — les vérifications de débordement peuvent être erronées) : Georgia, Trebuchet MS, Impact, Arial Black, Garamond, Consolas, Palatino Linotype. La substitution de Calibri Light varie selon l'environnement ; traitez-la comme non fiable pour le contrôle qualité. Acceptable pour les titres/accent avec marge ; ne faites pas confiance à l'ajustement du texte du contrôle qualité sur celles-ci.
- Ne choisissez jamais Aptos par défaut — le défaut d'Office après 2023 n'a pas de substitut compatible métrique ici et est absent des installations Office plus anciennes, donc il n'est fiable sur aucun des deux fronts.
| Élément | Taille |
|---|---|
| Titre de diapositive | 36-44pt gras |
| En-tête de section | 20-24pt gras |
| Corps du texte | 14-16pt |
| Légendes | 10-12pt atténué |
…
[tronqué pour la traduction]