Gérer les thèmes de présentation en Java
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 aux thèmes font référence à ces définitions partagées au lieu d’enregistrer chaque propriété visuelle comme une valeur fixe, ainsi 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 substituts de thème à des niveaux inférieurs. Un master peut remplacer le thème de la présentation grâce à MasterThemeManager.getOverrideTheme, tandis qu’une mise en page ou une diapositive individuelle peut remplacer son thème hérité grâce à BaseOverrideThemeManager.getOverrideTheme. En pratique, le thème effectif d’une diapositive est résolu grâce à cette chaîne d’héritage : thème de la présentation, substitution du master, substitution de la mise en page, puis substitution de la diapositive.

Les sections ci‑dessous présentent 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’effet, et lire les valeurs effectives après résolution des héritages et des substitutions.
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 principales propriétés du thème et indique le nombre de styles d’arrière‑plan, de remplissage, de ligne et d’effet stockés dans le thème :
import com.aspose.slides.*;
Presentation presentation = new Presentation("input.pptx");
try {
IMasterTheme theme = presentation.getMasterTheme();
System.out.println("Theme name: " + theme.getName());
System.out.println("Accent 1: " + theme.getColorScheme().getAccent1().getColor());
System.out.println("Major Latin font: " + theme.getFontScheme().getMajor().getLatinFont().getFontName());
System.out.println("Minor Latin font: " + theme.getFontScheme().getMinor().getLatinFont().getFontName());
System.out.println("Background fill styles: " + theme.getFormatScheme().getBackgroundFillStyles().size());
System.out.println("Fill styles: " + theme.getFormatScheme().getFillStyles().size());
System.out.println("Line styles: " + theme.getFormatScheme().getLineStyles().size());
System.out.println("Effect styles: " + theme.getFormatScheme().getEffectStyles().size());
} finally {
presentation.dispose();
}
Si un fichier utilise plusieurs masters, ne supposez pas que chaque diapositive possède le même thème effectif. Inspectez le master associé à la diapositive et utilisez le flux de travail « thème effectif » présenté plus loin dans cet article lorsqu’il peut exister des substituts de mise en page ou de diapositive.
Modifier les couleurs du thème
Les remplissages, lignes et textes sensibles au thème peuvent référencer une couleur logique de l’énumération SchemeColor. Lorsque vous modifiez l’entrée correspondante dans l’IColorScheme, tous les objets qui continuent de référencer cette couleur de thème sont résolus par rapport à la nouvelle valeur. Les objets qui utilisent une couleur RVB directe ne sont pas modifiés par une mise à jour de couleur de thème.
L’exemple complet suivant crée une forme qui utilise Accent4, change la couleur Accent4 du thème en rouge, enregistre la présentation, la rouvre et affiche la couleur de remplissage effective :
import com.aspose.slides.*;
import java.awt.Color;
Presentation presentation = new Presentation();
try {
ISlide slide = presentation.getSlides().get_Item(0);
IAutoShape 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(Color.RED);
presentation.save("theme-color.pptx", SaveFormat.Pptx);
} finally {
presentation.dispose();
}
Presentation savedPresentation = new Presentation("theme-color.pptx");
try {
ISlide savedSlide = savedPresentation.getSlides().get_Item(0);
IShape savedShape = savedSlide.getShapes().get_Item(0);
IFillFormatEffectiveData effectiveFill = savedShape.getFillFormat().getEffective();
System.out.println("Effective fill color: " + effectiveFill.getSolidFillColor());
} finally {
savedPresentation.dispose();
}
Comme le rectangle reste lié à Accent4, sa couleur visible devient rouge après le changement de 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 :
import com.aspose.slides.*;
Presentation presentation = new Presentation();
try {
ISlide slide = presentation.getSlides().get_Item(0);
IShape shape1 = slide.getShapes().addAutoShape(ShapeType.Rectangle, 10, 10, 50, 50);
shape1.getFillFormat().setFillType(FillType.Solid);
shape1.getFillFormat().getSolidFillColor().setSchemeColor(SchemeColor.Accent4);
IShape 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.2f);
shape2.getFillFormat().getSolidFillColor().getColorTransform().add(ColorTransformOperation.AddLuminance, 0.8f);
IShape 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.4f);
shape3.getFillFormat().getSolidFillColor().getColorTransform().add(ColorTransformOperation.AddLuminance, 0.6f);
IShape 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.6f);
shape4.getFillFormat().getSolidFillColor().getColorTransform().add(ColorTransformOperation.AddLuminance, 0.4f);
IShape 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.75f);
IShape 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.5f);
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.
Faire correspondre les valeurs SchemeColor aux emplacements IColorScheme
L’énumération SchemeColor utilise Text1, Background1, Text2 et Background2, tandis que l’IColorScheme expose les mêmes emplacements de 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 de thème ; il ne s’agit pas de valeurs converties dynamiquement d’une forme à l’autre.
Modifier les polices du thème
Un jeu de polices de thème comprend un jeu de polices principal pour les titres et un jeu de polices secondaire pour le texte de corps. Les méthodes IFontScheme.getMajor et IFontScheme.getMinor exposent ces jeux.
Des 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 de thème Latin principale et une ligne de corps qui utilise la police de thème Latin secondaire. Il modifie ensuite les polices du thème et enregistre le résultat :
import com.aspose.slides.*;
Presentation presentation = new Presentation();
try {
ISlide slide = presentation.getSlides().get_Item(0);
IAutoShape 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"));
IAutoShape 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 évoluera.
Les collections de polices principale et secondaire peuvent également contenir des correspondances 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 correspondances, consultez Polices de thème spécifiques au script.
Conseil
Pour plus d’informations sur les polices de présentation, voir Polices PowerPoint.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 master
Utilisez IMasterSlide.applyExternalThemeToDependingSlides lorsque vous disposez d’un fichier de thème PowerPoint (.thmx) et que vous souhaitez re‑styler toutes les diapositives qui dépendent d’un master particulier. Sélectionnez le master dans la collection Presentation.getMasters, qui implémente IMasterSlideCollection, puis transmettez le chemin du fichier thème à la méthode.
La méthode effectue les opérations suivantes :
- Crée un nouveau master slide basé sur le master sélectionné.
- Applique le thème externe au nouveau master.
- Attribue le nouveau master à toutes les diapositives qui dépendaient auparavant du master sélectionné.
- Retourne le IMasterSlide nouvellement créé.
L’exemple suivant applique un thème externe aux diapositives dépendant du premier master et enregistre la présentation :
import com.aspose.slides.*;
Presentation presentation = new Presentation("presentation.pptx");
try {
IMasterSlide selectedMaster = presentation.getMasters().get_Item(0);
IMasterSlide themedMaster = selectedMaster.applyExternalThemeToDependingSlides("corporate-theme.thmx");
System.out.println("Created master: " + themedMaster.getName());
presentation.save("presentation-with-external-theme.pptx", SaveFormat.Pptx);
} finally {
presentation.dispose();
}
Un thème invalide, corrompu ou non pris en charge peut entraîner 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 l’application réussie du thème.
Seules les diapositives qui dépendaient du master sélectionné sont réaffectées. Les diapositives associées à d’autres masters conservent leurs masters et thèmes existants. Les couleurs, polices, remplissages, lignes, arrière‑plans et effets sensibles au thème sont résolus à partir du thème externe. Les couleurs, polices, remplissages et autres formatages explicites assignés directement peuvent rester inchangés. Les substituts au niveau de la mise en page et de la diapositive peuvent également primer sur les valeurs héritées du nouveau master.
Le thème peut référencer des polices qui ne sont pas disponibles dans l’environnement d’exécution. Pour garantir un rendu et une exportation cohérents, installez les polices requises, fournissez‑les via sources de polices personnalisées, ou configurez la substitution de police.
Il s’agit d’un flux de travail direct au niveau du master : la méthode accepte un chemin de fichier .thmx et ne nécessite pas la création manuelle de substituts de thème au niveau de la mise en page ou de la diapositive.
Appliquer différents thèmes externes dans une présentation à plusieurs masters
Lorsque le master pertinent n’est pas connu à l’avance, obtenez‑le à partir d’une diapositive représentative via ISlide.getLayoutSlide et ILayoutSlide.getMasterSlide. Conservez les références de master d’origine avant d’appliquer des thèmes, car chaque appel crée un nouveau master dans la présentation.
L’exemple suivant utilise des diapositives de deux sections pour localiser leurs masters et applique un thème externe différent à chaque groupe :
import com.aspose.slides.*;
Presentation presentation = new Presentation("multi-master-presentation.pptx");
try {
if (presentation.getSlides().size() < 5) {
System.out.println("The presentation does not contain the expected representative slides.");
} else {
IMasterSlide firstGroupMaster = presentation.getSlides().get_Item(0).getLayoutSlide().getMasterSlide();
IMasterSlide secondGroupMaster = presentation.getSlides().get_Item(4).getLayoutSlide().getMasterSlide();
if (firstGroupMaster.getSlideId() == secondGroupMaster.getSlideId()) {
System.out.println("The representative slides use the same master.");
} else {
IMasterSlide firstThemedMaster = firstGroupMaster.applyExternalThemeToDependingSlides("blue-theme.thmx");
IMasterSlide secondThemedMaster = secondGroupMaster.applyExternalThemeToDependingSlides("green-theme.thmx");
System.out.println("First themed master: " + firstThemedMaster.getName());
System.out.println("Second themed master: " + secondThemedMaster.getName());
presentation.save("multi-master-with-external-themes.pptx", SaveFormat.Pptx);
}
}
} finally {
presentation.dispose();
}
Le premier appel affecte uniquement les diapositives dépendant de firstGroupMaster, et le deuxième appel affecte uniquement les diapositives dépendant de secondGroupMaster. Les diapositives appartenant à tout autre master ne sont pas re‑stylisées.
Conserver le thème source lors du déplacement de diapositives
Si vous devez déplacer une diapositive vers une autre présentation tout en conservant son design d’origine, clonez le master source dans la présentation cible avec IMasterSlideCollection.addClone, puis clonez la diapositive avec ISlideCollection.addClone et le master cloné. Cela transporte le master, ses mises en page et le thème associé en même temps.
import com.aspose.slides.*;
Presentation source = new Presentation("source-theme.pptx");
try {
Presentation target = new Presentation("target.pptx");
try {
ISlide sourceSlide = source.getSlides().get_Item(0);
IMasterSlide sourceMaster = sourceSlide.getLayoutSlide().getMasterSlide();
IMasterSlide 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 apparaître identiquement dans la destination. Cloner simplement le contenu sur un master 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 master et sa mise en page actuels, initialisez une substitution de niveau diapositive à partir du thème source. Les méthodes OverrideTheme.initColorSchemeFrom, OverrideTheme.initFontSchemeFrom, et OverrideTheme.initFormatSchemeFrom copient les trois composants principaux du thème dans la substitution.
import com.aspose.slides.*;
Presentation source = new Presentation("source-theme.pptx");
try {
Presentation target = new Presentation("target.pptx");
try {
ISlide targetSlide = presentation.getSlides().get_Item(0);
IOverrideTheme 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 toucher au thème hérité par les autres diapositives. Pour supprimer la substitution locale et revenir aux valeurs héritées, appelez OverrideTheme.clear.
Appliquer une substitution de thème à une mise en page
Une substitution au niveau de la mise en page s’applique aux diapositives qui utilisent cette mise en page, à moins qu’une diapositive particulière ne possède sa propre substitution. Les mêmes méthodes d’initialisation peuvent être utilisées via le LayoutSlideThemeManager :
import com.aspose.slides.*;
Presentation source = new Presentation("source-theme.pptx");
try {
Presentation target = new Presentation("target.pptx");
try {
ISlide targetSlide = presentation.getSlides().get_Item(0);
ILayoutSlide targetLayout = targetSlide.getLayoutSlide();
IOverrideTheme overrideTheme = targetLayout.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 master ou de la présentation lorsque de nombreuses mises en page et diapositives doivent partager la même conception de base, une substitution de mise en page lorsqu’une famille de mises en page nécessite un style différent, et une substitution de diapositive uniquement pour de véritables exceptions. Un excès de substitutions au niveau de la diapositive complique la prévisibilité des changements globaux de thème ultérieurs.
Mettre à jour les styles d’arrière‑plan du thème
Les remplissages d’arrière‑plan du thème sont stockés dans IFormatScheme.getBackgroundFillStyles. PowerPoint peut présenter davantage d’options d’arrière‑plan dans son interface que le nombre de définitions de remplissage réellement stockées dans cette collection, car l’interface peut combiner les remplissages du 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 la valeur actuelle de Background.getStyleIndex. Un indice de style de 0 signifie aucun remplissage thématique ; les valeurs positives sont des références de style d’arrière‑plan du thème. Cela diffère de l’indexation directe de la collection Java, 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, affecte une référence d’arrière‑plan thématique au premier master, puis enregistre la présentation :
import com.aspose.slides.*;
Presentation presentation = new Presentation("input.pptx");
try {
IFillFormatCollection backgroundStyles = presentation.getMasterTheme().getFormatScheme().getBackgroundFillStyles();
System.out.println("Background fill styles: " + backgroundStyles.size());
if (backgroundStyles.size() == 0) {
throw new IllegalStateException("The presentation theme does not contain background fill styles.");
}
IMasterSlide 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 master et de toute substitution d’arrière‑plan au niveau de la mise en page ou de la diapositive. Si une diapositive utilise son propre arrière‑plan, modifier uniquement l’arrière‑plan du master peut ne pas affecter cette diapositive. Utilisez Background.getEffective lorsque vous devez connaître l’arrière‑plan final après application des héritages.
Avertissement
Ne traitez pas l’indice de style comme un indice 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.Conseil
Pour le formatage direct d’arrière‑plan et l’héritage d’arrière‑plan, consultez Arrière‑plan de la présentation.Mettre à jour les effets du thème
Un jeu de formats de thème contient des collections séparées de styles de remplissage, de ligne et d’effet exposées via IFormatScheme.getFillStyles, IFormatScheme.getLineStyles, et IFormatScheme.getEffectStyles. Les thèmes Office typiques contiennent souvent trois entrées principales qui correspondent visuellement à des formatages subtils, modérés et intenses, mais le code doit inspecter chaque collection au lieu de supposer un nombre fixe.

Lorsque vous accédez à ces collections en Java, l’indice de collection commence à zéro : get_Item(0) est le premier style stocké et get_Item(2) le troisième. Les indices de référence de style d’une forme constituent un concept distinct, exposé via IShapeStyle. Modifier un style de thème affecte les formes qui y font référence ; les formes avec un formatage direct peuvent rester inchangées.
L’exemple suivant vérifie que les entrées de style requises existent, modifie le premier style de ligne, modifie le troisième style de remplissage, active une ombre externe dans le troisième style d’effet, puis enregistre le résultat :
import com.aspose.slides.*;
import java.awt.Color;
Presentation presentation = new Presentation("Subtle_Moderate_Intense.pptx");
try {
IFormatScheme formatScheme = presentation.getMasterTheme().getFormatScheme();
if (formatScheme.getLineStyles().size() < 1 || formatScheme.getFillStyles().size() < 3 || formatScheme.getEffectStyles().size() < 3) {
throw new IllegalStateException("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(Color.RED);
formatScheme.getFillStyles().get_Item(2).setFillType(FillType.Solid);
formatScheme.getFillStyles().get_Item(2).getSolidFillColor().setColor(new Color(34, 139, 34));
IEffectFormat effectFormat = formatScheme.getEffectStyles().get_Item(2).getEffectFormat();
effectFormat.enableOuterShadowEffect();
effectFormat.getOuterShadowEffect().setDistance(10f);
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 plein, et le troisième style d’effet gagne une ombre externe avec une distance de 10 points. Le rendu visuel exact dépend toujours des emplacements de style référencés par chaque forme et de l’éventuelle prévalence d’un formatage direct.

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 mise en page, d’un master, d’un style de thème ou d’un autre niveau de formatage. Appelez IFillFormat.getEffective pour résoudre cette hiérarchie en un IFillFormatEffectiveData immuable. Vérifiez d’abord IFillFormatEffectiveData.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, IFillFormatEffectiveData.getSolidFillColor renvoie la valeur RVB finale rendue après héritage, recherche dans le thème et application des transformations de couleur. IFillFormatEffectiveData.getSolidFillSchemeColor renvoie l’emplacement logique correspondant de SchemeColor, tel que Text1 ou Accent6. Une valeur SchemeColor.NotDefined signifie que le remplissage solide effectif ne repose pas 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 identifie un remplissage RVB direct.
N’utilisez pas uniquement la valeur locale de IColorFormat.getSchemeColor pour classer un remplissage. Par exemple, une portion de texte peut ne pas avoir de couleur de schéma définie localement, son champ local étant NotDefined, alors 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 il ne précise pas si cet emplacement provient de l’objet, du paragraphe, de la mise en page, du master ou d’un autre niveau de la hiérarchie de formatage.
L’exemple suivant charge une présentation, audite les remplissages des formes et des portions de texte, affiche chaque valeur RVB finale ainsi que la couleur de schéma associée, et signale les remplissages solides qui ne suivront pas les modifications des couleurs du thème :
import com.aspose.slides.*;
import java.awt.Color;
import java.util.function.BiConsumer;
BiConsumer<String, IFillFormat> auditFill = (objectName, localFill) -> {
IFillFormatEffectiveData effectiveFill = localFill.getEffective();
if (effectiveFill.getFillType() != FillType.Solid) {
System.out.println(objectName + ": fill type = " + effectiveFill.getFillType() + "; not a solid fill.");
return;
}
Color rgb = effectiveFill.getSolidFillColor();
int effectiveSchemeColor = effectiveFill.getSolidFillSchemeColor();
int localSchemeColor = localFill.getSolidFillColor().getSchemeColor();
System.out.printf("%s: RGB = #%02X%02X%02X%n", objectName, rgb.getRed(), rgb.getGreen(), rgb.getBlue());
System.out.println(objectName + ": local scheme = " + localSchemeColor + ", effective scheme = " + effectiveSchemeColor);
if (effectiveSchemeColor == SchemeColor.NotDefined) {
System.out.println(objectName + ": direct RGB or another non-scheme fill; audit as theme-independent.");
} else {
System.out.println(objectName + ": theme-dependent through " + effectiveSchemeColor + ".");
}
};
Presentation presentation = new Presentation("input.pptx");
try {
int slideCount = presentation.getSlides().size();
for (int slideIndex = 0; slideIndex < slideCount; slideIndex++) {
ISlide slide = presentation.getSlides().get_Item(slideIndex);
int shapeCount = slide.getShapes().size();
for (int shapeIndex = 0; shapeIndex < shapeCount; shapeIndex++) {
IShape shape = slide.getShapes().get_Item(shapeIndex);
String shapeName = "Slide " + (slideIndex + 1) + ", shape " + (shapeIndex + 1);
auditFill.accept(shapeName, shape.getFillFormat());
if (shape instanceof IAutoShape) {
IAutoShape autoShape = (IAutoShape) shape;
int paragraphCount = autoShape.getTextFrame().getParagraphs().getCount();
for (int paragraphIndex = 0; paragraphIndex < paragraphCount; paragraphIndex++) {
IParagraph paragraph = autoShape.getTextFrame().getParagraphs().get_Item(paragraphIndex);
int portionCount = paragraph.getPortions().getCount();
for (int portionIndex = 0; portionIndex < portionCount; portionIndex++) {
IPortion portion = paragraph.getPortions().get_Item(portionIndex);
String portionName = shapeName + ", paragraph " + (paragraphIndex + 1) + ", portion " + (portionIndex + 1);
auditFill.accept(portionName, portion.getPortionFormat().getFillFormat());
}
}
}
}
}
} finally {
presentation.dispose();
}
La branche NotDefined fournit une liste d’audit des remplissages solides qui ne réagiront pas aux changements des emplacements de couleur du thème. Examinez ces objets lorsqu’une présentation doit respecter une nouvelle palette de marque. La valeur RVB signalée montre toujours l’aspect actuel, tandis que la valeur de schéma explique si cet aspect est lié au thème.
Les objets de format effectif sont des instantanés. Après avoir modifié le thème de la présentation, une substitution de thème ou tout formatage hérité, appelez à nouveau getEffective et lisez un nouvel objet IFillFormatEffectiveData avant de comparer ou de signaler 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 des héritages et des substitutions locales. 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 :
import com.aspose.slides.*;
Presentation presentation = new Presentation("input.pptx");
try {
ISlide slide = presentation.getSlides().get_Item(0);
IThemeEffectiveData effectiveTheme = slide.getThemeManager().createThemeEffective();
IBackgroundEffectiveData effectiveBackground = slide.getBackground().getEffective();
System.out.println("Effective major Latin font: " + effectiveTheme.getFontScheme().getMajor().getLatinFont().getFontName());
System.out.println("Effective minor Latin font: " + effectiveTheme.getFontScheme().getMinor().getLatinFont().getFontName());
System.out.println("Effective background fill type: " + effectiveBackground.getFillFormat().getFillType());
if (slide.getShapes().size() > 0) {
IFillFormatEffectiveData effectiveFill = slide.getShapes().get_Item(0).getFillFormat().getEffective();
System.out.println("First shape effective fill type: " + effectiveFill.getFillType());
if (effectiveFill.getFillType() == FillType.Solid) {
System.out.println("First shape effective fill color: " + effectiveFill.getSolidFillColor());
}
}
} finally {
presentation.dispose();
}
Utilisez les données effectives pour le diagnostic de rendu, la validation et les comparaisons. Si vous examinez uniquement Presentation.getMasterTheme, vous risquez de manquer un master, une mise en page, une diapositive ou une substitution de forme qui modifie l’apparence finale.
FAQ
L’application d’un thème externe affecte‑t‑elle chaque diapositive de la présentation ?
Non. IMasterSlide.applyExternalThemeToDependingSlides ne réaffecte que les diapositives dépendant du master sélectionné. Les diapositives utilisant d’autres masters conservent leurs thèmes existants.
Puis‑je appliquer un thème à une seule diapositive sans modifier le master ?
Oui. Utilisez le SlideThemeManager de la diapositive et initialisez sa substitution de thème. La modification reste locale à cette diapositive ; les autres diapositives continuent d’hériter de leurs thèmes existants.
Quelle est la manière 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 master source dans la destination et clonez la diapositive avec ce master en utilisant IMasterSlideCollection.addClone et ISlideCollection.addClone. Cela maintient le master, les mises en page et le thème ensemble.
Comment puis‑je voir les valeurs effectives après héritage et substitutions ?
Utilisez BaseOverrideThemeManager.createThemeEffective pour le thème d’une diapositive ou d’une mise en page, ainsi que 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 des héritages et des substitutions.