Gérer les thèmes de présentation en PHP
Introduction
Un thème de présentation définit un ensemble coordonné de couleurs, polices, styles d’arrière‑plan, remplissages, lignes et effets. Les objets sensibles au thème se réfèrent à ces définitions partagées au lieu de stocker chaque propriété visuelle comme une valeur fixe, de sorte qu’un changement de thème peut mettre à jour de nombreux objets en même temps.
Dans Aspose.Slides, le thème au niveau de la présentation est disponible via Presentation.getMasterTheme. Une présentation peut également contenir des substitutions de thème à des niveaux inférieurs. Un maître peut remplacer le thème de la présentation via MasterThemeManager.getOverrideTheme, tandis qu’une disposition ou une diapositive individuelle peut remplacer son thème hérité via BaseOverrideThemeManager.getOverrideTheme. En pratique, le thème effectif d’une diapositive est résolu selon cette chaîne d’héritage : thème de la présentation, remplacement du maître, remplacement de la disposition et remplacement de la diapositive.

Les sections ci‑dessous montrent les flux de travail les plus courants liés aux thèmes : inspecter un thème, modifier les couleurs et les polices, copier ou appliquer un thème, mettre à jour les styles d’arrière‑plan et d’effets, et lire les valeurs effectives après résolution de l’héritage et des remplacements.
Inspecter un thème
L’objet MasterTheme expose le jeu de couleurs du thème, le jeu de polices et le jeu de formats via MasterTheme.getColorScheme, MasterTheme.getFontScheme, et MasterTheme.getFormatScheme. Inspecter ces collections avant de les modifier est particulièrement utile lorsqu’une présentation provient d’une source externe, car le nombre et le contenu des entrées de style peuvent varier.
L’exemple suivant lit les propriétés principales du thème et indique combien de styles d’arrière‑plan, de remplissage, de ligne et d’effet sont stockés dans le thème :
use aspose\slides\Presentation;
$presentation = new Presentation("input.pptx");
try {
$theme = $presentation->getMasterTheme();
echo "Theme name: " . $theme->getName() . PHP_EOL;
echo "Accent 1: " . $theme->getColorScheme()->getAccent1()->getColor() . PHP_EOL;
echo "Major Latin font: " . $theme->getFontScheme()->getMajor()->getLatinFont()->getFontName() . PHP_EOL;
echo "Minor Latin font: " . $theme->getFontScheme()->getMinor()->getLatinFont()->getFontName() . PHP_EOL;
echo "Background fill styles: " . java_values($theme->getFormatScheme()->getBackgroundFillStyles()->size()) . PHP_EOL;
echo "Fill styles: " . java_values($theme->getFormatScheme()->getFillStyles()->size()) . PHP_EOL;
echo "Line styles: " . java_values($theme->getFormatScheme()->getLineStyles()->size()) . PHP_EOL;
echo "Effect styles: " . java_values($theme->getFormatScheme()->getEffectStyles()->size()) . PHP_EOL;
} finally {
$presentation->dispose();
}
Si un fichier utilise plusieurs maîtres, ne supposez pas que chaque diapositive possède le même thème effectif. Inspectez le maître associé à la diapositive, et utilisez le flux de travail du thème effectif présenté plus loin dans cet article lorsqu’il peut y avoir des remplacements au niveau de la disposition ou de la diapositive.
Modifier les couleurs du thème
Les remplissages, lignes et textes sensibles au thème peuvent se référer à une couleur logique provenant de l’énumération SchemeColor. Lorsque vous modifiez l’entrée correspondante dans le ColorScheme, tous les objets qui référencent encore cette couleur de thème sont résolus en fonction de la nouvelle valeur. Les objets qui utilisent une couleur RVB directe ne sont pas modifiés par une mise à jour de couleur du thème.
L’exemple de bout en bout suivant crée une forme qui utilise Accent4, change la couleur du thème Accent4 en rouge, enregistre la présentation, la rouvre et imprime la couleur de remplissage effective :
use aspose\slides\FillType;
use aspose\slides\Presentation;
use aspose\slides\SaveFormat;
use aspose\slides\SchemeColor;
use aspose\slides\ShapeType;
$presentation = new Presentation();
try {
$slide = $presentation->getSlides()->get_Item(0);
$shape = $slide->getShapes()->addAutoShape(ShapeType::Rectangle, 10, 10, 100, 100);
$shape->getFillFormat()->setFillType(FillType::Solid);
$shape->getFillFormat()->getSolidFillColor()->setSchemeColor(SchemeColor::Accent4);
$presentation->getMasterTheme()->getColorScheme()->getAccent4()->setColor(java("java.awt.Color")->RED);
$presentation->save("theme-color.pptx", SaveFormat::Pptx);
} finally {
$presentation->dispose();
}
$savedPresentation = new Presentation("theme-color.pptx");
try {
$savedSlide = $savedPresentation->getSlides()->get_Item(0);
$savedShape = $savedSlide->getShapes()->get_Item(0);
$effectiveColor = $savedShape->getFillFormat()->getEffective()->getSolidFillColor();
echo sprintf("Effective fill color: A=%d, R=%d, G=%d, B=%d", java_values($effectiveColor->getAlpha()), java_values($effectiveColor->getRed()), java_values($effectiveColor->getGreen()), java_values($effectiveColor->getBlue())) . PHP_EOL;
} finally {
$savedPresentation->dispose();
}
Comme le rectangle reste lié à Accent4, sa couleur visible devient rouge après le changement du thème. Si vous remplacez la couleur du schéma par une couleur directe sur la forme, les modifications ultérieures de Accent4 n’affecteront plus ce remplissage.
Utiliser les couleurs de la palette supplémentaire
PowerPoint génère des variantes plus claires et plus foncées à partir d’une couleur de thème en appliquant des transformations de couleur. Aspose.Slides expose ces transformations via l’énumération ColorTransformOperation.

