Création, édition et analyse de PPTX
Un .pptx est une archive ZIP de fichiers XML. Choisissez votre approche selon la tâche :
| Tâche | Approche |
|---|---|
| Créer une nouvelle présentation | Écrire un script pptxgenjs — voir les pièges ci-dessous |
| Éditer une présentation existante, ou construire à partir d'un modèle | Dézipper → éditer ppt/slides/slideN.xml → zipper |
| 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 du Python, node, ou shell simple.
| Script | Ce qu'il fait |
|---|---|
scripts/thumbnail.py deck.pptx [prefix] | Grille étiquetée de chaque diapositive, pour choisir les mises en page des modèles. .pptx uniquement. Passez prefix — la valeur par défaut est thumbnails, ce qui écrase les grilles de toute autre présentation traitée 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 également un .pptx directement avec -o out.pptx |
scripts/clean.py unpacked/ | Supprime 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 sa correction. Passez --original pour toute présentation dérivée d'un modèle — cela base les vérifications de schéma sur le modèle, afin que les erreurs XSD du modèle lui-même ne soient pas considérées comme les vôtres |
scripts/office/soffice.py --headless --convert-to pdf deck.pptx | Wrapper LibreOffice — soffice nu plante dans ce sandbox |
Créer avec pptxgenjs — pièges
pptxgenjs est préinstallé — n'exécutez pas npm install d'abord ; écrivez le script et faites 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 écrêtées — la forme n'est tout simplement pas sur la diapositive. (LAYOUT_WIDEfait 13.3" × 7.5".) - Couleurs hexadécimales : jamais de
#, jamais 8 chiffres.color: "FF0000"."#FF0000"ou l'alpha intégré dans 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 silencieusement ignoré sur l'autre. - pptxgenjs mute les objets d'options sur place (convertit les valeurs en EMU lors de la première utilisation). Ne partagez jamais un même objet
shadow/options entre deux appelsadd*— construisez un nouvel objet à chaque fois. - L'
offsetde l'ombre doit être ≥ 0 — un offset négatif corrompt le fichier. Pour projeter une ombre vers le haut, utilisezangle: 270avec un offset positif. letterSpacingest silencieusement ignoré — 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(écarts énormes). - 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 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 du présentateur 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 graphiquer (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 la série supplémentaire 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, chord) vont 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 atténuez 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,inEnd, ouinBase.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'axe 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 diapositive-XML que PowerPoint refuse, et nomme la correction 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 masters vers une seule partie de thème. PowerPoint le lit heureusement ainsi — déplacez l'élément et la même présentation devient impossible à ouvrir. - Icônes : rendez les
react-iconsen SVG (ReactDOMServer.renderToStaticMarkup), rastérisez avecsharpà ≥256px, et insérez viaaddImage({ data: "image/png;base64," + buf.toString("base64") })— le préfixeimage/png;base64,est requis (react-icons,react,react-dom, etsharpsont préinstallés —npm install react-icons react react-dom sharpuniquement si un require échoue).
Éditer des présentations 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 second argument, nommé d'après la présentation. Sa valeur par défaut est thumbnails, donc deux présentations miniatures dans un même répertoire écrasent silencieusement les grilles l'une de l'autre — celles de la première présentation sont simplement perdues (analyse de modèle uniquement — le contrôle qualité visuel a besoin des 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 mises en page — 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) ; affiche le chemin de la nouvelle diapositive
# réordonner / supprimer des diapositives = éditer <p:sldIdLst> dans ppt/presentation.xml
python scripts/clean.py unpacked/ # après les suppressions : supprime les diapositives, médias, relations orphelines
# éditer le contenu de la diapositive dans ppt/slides/slideN.xml
(cd unpacked && rm -f ../out.pptx && zip -Xr ../out.pptx .) # zipper 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éordonner — avant d'éditer 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 de<p:sldIdLst>, y compris celle que vous venez d'écrire. - Ne copiez jamais un fichier de diapositive à la main —
add_slide.pyfait tous les enregistrements nécessaires pour une nouvelle diapositive et signale ce qu'il a créé (Created ppt/slides/slide17.xml from slide2.xml). Il fonctionne également directement sur un fichier :add_slide.py deck.pptx slide2.xml -o out.pptx— passez-o, ou il réécrit la présentation d'entrée sur place. Une diapositive dupliquée référence toujours les parties de graphique/SmartArt/objet intégré 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 séquence non stylisée — assignez plutôtrun.text), ou lire le SVG/EMF utilisé par la plupart des illustrations de modèle (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 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 round-trip du OOXML viaxml.etree.ElementTreeréécrit les préfixes d'espace de noms et corrompt la présentation. - Les emplacements du modèle ≠ éléments source. Si le modèle montre 4 membres d'équipe et que vous en avez 3, supprimez le groupe entier du 4ème membre (image + zones de texte), pas seulement son texte — puis vérifiez s'il y a des éléments visuels orphelins lors du contrôle qualité.
- Un
<a:p>par élément de liste — ne concaténez jamais les é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 mise en page ; n'ajoutez
<a:buChar>,<a:buAutoNum>(numéroté), 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 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 informée par le contenu : La palette doit sembler conçue POUR ce sujet. Si échanger vos couleurs dans une présentation complètement différente "fonctionnait" toujours, 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 + conclusion, clairs pour le contenu (structure "sandwich"). Ou optez pour le sombre partout pour une sensation premium.
- Engagez-vous pour 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 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 glacial) | 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 contenant uniquement du texte sont oubliables.
Options de mise en page :
- Deux colonnes (texte à gauche, illustration à droite)
- Icône + lignes de 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ébordement (côté gauche ou droit complet) avec superposition de contenu
Affichage des données :
- Chiffres clés en grand (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 police 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 via LibreOffice substitue les polices qu'il ne possède 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 la véritable présentation n'aura pas. Pour que votre contrôle qualité reste fiable :
- Polices sûres (rendues à la bonne 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é sans risque pour le 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 sacrifier les 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 un jeu 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/accents avec du jeu ; ne faites pas confiance à l'ajustement du texte du contrôle qualité sur ces éléments.
- Ne vous rabattez jamais sur Aptos — la valeur par défaut d'Office après 2023 n'a pas de substitut compatible métrique ici et est absente des anciennes installations d'Office, donc elle n'est fiable ni d'un côté ni de l'autre.
| É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é |