Création, édition et analyse de présentations PPTX
Un fichier .pptx est une archive ZIP de fichiers XML. Choisissez votre approche selon la tâche :
| Tâche | Approche |
|---|---|
| Créer un nouveau deck | Écrire un script pptxgenjs — voir les pièges ci-dessous |
| Modifier un deck existant, ou construire à partir d'un modèle | décompresser → éditer ppt/slides/slideN.xml → recompresser |
| Lire du 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. Le reste est en Python, node ou shell.
| Script | Ce qu'il fait |
|---|---|
scripts/thumbnail.py deck.pptx [prefix] | Grille étiquetée de chaque diapositive, pour choisir les dispositions du modèle. .pptx uniquement. Passez prefix — par défaut thumbnails, ce qui écrase les grilles de tout autre deck fait dans le même répertoire |
scripts/add_slide.py unpacked/ slide2.xml [--after slideN.xml] | Duplique 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/ | Supprime les diapositives, médias et rels qui ne sont plus référencés. Exécutez après avoir finalisé <p:sldIdLst> |
scripts/office/validate.py deck.pptx [--original src.pptx] | Vérifications de schéma, de relations, de types de contenu, de graphiques et de diapositives ; chaque échec nomme sa correction. Passez --original pour tout deck dérivé d'un modèle — il normalise les 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 — le soffice nu bloque dans ce sandbox |
Création avec pptxgenjs — pièges
pptxgenjs est préinstallé — n'exécutez pas npm install d'abord ; écrivez le script et utilisez require('pptxgenjs') directement. Si ce require échoue seulement : 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, pas limitées — la forme n'est tout simplement pas sur la diapositive. (LAYOUT_WIDEfait 13,3" × 7,5".) - Couleurs hex : jamais
#, jamais 8 chiffres.color: "FF0000"."#FF0000"et l'alpha intégré dans l'hex ("00000020") corrompent le fichier. Pour la translucidité :transparency: 0-100sur les remplissages et images,opacity: 0.0-1.0sur les ombres — chacun est ignoré silencieusement sur l'autre. - pptxgenjs mute les objets d'options en place (convertit les valeurs en EMU lors de la première utilisation). Ne partagez jamais un objet
shadow/options entre deux appelsadd*— construisez un nouvel objet à chaque fois. - Le
offsetd'une 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 (affiche des doubles puces). DéfinissezbreakLine: truesur chaque élément du tableau sauf le dernier. Espacez les paragraphes à puces avecparaSpaceAfter, paslineSpacing(gros écarts). - Un
new pptxgen()par fichier de sortie — ne réutilisez jamais une instance. rectRadiusfonctionne uniquement surROUNDED_RECTANGLE, pas surRECTANGLE.- Les remplissages dégradés ne sont pas pris en charge — utilisez une image dégradée comme arrière-plan à la place.
- Les zones de texte ont un padding 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. - Gardez les graphiques natifs. Utilisez
addChart()pour tout ce que PowerPoint peut mettre en graphique (passez un tableau de{type, data, options}pour les combinaisons). Pour les fonctionnalités natives de PowerPoint que la bibliothèque n'expose pas (lignes de tendance, barres d'erreur), calculez vous-même les séries supplémentaires ou post-traitez l'OOXML généré — ne retombez pas sur une image rendue. Seuls les types de graphiques dont PowerPoint n'a pas de forme native (Sankey, réseau, corde) sont placés en tant qu'images. - Les graphiques par défaut s'affichent nus — pas de titre, pas d'étiquettes de données, palette datée. Définissez
showTitle+title,showValue: true+dataLabelPosition,chartColors: [...]à partir de votre palette, et calmez le cadre (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/secondaryCatAxisnécessite à la foisvalAxesetcatAxesdans les options du graphique, deux entrées chacun. Sans cela, pptxgenjs écrit des ids d'axe qu'il ne déclare jamais, et PowerPoint rejette ce graphique et signale le fichier comme corrompu. Fournir seulementvalAxesne 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 diapositive-XML que PowerPoint refuse, et nomme la correction pour chacun. Corrigez-les dans votre générateur, pas en éditant à la main le XML compressé. - Ne réordonnez jamais les enfants de
<p:presentation>. pptxgenjs écrit<p:notesMasterIdLst>juste après<p:sldIdLst>et pointe les deux maîtres sur une seule partie de thème. PowerPoint lit cela joyeusement — déplacez l'élément et le même deck 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).
Modification de decks et de modèles existants
Choisissez d'abord les dispositions : python scripts/thumbnail.py template.pptx template-thumbs écrit une grille étiquetée de chaque diapositive et imprime 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 deck. Par défaut, il s'agit de thumbnails, donc deux decks dont les miniatures sont générées dans un même répertoire écrasent silencieusement les grilles de l'autre — les grilles du premier deck sont simplement supprimées (analyse du modèle uniquement — le contrôle qualité visuel nécessite les rendus en pleine résolution de Conversion en images ; il n'accepte que .pptx, donc copiez d'abord un .potx en un nom .pptx). Utilisez-le avec markitdown pour mapper chaque section de contenu sur une diapositive de modèle, et variez les dispositions — ne mettez pas chaque section sur la même diapositive titre-et-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 # duplique une diapositive (ou slideLayoutN.xml) ; imprime 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 et rels orphelins
# modifier le contenu des diapositives 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
- Faites tout le travail structurel — ajout, suppression, réorganisation — avant de modifier le contenu d'une diapositive.
add_slide.pycopie un fichier de diapositive textuellement, donc dupliquer après une modification 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 à la main —
add_slide.pyeffectue tous les enregistrements nécessaires pour une nouvelle diapositive et indique ce qu'il a créé (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 deck d'entrée en 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 modifier 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 à un seul run non stylisé — utilisez plutôtrun.text), ou lire le SVG/EMF que la plupart des modèles utilisent (add_picturelèveUnidentifiedImageError). - Le
.ppthérité doit d'abord être converti :python scripts/office/soffice.py --headless --convert-to pptx file.ppt. Les modèles.potxse décompressent et se compressent à l'identique — conservez l'extension.potxsur la sortie. - Pour réutiliser une icône ou une image de modèle, dupliquez une diapositive ou une disposition 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 d'OOXML viaxml.etree.ElementTreeréécrit les préfixes d'espace de noms et corrompt le deck. - Les emplacements du modèle ≠ les éléments source. Si le modèle affiche 4 membres d'équipe et que vous en avez 3, supprimez le groupe entier du 4e membre (image + zones de texte), pas seulement son texte — puis vérifiez les visuels orphelins lors du contrôle qualité.
- Un
<a:p>par élément de liste — ne concaténez jamais des éléments en un seul paragraphe. Copiez le<a:pPr>frère pour préserver l'espacement, et mettezb="1"sur le<a:rPr>des titres, en-têtes de section et étiquettes en ligne (Status :,Owner :). - Laissez les puces hériter de la disposition ; ajoutez
<a:buChar>,<a:buAutoNum>(numéroté) ou<a:buNone>uniquement pour remplacer — jamais un•littéral dans le texte. - Le texte avec des espaces de début ou de fin nécessite
xml:space="preserve"sur son<a:t>.
Idées de design
Ne créez pas de diapositives ennuyeuses. Des puces simples sur 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 adaptée au contenu : La palette doit sembler conçue pour CE sujet. Si échanger vos couleurs dans une présentation complètement différente "fonctionne" toujours, vous n'avez pas fait de choix assez spécifiques.
- Dominance plutôt qu'é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 un aspect premium.
- Adoptez 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 À éviter).
Palettes de couleurs
Choisissez des couleurs qui correspondent à votre sujet — ne vous rabattez pas sur le bleu générique. Utilisez ces palettes comme inspiration :
| Thème | Primaire | Secondaire | Accent |
|---|---|---|---|
| Midnight Executive | 1E2761 (bleu marine) | CADCFC (bleu glacé) | 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 disposition :
- Deux colonnes (texte à gauche, illustration à droite)
- Icône + lignes de texte (icône dans un cercle coloré, titre en gras, description en dessous)
- Grille 2x2 ou 2x3 (image d'un côté, grille de blocs de contenu de l'autre)
- Image demi-à-fond (côté gauche ou droit complet) avec superposition de contenu
Affichage des données :
- Grands chiffres d'appel (grands nombres 60-72pt avec petites étiquettes en dessous)
- Colonnes de comparaison (avant/après, pour/contre, options côte à côte)
- Chronologie ou flux de processus (étapes numérotées, flèches)
Finition visuelle :
- Icônes dans de petits cercles colorés à côté des en-têtes de section
- Texte 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 contrôle qualité visuel est rendu via LibreOffice, qui substitue les polices qu'il ne possède pas — et pour certaines polices, la substitution 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 véritable deck n'aura pas. Pour garder votre contrôle qualité fiable :
- Polices sûres (rendu fidèle à la largeur dans le contrôle qualité et livrées 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 qui concerne l'ajustement.
- En-têtes avec personnalité à risque de contrôle qualité zéro : associez une police avec empattements de la liste sûre (Cambria, Bookman Old Style, Century Schoolbook) avec une police sans empattements 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 au contrôle qualité de l'ajustement du texte 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é (la substitution 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é. Bon pour les titres/acce
… (la suite du texte est tronquée)