1 - Couleurs principales du thème.
2 - Variantes plus claires et plus foncées produites à partir des couleurs principales du thème.
L’exemple suivant crée six rectangles basés sur Accent4, applique des transformations de luminance à cinq d’entre eux, puis enregistre le résultat :
use aspose\slides\ColorTransformOperation;
use aspose\slides\FillType;
use aspose\slides\Presentation;
use aspose\slides\SaveFormat;
use aspose\slides\SchemeColor;
use aspose\slides\ShapeType;
$presentation = new Presentation();
try {
$slide = $presentation->getSlides()->get_Item(0);
$shape1 = $slide->getShapes()->addAutoShape(ShapeType::Rectangle, 10, 10, 50, 50);
$shape1->getFillFormat()->setFillType(FillType::Solid);
$shape1->getFillFormat()->getSolidFillColor()->setSchemeColor(SchemeColor::Accent4);
$shape2 = $slide->getShapes()->addAutoShape(ShapeType::Rectangle, 10, 70, 50, 50);
$shape2->getFillFormat()->setFillType(FillType::Solid);
$shape2->getFillFormat()->getSolidFillColor()->setSchemeColor(SchemeColor::Accent4);
$shape2->getFillFormat()->getSolidFillColor()->getColorTransform()->add(ColorTransformOperation::MultiplyLuminance, 0.2);
$shape2->getFillFormat()->getSolidFillColor()->getColorTransform()->add(ColorTransformOperation::AddLuminance, 0.8);
$shape3 = $slide->getShapes()->addAutoShape(ShapeType::Rectangle, 10, 130, 50, 50);
$shape3->getFillFormat()->setFillType(FillType::Solid);
$shape3->getFillFormat()->getSolidFillColor()->setSchemeColor(SchemeColor::Accent4);
$shape3->getFillFormat()->getSolidFillColor()->getColorTransform()->add(ColorTransformOperation::MultiplyLuminance, 0.4);
$shape3->getFillFormat()->getSolidFillColor()->getColorTransform()->add(ColorTransformOperation::AddLuminance, 0.6);
$shape4 = $slide->getShapes()->addAutoShape(ShapeType::Rectangle, 10, 190, 50, 50);
$shape4->getFillFormat()->setFillType(FillType::Solid);
$shape4->getFillFormat()->getSolidFillColor()->setSchemeColor(SchemeColor::Accent4);
$shape4->getFillFormat()->getSolidFillColor()->getColorTransform()->add(ColorTransformOperation::MultiplyLuminance, 0.6);
$shape4->getFillFormat()->getSolidFillColor()->getColorTransform()->add(ColorTransformOperation::AddLuminance, 0.4);
$shape5 = $slide->getShapes()->addAutoShape(ShapeType::Rectangle, 10, 250, 50, 50);
$shape5->getFillFormat()->setFillType(FillType::Solid);
$shape5->getFillFormat()->getSolidFillColor()->setSchemeColor(SchemeColor::Accent4);
$shape5->getFillFormat()->getSolidFillColor()->getColorTransform()->add(ColorTransformOperation::MultiplyLuminance, 0.75);
$shape6 = $slide->getShapes()->addAutoShape(ShapeType::Rectangle, 10, 310, 50, 50);
$shape6->getFillFormat()->setFillType(FillType::Solid);
$shape6->getFillFormat()->getSolidFillColor()->setSchemeColor(SchemeColor::Accent4);
$shape6->getFillFormat()->getSolidFillColor()->getColorTransform()->add(ColorTransformOperation::MultiplyLuminance, 0.5);
$presentation->save("theme-color-palette.pptx", SaveFormat::Pptx);
} finally {
$presentation->dispose();
}
Ces variantes restent basées sur la couleur du thème. Si Accent4 change plus tard, les couleurs transformées sont recalculées à partir de la nouvelle valeur Accent4.
Mapper les valeurs SchemeColor aux emplacements ColorScheme
L’énumération SchemeColor utilise Text1, Background1, Text2 et Background2, tandis que le ColorScheme expose les mêmes emplacements du thème sous les noms Dark1, Light1, Dark2 et Light2. Le mappage est fixe :
Text1=Dark1Background1=Light1Text2=Dark2Background2=Light2
Ce sont des noms alternatifs pour les mêmes emplacements du thème ; ils ne sont pas des valeurs converties dynamiquement d’une forme à l’autre.
Modifier les polices du thème
Un jeu de polices de thème contient un jeu de polices principal pour les titres et un jeu de polices secondaire pour le texte du corps. Les méthodes FontScheme.getMajor et FontScheme.getMinor exposent ces jeux.
Les identifiants de police de thème compatibles PowerPoint peuvent être utilisés dans le formatage du texte :
+mn‑lt- Police du corps Latin (Minor Latin Font)+mj‑lt- Police du titre Latin (Major Latin Font)+mn‑ea- Police du corps Asie de l’Est (Minor East Asian Font)+mj‑ea- Police du titre Asie de l’Est (Major East Asian Font)
L’exemple suivant crée un titre qui utilise la police Latin principale du thème et une ligne de corps qui utilise la police Latin secondaire du thème. Il modifie ensuite les polices du thème et enregistre le résultat :
use aspose\slides\FontData;
use aspose\slides\Presentation;
use aspose\slides\SaveFormat;
use aspose\slides\ShapeType;
$presentation = new Presentation();
try {
$slide = $presentation->getSlides()->get_Item(0);
$heading = $slide->getShapes()->addAutoShape(ShapeType::Rectangle, 40, 40, 500, 60);
$heading->getTextFrame()->setText("Theme heading");
$heading->getTextFrame()->getParagraphs()->get_Item(0)->getPortions()->get_Item(0)->getPortionFormat()->setLatinFont(new FontData("+mj-lt"));
$body = $slide->getShapes()->addAutoShape(ShapeType::Rectangle, 40, 120, 500, 60);
$body->getTextFrame()->setText("Theme body text");
$body->getTextFrame()->getParagraphs()->get_Item(0)->getPortions()->get_Item(0)->getPortionFormat()->setLatinFont(new FontData("+mn-lt"));
$presentation->getMasterTheme()->getFontScheme()->getMajor()->setLatinFont(new FontData("Aptos Display"));
$presentation->getMasterTheme()->getFontScheme()->getMinor()->setLatinFont(new FontData("Arial"));
$presentation->save("theme-fonts.pptx", SaveFormat::Pptx);
} finally {
$presentation->dispose();
}
Le titre suit la police principale et le texte du corps suit la police secondaire. Un texte qui possède un nom de police explicite au lieu d’un identifiant de thème ne changera pas automatiquement lorsque le jeu de polices du thème est modifié.
Les collections de polices principales et secondaires peuvent également contenir des mappages de police pour des systèmes d’écriture individuels, tels que le cyrillique, l’arabe, le japonais, le géorgien et le thaana. Pour inspecter, ajouter, remplacer ou supprimer ces mappages, consultez Script‑Specific Theme Fonts.
Astuce
Pour plus d’informations sur les polices de présentation, voir PowerPoint Fonts.Copier ou appliquer un thème
Les flux de travail ci‑dessous résolvent différents problèmes liés aux thèmes.
Appliquer un thème externe aux diapositives dépendantes d’un maître
Utilisez MasterSlide::applyExternalThemeToDependingSlides lorsque vous disposez d’un fichier de thème PowerPoint (.thmx) et que vous souhaitez re‑styliser chaque diapositive dépendant d’un maître particulier. Sélectionnez le maître dans la collection Presentation::getMasters représentée par MasterSlideCollection, puis transmettez le chemin du fichier thème à la méthode.
La méthode effectue les opérations suivantes :
- Crée une nouvelle diapositive maître basée sur le maître sélectionné.
- Applique le thème externe au nouveau maître.
- Associe le nouveau maître à toutes les diapositives qui dépendaient auparavant du maître sélectionné.
- Retourne le MasterSlide nouvellement créé.
L’exemple suivant applique un thème externe aux diapositives qui dépendent du premier maître et enregistre la présentation :
use aspose\slides\Presentation;
use aspose\slides\SaveFormat;
$presentation = new Presentation("presentation.pptx");
try {
$selectedMaster = $presentation->getMasters()->get_Item(0);
$themedMaster = $selectedMaster->applyExternalThemeToDependingSlides("corporate-theme.thmx");
echo "Created master: " . java_values($themedMaster->getName()) . PHP_EOL;
$presentation->save("presentation-with-external-theme.pptx", SaveFormat::Pptx);
} finally {
$presentation->dispose();
}
Un thème invalide, corrompu ou non pris en charge peut provoquer une PptxReadException. Validez les chemins fournis par les utilisateurs, gérez les échecs d’accès au système de fichiers et n’enregistrez la présentation qu’après que le thème a été appliqué avec succès.
Seules les diapositives qui dépendaient du maître sélectionné sont réaffectées. Les diapositives associées à d’autres maîtres conservent leurs maîtres et thèmes existants. Les couleurs, polices, remplissages, lignes, arrière‑plans et effets sensibles au thème sont résolus par rapport au thème externe. Les couleurs, polices, remplissages et autres formats assignés directement peuvent rester inchangés. Les remplacements au niveau de la disposition et de la diapositive peuvent également prévaloir sur les valeurs héritées du nouveau maître.
Le thème peut référencer des polices non disponibles dans l’environnement d’exécution. Pour un rendu et une exportation cohérents, installez les polices requises, fournissez‑les via custom font sources, ou configurez la font substitution.
Il s’agit d’un flux de travail direct au niveau du maître : la méthode accepte un chemin de fichier .thmx et ne nécessite pas de créer manuellement des remplacements de thème au niveau de la diapositive ou de la disposition.
Appliquer différents thèmes externes dans une présentation à plusieurs maîtres
Lorsque le maître pertinent n’est pas connu à l’avance, obtenez‑le à partir d’une diapositive représentative via Slide::getLayoutSlide et LayoutSlide::getMasterSlide. Conservez les références des maîtres originaux avant d’appliquer des thèmes, car chaque appel crée un autre maître dans la présentation.
L’exemple suivant utilise des diapositives de deux sections pour localiser leurs maîtres et applique un thème externe différent à chaque groupe :
use aspose\slides\Presentation;
use aspose\slides\SaveFormat;
$presentation = new Presentation("multi-master-presentation.pptx");
try {
if (java_values($presentation->getSlides()->size()) < 5) {
echo "The presentation does not contain the expected representative slides." . PHP_EOL;
} else {
$firstGroupMaster = $presentation->getSlides()->get_Item(0)->getLayoutSlide()->getMasterSlide();
$secondGroupMaster = $presentation->getSlides()->get_Item(4)->getLayoutSlide()->getMasterSlide();
if (java_values($firstGroupMaster->getSlideId()) === java_values($secondGroupMaster->getSlideId())) {
echo "The representative slides use the same master." . PHP_EOL;
} else {
$firstThemedMaster = $firstGroupMaster->applyExternalThemeToDependingSlides("blue-theme.thmx");
$secondThemedMaster = $secondGroupMaster->applyExternalThemeToDependingSlides("green-theme.thmx");
echo "First themed master: " . java_values($firstThemedMaster->getName()) . PHP_EOL;
echo "Second themed master: " . java_values($secondThemedMaster->getName()) . PHP_EOL;
$presentation->save("multi-master-with-external-themes.pptx", SaveFormat::Pptx);
}
}
} finally {
$presentation->dispose();
}
Le premier appel ne concerne que les diapositives dépendant de $firstGroupMaster, et le second appel ne concerne que les diapositives dépendant de $secondGroupMaster. Les diapositives appartenant à tout autre maître ne sont pas re‑stylisées.
Conserver un thème source lors du déplacement de diapositives
Si vous souhaitez déplacer une diapositive vers une autre présentation tout en conservant son design original, clonez le maître source dans la présentation cible avec MasterSlideCollection.addClone, puis clonez la diapositive avec SlideCollection.addClone et le maître cloné. Cela transfère le maître, ses dispositions et le thème associé.
use aspose\slides\Presentation;
use aspose\slides\SaveFormat;
$source = new Presentation("source-theme.pptx");
try {
$target = new Presentation("target.pptx");
try {
$sourceSlide = $source->getSlides()->get_Item(0);
$sourceMaster = $sourceSlide->getLayoutSlide()->getMasterSlide();
$clonedMaster = $target->getMasters()->addClone($sourceMaster);
$target->getSlides()->addClone($sourceSlide, $clonedMaster, true);
$target->save("theme-preserved.pptx", SaveFormat::Pptx);
} finally {
$target->dispose();
}
} finally {
$source->dispose();
}
C’est le flux de travail recommandé lorsque la diapositive source doit avoir le même aspect dans la destination. Cloner simplement le contenu sur un maître de destination non lié peut modifier les couleurs, polices, arrière‑plans et effets pilotés par le thème.
Appliquer les valeurs du thème à une diapositive existante
Si la diapositive cible doit rester sur son maître et sa disposition actuels, initialisez un remplacement au niveau de la diapositive à partir du thème source. Les méthodes OverrideTheme.initColorSchemeFrom, OverrideTheme.initFontSchemeFrom, et OverrideTheme.initFormatSchemeFrom copient les trois principaux composants du thème dans le remplacement.
use aspose\slides\Presentation;
use aspose\slides\SaveFormat;
$source = new Presentation("source-theme.pptx");
try {
$target = new Presentation("target.pptx");
try {
$targetSlide = $target->getSlides()->get_Item(0);
$overrideTheme = $targetSlide->getThemeManager()->getOverrideTheme();
$overrideTheme->initColorSchemeFrom($source->getMasterTheme()->getColorScheme());
$overrideTheme->initFontSchemeFrom($source->getMasterTheme()->getFontScheme());
$overrideTheme->initFormatSchemeFrom($source->getMasterTheme()->getFormatScheme());
$target->save("theme-applied-to-slide.pptx", SaveFormat::Pptx);
} finally {
$target->dispose();
}
} finally {
$source->dispose();
}
Cela modifie le thème utilisé par cette diapositive sans changer le thème hérité par les autres diapositives. Pour supprimer le remplacement local et revenir aux valeurs héritées, appelez OverrideTheme.clear.
Appliquer une substitution de thème à une disposition
Un remplacement au niveau de la disposition s’applique aux diapositives qui utilisent cette disposition, sauf si une diapositive particulière possède son propre remplacement. Les mêmes méthodes d’initialisation peuvent être utilisées via le LayoutSlideThemeManager :
use aspose\slides\Presentation;
use aspose\slides\SaveFormat;
$source = new Presentation("source-theme.pptx");
try {
$target = new Presentation("target.pptx");
try {
$targetSlide = $target->getSlides()->get_Item(0);
$overrideTheme = $targetSlide->getLayoutSlide()->getThemeManager()->getOverrideTheme();
$overrideTheme->initColorSchemeFrom($source->getMasterTheme()->getColorScheme());
$overrideTheme->initFontSchemeFrom($source->getMasterTheme()->getFontScheme());
$overrideTheme->initFormatSchemeFrom($source->getMasterTheme()->getFormatScheme());
$target->save("theme-applied-to-layout.pptx", SaveFormat::Pptx);
} finally {
$target->dispose();
}
} finally {
$source->dispose();
}
Utilisez un thème au niveau du maître ou de la présentation lorsque de nombreuses dispositions et diapositives doivent partager le même design de base, un remplacement de disposition lorsqu’une famille de dispositions nécessite un style différent, et un remplacement de diapositive uniquement pour de véritables exceptions. Un excès de remplacements au niveau de la diapositive rend les changements globaux ultérieurs du thème plus difficiles à prévoir.
Mettre à jour les styles d’arrière‑plan du thème
Les remplissages d’arrière‑plan du thème sont stockés dans FormatScheme.getBackgroundFillStyles. PowerPoint peut présenter plus d’options d’arrière‑plan dans son interface utilisateur que le nombre de définitions de remplissage effectivement stockées dans cette collection, car l’UI peut combiner les remplissages de thème avec les couleurs du thème et d’autres références de style.

Avant d’utiliser un style d’arrière‑plan, inspectez la collection stockée et l’Background.getStyleIndex actuel. Un index de style de 0 signifie aucun remplissage thématisé ; les valeurs positives sont des références de style d’arrière‑plan du thème. Ceci diffère de l’indexation directe de la collection PHP, où get_Item(0) désigne le premier élément stocké. Ne supposez pas que chaque présentation contient le même nombre de styles de remplissage d’arrière‑plan.
L’exemple suivant indique le nombre de remplissages d’arrière‑plan disponibles, assigne une référence d’arrière‑plan thématisé au premier maître, et enregistre la présentation :
use aspose\slides\BackgroundType;
use aspose\slides\Presentation;
use aspose\slides\SaveFormat;
$presentation = new Presentation("input.pptx");
try {
$backgroundStyleCount = java_values($presentation->getMasterTheme()->getFormatScheme()->getBackgroundFillStyles()->size());
echo "Background fill styles: " . $backgroundStyleCount . PHP_EOL;
if ($backgroundStyleCount === 0) {
throw new RuntimeException("The presentation theme does not contain background fill styles.");
}
$masterSlide = $presentation->getMasters()->get_Item(0);
$masterSlide->getBackground()->setType(BackgroundType::Themed);
$masterSlide->getBackground()->setStyleIndex(1);
$presentation->save("theme-background.pptx", SaveFormat::Pptx);
} finally {
$presentation->dispose();
}
Le résultat visible dépend de l’entrée du thème référencée par le maître et de tout remplacement d’arrière‑plan au niveau de la disposition ou de la diapositive. Si une diapositive utilise son propre arrière‑plan, modifier uniquement l’arrière‑plan du maître peut ne pas affecter cette diapositive. Utilisez Background.getEffective lorsque vous devez connaître l’arrière‑plan final après application de l’héritage.
Attention
Ne traitez pas l’index de style comme un index de collection zéro‑based. Évitez également de coder en dur un numéro de style provenant d’un fichier et de supposer qu’il aura le même aspect dans un autre fichier ; les définitions de style du thème sont spécifiques à chaque présentation.Astuce
Pour le formatage direct de l’arrière‑plan et l’héritage d’arrière‑plan, voir Presentation Background.Mettre à jour les effets du thème
Un jeu de formats de thème contient des collections distinctes de remplissages, lignes et effets exposées via FormatScheme.getFillStyles, FormatScheme.getLineStyles, et FormatScheme.getEffectStyles. Les thèmes Office typiques contiennent souvent trois entrées principales qui correspondent visuellement à un formatage subtil, modéré et intense, mais le code doit inspecter chaque collection au lieu de supposer un nombre fixe.

Lorsque vous accédez à ces collections en PHP, l’index de la collection est zéro‑based : get_Item(0) est le premier style stocké et get_Item(2) est le troisième. Les index de référence du style d’une forme constituent un concept séparé, exposé via ShapeStyle. Modifier un style de thème affecte les formes qui référencent ce style ; les formes avec un formatage direct peuvent rester inchangées.
use aspose\slides\FillType;
use aspose\slides\Presentation;
use aspose\slides\SaveFormat;
$presentation = new Presentation("Subtle_Moderate_Intense.pptx");
try {
$formatScheme = $presentation->getMasterTheme()->getFormatScheme();
if (java_values($formatScheme->getLineStyles()->size()) < 1 || java_values($formatScheme->getFillStyles()->size()) < 3 || java_values($formatScheme->getEffectStyles()->size()) < 3) {
throw new RuntimeException("The theme does not contain the style entries required by this example.");
}
$formatScheme->getLineStyles()->get_Item(0)->getFillFormat()->setFillType(FillType::Solid);
$formatScheme->getLineStyles()->get_Item(0)->getFillFormat()->getSolidFillColor()->setColor(java("java.awt.Color")->RED);
$formatScheme->getFillStyles()->get_Item(2)->setFillType(FillType::Solid);
$formatScheme->getFillStyles()->get_Item(2)->getSolidFillColor()->setColor(new Java("java.awt.Color", 34, 139, 34));
$effectFormat = $formatScheme->getEffectStyles()->get_Item(2)->getEffectFormat();
$effectFormat->enableOuterShadowEffect();
$effectFormat->getOuterShadowEffect()->setDistance(10.0);
$presentation->save("theme-effects.pptx", SaveFormat::Pptx);
} finally {
$presentation->dispose();
}
Pour les formes qui référencent ces emplacements, le premier style de ligne du thème devient rouge, le troisième style de remplissage du thème devient vert forêt opaque, et le troisième style d’effet gagne une ombre externe avec une distance de 10 points. Le résultat visuel exact dépend toujours de quels emplacements chaque forme référence et si un formatage direct remplace le thème.

Déterminer si un remplissage solide effectif utilise une couleur de thème
Un remplissage peut être stocké directement sur un objet ou hérité d’un paragraphe, d’une disposition, d’un maître, d’un style de thème ou d’un autre niveau de formatage. Appelez FillFormat::getEffective pour résoudre cette hiérarchie en données de remplissage effectives immuables. Commencez par vérifier le résultat de getFillType. Ce n’est que lorsqu’il vaut FillType::Solid que vous devez lire les propriétés du remplissage solide.
Pour un remplissage solide, getSolidFillColor renvoie la valeur RVB finale rendue après héritage, recherche dans le thème et application des transformations de couleur. La méthode getSolidFillSchemeColor renvoie l’emplacement logique correspondant de SchemeColor, tel que Text1 ou Accent6. Une valeur SchemeColor::NotDefined signifie que le remplissage solide effectif n’est pas basé sur une couleur de schéma. Dans un flux de travail où les remplissages sont soit des couleurs de thème, soit des couleurs RVB directes, cette valeur indique un remplissage RVB direct.
N’utilisez pas uniquement la valeur locale ColorFormat::getSchemeColor pour classer un remplissage. Par exemple, une portion de texte peut ne pas avoir de couleur de schéma définie localement, son compteur local étant NotDefined, tandis que son remplissage effectif hérite d’une couleur de thème et se résout en Text1 ou Accent6. Inversement, getSolidFillSchemeColor indique quel emplacement logique du thème a produit la couleur effective, mais ne précise pas si cet emplacement provient de l’objet, du paragraphe, de la disposition, du maître ou d’un autre niveau de la hiérarchie de formatage.
use aspose\slides\FillType;
use aspose\slides\Presentation;
use aspose\slides\SchemeColor;
$auditFill = function (string $objectName, $localFill): void {
$effectiveFill = $localFill->getEffective();
if (java_values($effectiveFill->getFillType()) != FillType::Solid) {
echo $objectName . ": fill type = " . java_values($effectiveFill->getFillType()) . "; not a solid fill." . PHP_EOL;
return;
}
$rgb = $effectiveFill->getSolidFillColor();
$effectiveSchemeColor = java_values($effectiveFill->getSolidFillSchemeColor());
$localSchemeColor = java_values($localFill->getSolidFillColor()->getSchemeColor());
echo sprintf("%s: RGB = #%02X%02X%02X", $objectName, java_values($rgb->getRed()), java_values($rgb->getGreen()), java_values($rgb->getBlue())) . PHP_EOL;
echo $objectName . ": local scheme = " . $localSchemeColor . ", effective scheme = " . $effectiveSchemeColor . PHP_EOL;
if ($effectiveSchemeColor == SchemeColor::NotDefined) {
echo $objectName . ": direct RGB or another non-scheme fill; audit as theme-independent." . PHP_EOL;
} else {
echo $objectName . ": theme-dependent through " . $effectiveSchemeColor . "." . PHP_EOL;
}
};
$autoShapeClass = new JavaClass("com.aspose.slides.AutoShape");
$presentation = new Presentation("input.pptx");
try {
$slideCount = java_values($presentation->getSlides()->size());
for ($slideIndex = 0; $slideIndex < $slideCount; $slideIndex++) {
$slide = $presentation->getSlides()->get_Item($slideIndex);
$shapeCount = java_values($slide->getShapes()->size());
for ($shapeIndex = 0; $shapeIndex < $shapeCount; $shapeIndex++) {
$shape = $slide->getShapes()->get_Item($shapeIndex);
$shapeName = "Slide " . ($slideIndex + 1) . ", shape " . ($shapeIndex + 1);
$auditFill($shapeName, $shape->getFillFormat());
if (java_instanceof($shape, $autoShapeClass)) {
$paragraphCount = java_values($shape->getTextFrame()->getParagraphs()->getCount());
for ($paragraphIndex = 0; $paragraphIndex < $paragraphCount; $paragraphIndex++) {
$paragraph = $shape->getTextFrame()->getParagraphs()->get_Item($paragraphIndex);
$portionCount = java_values($paragraph->getPortions()->getCount());
for ($portionIndex = 0; $portionIndex < $portionCount; $portionIndex++) {
$portion = $paragraph->getPortions()->get_Item($portionIndex);
$portionName = $shapeName . ", paragraph " . ($paragraphIndex + 1) . ", portion " . ($portionIndex + 1);
$auditFill($portionName, $portion->getPortionFormat()->getFillFormat());
}
}
}
}
}
} finally {
$presentation->dispose();
}
La branche NotDefined fournit une liste d’audit des remplissages solides qui ne suivront pas les changements des emplacements de couleur du thème. Passez en revue ces objets lorsqu’une présentation doit respecter une nouvelle palette de marque. La valeur RVB rapportée indique toujours l’apparence actuelle, tandis que la valeur de schéma explique si cette apparence est liée au thème.
Les objets au format effectif sont des instantanés. Après avoir changé le thème de la présentation, un remplacement du thème ou tout formatage hérité, appelez à nouveau getEffective et lisez les nouvelles données de remplissage effectives avant de comparer ou de rapporter les couleurs.
Lire les valeurs effectives du thème
Les objets de thème bruts indiquent ce qui est défini à un niveau donné. Les valeurs effectives indiquent ce qu’une diapositive ou une forme utilise réellement après résolution de l’héritage et des remplacements locaux. Pour une diapositive, appelez BaseOverrideThemeManager.createThemeEffective. Pour un arrière‑plan, utilisez Background.getEffective, et pour un remplissage, utilisez FillFormat.getEffective.
L’exemple suivant lit le thème effectif, l’arrière‑plan et le premier remplissage de forme d’une diapositive :
use aspose\slides\FillType;
use aspose\slides\Presentation;
$presentation = new Presentation("input.pptx");
try {
$slide = $presentation->getSlides()->get_Item(0);
$effectiveTheme = $slide->getThemeManager()->createThemeEffective();
$effectiveBackground = $slide->getBackground()->getEffective();
echo "Effective major Latin font: " . $effectiveTheme->getFontScheme()->getMajor()->getLatinFont()->getFontName() . PHP_EOL;
echo "Effective minor Latin font: " . $effectiveTheme->getFontScheme()->getMinor()->getLatinFont()->getFontName() . PHP_EOL;
echo "Effective background fill type: " . java_values($effectiveBackground->getFillFormat()->getFillType()) . PHP_EOL;
if (java_values($slide->getShapes()->size()) > 0) {
$effectiveFill = $slide->getShapes()->get_Item(0)->getFillFormat()->getEffective();
echo "First shape effective fill type: " . java_values($effectiveFill->getFillType()) . PHP_EOL;
if (java_values($effectiveFill->getFillType()) == FillType::Solid) {
$effectiveColor = $effectiveFill->getSolidFillColor();
echo sprintf("First shape effective fill color: A=%d, R=%d, G=%d, B=%d", java_values($effectiveColor->getAlpha()), java_values($effectiveColor->getRed()), java_values($effectiveColor->getGreen()), java_values($effectiveColor->getBlue())) . PHP_EOL;
}
}
} finally {
$presentation->dispose();
}
Utilisez les données effectives pour le diagnostic de rendu, la validation et les comparaisons. Si vous inspectez uniquement Presentation.getMasterTheme, vous pouvez manquer un remplacement au niveau du maître, de la disposition, de la diapositive ou de la forme qui modifie l’aspect final.
FAQ
Appliquer un thème externe affecte‑t‑il chaque diapositive de la présentation ?
Non. MasterSlide::applyExternalThemeToDependingSlides ne réaffecte que les diapositives qui dépendent du maître sélectionné. Les diapositives utilisant d’autres maîtres conservent leurs thèmes existants.
Puis‑je appliquer un thème à une seule diapositive sans changer le maître ?
Oui. Utilisez le SlideThemeManager de la diapositive et initialisez son thème de remplacement. Le changement reste local à cette diapositive ; les autres diapositives continuent d’hériter de leurs thèmes existants.
Quelle est la façon la plus sûre de transférer un thème d’une présentation à une autre ?
Lors du déplacement d’une diapositive tout en conservant son apparence source, clonez le maître source dans la destination et clonez la diapositive avec ce maître en utilisant MasterSlideCollection.addClone et SlideCollection.addClone. Cela maintient le maître, les dispositions et le thème ensemble.
Comment puis‑je voir les valeurs effectives après héritage et remplacements ?
Utilisez BaseOverrideThemeManager.createThemeEffective pour un thème de diapositive ou de disposition et les méthodes de données effectives correspondantes pour les objets de format tels que Background.getEffective et FillFormat.getEffective. Ces API renvoient les valeurs résolues après application de l’héritage et des remplacements.