Beheer presentatiethema's in JavaScript
Inleiding
Een presentatiethema definieert een gecoördineerde set van kleuren, lettertypen, achtergrondstijlen, vullingen, lijnen en effecten. Thema‑bewuste objecten verwijzen naar deze gedeelde definities in plaats van elke visuele eigenschap als een vaste waarde op te slaan, zodat een themawijziging veel objecten in één keer kan bijwerken.
In Aspose.Slides is het presentatieniveau‑thema beschikbaar via Presentation.getMasterTheme. Een presentatie kan ook themaischrijvingen op lagere niveaus bevatten. Een master kan het presentatiethema overschrijven via MasterThemeManager.getOverrideTheme, terwijl een lay‑out of een individuele dia zijn geërfde thema kan overschrijven via BaseOverrideThemeManager.getOverrideTheme. In de praktijk wordt het effectieve thema voor een dia bepaald via deze overervingsketen: presentatiethema, master‑overschrijving, lay‑out‑overschrijving en dia‑overschrijving.

De onderstaande secties tonen de meest voorkomende thema‑werkstromen: een thema inspecteren, kleuren en lettertypen wijzigen, een thema kopiëren of toepassen, achtergrond‑ en effectstijlen bijwerken, en effectieve waarden lezen nadat overerving en overschrijvingen zijn toegepast.
Een thema inspecteren
Het MasterTheme‑object biedt de kleuren‑schema, lettertype‑schema en opmaak‑schema van het thema via MasterTheme.getColorScheme, MasterTheme.getFontScheme en MasterTheme.getFormatScheme. Deze collecties inspecteren voordat je ze wijzigt is vooral nuttig wanneer een presentatie uit een externe bron komt, omdat het aantal en de inhoud van stijl‑items kunnen variëren.
Het volgende voorbeeld leest de belangrijkste themaeigenschappen en meldt hoeveel achtergrond‑, vul‑, lijn‑ en effect‑stijlen er in het thema zijn opgeslagen:
const aspose = {};
aspose.slides = require("aspose.slides.via.java");
const presentation = new aspose.slides.Presentation("input.pptx");
try {
const theme = presentation.getMasterTheme();
console.log("Theme name: " + theme.getName());
console.log("Accent 1: " + theme.getColorScheme().getAccent1().getColor());
console.log("Major Latin font: " + theme.getFontScheme().getMajor().getLatinFont().getFontName());
console.log("Minor Latin font: " + theme.getFontScheme().getMinor().getLatinFont().getFontName());
console.log("Background fill styles: " + theme.getFormatScheme().getBackgroundFillStyles().size());
console.log("Fill styles: " + theme.getFormatScheme().getFillStyles().size());
console.log("Line styles: " + theme.getFormatScheme().getLineStyles().size());
console.log("Effect styles: " + theme.getFormatScheme().getEffectStyles().size());
} finally {
presentation.dispose();
}
Als een bestand meerdere masters gebruikt, ga er dan niet van uit dat elke dia hetzelfde effectieve thema heeft. Inspecteer de master die bij de dia hoort, en gebruik de effectieve‑thema‑werkstroom die later in dit artikel wordt getoond wanneer lay‑out‑ of dia‑overschrijvingen aanwezig kunnen zijn.
Thema‑kleuren wijzigen
Thema‑bewuste vullingen, lijnen en tekst kunnen verwijzen naar een logische kleur uit de SchemeColor‑enumeratie. Wanneer je het overeenkomstige item in de ColorScheme wijzigt, worden alle objecten die nog naar die themakleur verwijzen geresolveerd tegen de nieuwe waarde. Objecten die een directe RGB‑kleur gebruiken, worden niet aangepast door een themakleur‑update.
Het volgende end‑to‑end‑voorbeeld maakt een vorm die Accent4 gebruikt, verandert de Accent4‑kleur van het thema naar rood, slaat de presentatie op, opent deze opnieuw, en print de effectieve vulkleur:
const aspose = {};
aspose.slides = require("aspose.slides.via.java");
const java = require("java");
const presentation = new aspose.slides.Presentation();
try {
const slide = presentation.getSlides().get_Item(0);
const shape = slide.getShapes().addAutoShape(aspose.slides.ShapeType.Rectangle, 10, 10, 100, 100);
shape.getFillFormat().setFillType(java.newByte(aspose.slides.FillType.Solid));
shape.getFillFormat().getSolidFillColor().setSchemeColor(aspose.slides.SchemeColor.Accent4);
presentation.getMasterTheme().getColorScheme().getAccent4().setColor(java.getStaticFieldValue("java.awt.Color", "RED"));
presentation.save("theme-color.pptx", aspose.slides.SaveFormat.Pptx);
} finally {
presentation.dispose();
}
const savedPresentation = new aspose.slides.Presentation("theme-color.pptx");
try {
const savedSlide = savedPresentation.getSlides().get_Item(0);
const savedShape = savedSlide.getShapes().get_Item(0);
const effectiveFill = savedShape.getFillFormat().getEffective();
console.log("Effective fill color: " + effectiveFill.getSolidFillColor());
} finally {
savedPresentation.dispose();
}
Omdat het rechthoekige object nog gekoppeld is aan Accent4, wordt de zichtbare kleur rood nadat het thema is gewijzigd. Als je de schema‑kleur vervangt door een directe kleur op de vorm, zullen latere wijzigingen in Accent4 die vulkleur niet meer beïnvloeden.
Kleuren uit het aanvullende palet gebruiken
PowerPoint krijgt lichtere en donkerdere varianten van een themakleur door kleurovergangen toe te passen. Aspose.Slides maakt deze transformaties beschikbaar via de ColorTransformOperation‑enumeratie.

1 - Hoofdkleuren van het thema.
2 - Lichtere en donkerdere varianten geproduceerd uit de hoofdkleuren van het thema.
Het volgende voorbeeld maakt zes rechthoeken gebaseerd op Accent4, past luminantietransformaties toe op vijf ervan, en slaat het resultaat op:
const aspose = {};
aspose.slides = require("aspose.slides.via.java");
const java = require("java");
const presentation = new aspose.slides.Presentation();
try {
const slide = presentation.getSlides().get_Item(0);
const shape1 = slide.getShapes().addAutoShape(aspose.slides.ShapeType.Rectangle, 10, 10, 50, 50);
shape1.getFillFormat().setFillType(java.newByte(aspose.slides.FillType.Solid));
shape1.getFillFormat().getSolidFillColor().setSchemeColor(aspose.slides.SchemeColor.Accent4);
const shape2 = slide.getShapes().addAutoShape(aspose.slides.ShapeType.Rectangle, 10, 70, 50, 50);
shape2.getFillFormat().setFillType(java.newByte(aspose.slides.FillType.Solid));
shape2.getFillFormat().getSolidFillColor().setSchemeColor(aspose.slides.SchemeColor.Accent4);
shape2.getFillFormat().getSolidFillColor().getColorTransform().add(aspose.slides.ColorTransformOperation.MultiplyLuminance, java.newFloat(0.2));
shape2.getFillFormat().getSolidFillColor().getColorTransform().add(aspose.slides.ColorTransformOperation.AddLuminance, java.newFloat(0.8));
const shape3 = slide.getShapes().addAutoShape(aspose.slides.ShapeType.Rectangle, 10, 130, 50, 50);
shape3.getFillFormat().setFillType(java.newByte(aspose.slides.FillType.Solid));
shape3.getFillFormat().getSolidFillColor().setSchemeColor(aspose.slides.SchemeColor.Accent4);
shape3.getFillFormat().getSolidFillColor().getColorTransform().add(aspose.slides.ColorTransformOperation.MultiplyLuminance, java.newFloat(0.4));
shape3.getFillFormat().getSolidFillColor().getColorTransform().add(aspose.slides.ColorTransformOperation.AddLuminance, java.newFloat(0.6));
const shape4 = slide.getShapes().addAutoShape(aspose.slides.ShapeType.Rectangle, 10, 190, 50, 50);
shape4.getFillFormat().setFillType(java.newByte(aspose.slides.FillType.Solid));
shape4.getFillFormat().getSolidFillColor().setSchemeColor(aspose.slides.SchemeColor.Accent4);
shape4.getFillFormat().getSolidFillColor().getColorTransform().add(aspose.slides.ColorTransformOperation.MultiplyLuminance, java.newFloat(0.6));
shape4.getFillFormat().getSolidFillColor().getColorTransform().add(aspose.slides.ColorTransformOperation.AddLuminance, java.newFloat(0.4));
const shape5 = slide.getShapes().addAutoShape(aspose.slides.ShapeType.Rectangle, 10, 250, 50, 50);
shape5.getFillFormat().setFillType(java.newByte(aspose.slides.FillType.Solid));
shape5.getFillFormat().getSolidFillColor().setSchemeColor(aspose.slides.SchemeColor.Accent4);
shape5.getFillFormat().getSolidFillColor().getColorTransform().add(aspose.slides.ColorTransformOperation.MultiplyLuminance, java.newFloat(0.75));
const shape6 = slide.getShapes().addAutoShape(aspose.slides.ShapeType.Rectangle, 10, 310, 50, 50);
shape6.getFillFormat().setFillType(java.newByte(aspose.slides.FillType.Solid));
shape6.getFillFormat().getSolidFillColor().setSchemeColor(aspose.slides.SchemeColor.Accent4);
shape6.getFillFormat().getSolidFillColor().getColorTransform().add(aspose.slides.ColorTransformOperation.MultiplyLuminance, java.newFloat(0.5));
presentation.save("theme-color-palette.pptx", aspose.slides.SaveFormat.Pptx);
} finally {
presentation.dispose();
}
Deze varianten blijven gebaseerd op de themakleur. Als Accent4 later verandert, worden de getransformeerde kleuren opnieuw berekend vanuit de nieuwe Accent4‑waarde.
SchemeColor‑waarden toewijzen aan ColorScheme‑slots
De SchemeColor‑enumeratie gebruikt Text1, Background1, Text2 en Background2, terwijl de ColorScheme dezelfde themaslots exposeert als Dark1, Light1, Dark2 en Light2. De toewijzing is vast:
Text1=Dark1Background1=Light1Text2=Dark2Background2=Light2
Dit zijn alternatieve namen voor dezelfde themaslots; ze zijn geen waarden die dynamisch van de ene vorm naar de andere worden geconverteerd.
Thema‑lettertypen wijzigen
Een thema‑lettertype‑schema bevat een hoofdlettertype‑set voor koppen en een onderlettertype‑set voor body‑tekst. De methoden FontScheme.getMajor en FontScheme.getMinor geven die sets bloot.
PowerPoint‑compatibele thema‑lettertype‑identifiers kunnen worden gebruikt in tekstopmaak:
+mn‑lt- Bodylettertype Latin (Klein lettertype Latin)+mj‑lt- Koplettertype Latin (Hoofd lettertype Latin)+mn‑ea- Bodylettertype Oost‑Aziatisch (Klein lettertype Oost‑Aziatisch)+mj‑ea- Koplettertype Oost‑Aziatisch (Hoofd lettertype Oost‑Aziatisch)
Het volgende voorbeeld maakt één kop die het hoofd‑Latin‑themalettertype gebruikt en één body‑regel die het onder‑Latin‑themalettertype gebruikt. Vervolgens wijzigt het de thema‑lettertypen en slaat het resultaat op:
const aspose = {};
aspose.slides = require("aspose.slides.via.java");
const presentation = new aspose.slides.Presentation();
try {
const slide = presentation.getSlides().get_Item(0);
const heading = slide.getShapes().addAutoShape(aspose.slides.ShapeType.Rectangle, 40, 40, 500, 60);
heading.getTextFrame().setText("Theme heading");
heading.getTextFrame().getParagraphs().get_Item(0).getPortions().get_Item(0).getPortionFormat().setLatinFont(new aspose.slides.FontData("+mj-lt"));
const body = slide.getShapes().addAutoShape(aspose.slides.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 aspose.slides.FontData("+mn-lt"));
presentation.getMasterTheme().getFontScheme().getMajor().setLatinFont(new aspose.slides.FontData("Aptos Display"));
presentation.getMasterTheme().getFontScheme().getMinor().setLatinFont(new aspose.slides.FontData("Arial"));
presentation.save("theme-fonts.pptx", aspose.slides.SaveFormat.Pptx);
} finally {
presentation.dispose();
}
De kop volgt het hoofdlettertype en de body‑tekst volgt het onderlettertype. Tekst die een expliciete lettertype‑naam heeft in plaats van een thema‑identifier, zal niet automatisch wisselen wanneer het thema‑lettertype‑schema verandert.
De hoofd‑ en onderlettertype‑collecties kunnen ook lettertype‑toewijzingen bevatten voor individuele schrijfsystemen, zoals Cyrillisch, Arabisch, Japans, Georgisch en Thaana. Om deze toewijzingen te inspecteren, toe te voegen, te vervangen of te verwijderen, zie Script‑Specific Theme Fonts.
Tip
Voor meer informatie over presentatietypen, zie PowerPoint-lettertypen.Een thema kopiëren of toepassen
De onderstaande werkstromen lossen verschillende thema‑gerelateerde problemen op.
Een extern thema toepassen op dia’s die van een master afhangen
Gebruik MasterSlide.applyExternalThemeToDependingSlides wanneer je een PowerPoint‑thema‑bestand (.thmx) hebt en elke dia die van een bepaalde master afhangt wilt herstylen. Selecteer de master uit de Presentation.getMasters‑collectie, die wordt weergegeven door MasterSlideCollection, en geef het pad naar het themabestand door aan de methode.
De methode voert de volgende bewerkingen uit:
- Maakt een nieuwe masterdia op basis van de geselecteerde master.
- Past het externe thema toe op de nieuwe master.
- Wijs de nieuwe master toe aan alle dia’s die eerder afhankelijk waren van de geselecteerde master.
- Retourneert de nieuw gemaakte MasterSlide.
Het volgende voorbeeld past een extern thema toe op de dia’s die afhankelijk zijn van de eerste master en slaat de presentatie op:
const aspose = {};
aspose.slides = require("aspose.slides.via.java");
const presentation = new aspose.slides.Presentation("presentation.pptx");
try {
const selectedMaster = presentation.getMasters().get_Item(0);
const themedMaster = selectedMaster.applyExternalThemeToDependingSlides("corporate-theme.thmx");
console.log("Created master: " + themedMaster.getName());
presentation.save("presentation-with-external-theme.pptx", aspose.slides.SaveFormat.Pptx);
} finally {
presentation.dispose();
}
Een ongeldig, corrupt of niet‑ondersteund thema kan een PptxReadException veroorzaken. Valideer paden die door gebruikers worden opgegeven, handel fouten bij bestands‑systeembedragen af, en sla de presentatie alleen op nadat het thema succesvol is toegepast.
Alleen de dia’s die afhankelijk waren van de gekozen master worden opnieuw toegewezen. Dia’s die aan andere masters zijn gekoppeld behouden hun bestaande masters en thema’s. Thema‑bewuste kleuren, lettertypen, vullingen, lijnen, achtergronden en effecten worden geresolveerd tegen het externe thema. Direct toegewezen kleuren, lettertypen, vullingen en andere expliciete opmaak kunnen ongewijzigd blijven. Lay‑out‑ en dia‑overschrijvingen kunnen ook voorrang krijgen boven waarden die van de nieuwe master zijn geërfd.
Het thema kan lettertypen refereren die niet beschikbaar zijn in de runtime‑omgeving. Voor consistente weergave en export, installeer de vereiste lettertypen, zorg ze via custom font sources, of configureer font substitution.
Dit is een directe master‑niveau werkstroom: de methode accepteert een pad naar een .thmx‑bestand en vereist geen handmatige creatie van dia‑ of lay‑out‑thema‑overschrijvingen.
Verschillende externe thema’s toepassen in een presentatie met meerdere masters
Wanneer de relevante master niet van tevoren bekend is, haal deze dan op via een representatieve dia met Slide.getLayoutSlide en LayoutSlide.getMasterSlide. Sla de oorspronkelijke master‑referenties op voordat je thema’s toepast, omdat elke oproep een nieuwe master in de presentatie creëert.
Het volgende voorbeeld gebruikt dia’s uit twee secties om hun masters te vinden en past een verschillend extern thema toe op elke groep:
const aspose = {};
aspose.slides = require("aspose.slides.via.java");
const presentation = new aspose.slides.Presentation("multi-master-presentation.pptx");
try {
if (presentation.getSlides().size() < 5) {
console.log("The presentation does not contain the expected representative slides.");
} else {
const firstGroupMaster = presentation.getSlides().get_Item(0).getLayoutSlide().getMasterSlide();
const secondGroupMaster = presentation.getSlides().get_Item(4).getLayoutSlide().getMasterSlide();
if (firstGroupMaster.getSlideId() === secondGroupMaster.getSlideId()) {
console.log("The representative slides use the same master.");
} else {
const firstThemedMaster = firstGroupMaster.applyExternalThemeToDependingSlides("blue-theme.thmx");
const secondThemedMaster = secondGroupMaster.applyExternalThemeToDependingSlides("green-theme.thmx");
console.log("First themed master: " + firstThemedMaster.getName());
console.log("Second themed master: " + secondThemedMaster.getName());
presentation.save("multi-master-with-external-themes.pptx", aspose.slides.SaveFormat.Pptx);
}
}
} finally {
presentation.dispose();
}
De eerste oproep beïnvloedt alleen de dia’s die afhankelijk waren van firstGroupMaster, en de tweede oproep beïnvloedt alleen de dia’s die afhankelijk waren van secondGroupMaster. Dia’s die bij een andere master horen worden niet hergestyled.
Een bron‑thema behouden bij het verplaatsen van dia’s
Als je een dia naar een andere presentatie wilt verplaatsen en het oorspronkelijke ontwerp wilt behouden, kloon dan de bron‑master in de doelpresentatie met MasterSlideCollection.addClone, kloon vervolgens de dia met SlideCollection.addClone en de gekloonde master. Dit draagt de master, zijn lay‑outs en het bijbehorende thema mee.
const aspose = {};
aspose.slides = require("aspose.slides.via.java");
const source = new aspose.slides.Presentation("source-theme.pptx");
try {
const target = new aspose.slides.Presentation("target.pptx");
try {
const sourceSlide = source.getSlides().get_Item(0);
const clonedMaster = target.getMasters().addClone(sourceSlide.getLayoutSlide().getMasterSlide());
target.getSlides().addClone(sourceSlide, clonedMaster, true);
target.save("theme-preserved.pptx", aspose.slides.SaveFormat.Pptx);
} finally {
target.dispose();
}
} finally {
source.dispose();
}
Dit is de aanbevolen werkstroom wanneer de bron‑dia er in de bestemming precies hetzelfde uit moet zien. Het simpelweg klonen van inhoud op een niet‑gerelateerde doel‑master kan thema‑gedreven kleuren, lettertypen, achtergronden en effecten wijzigen.
Thema‑waarden toepassen op een bestaande dia
Als de doeldia op zijn huidige master en lay‑out moet blijven, initialiseert u een dia‑niveau‑overschrijving vanuit het bron‑thema. De methoden OverrideTheme.initColorSchemeFrom, OverrideTheme.initFontSchemeFrom en OverrideTheme.initFormatSchemeFrom kopiëren de drie belangrijkste themacomponenten naar de overschrijving.
const aspose = {};
aspose.slides = require("aspose.slides.via.java");
const source = new aspose.slides.Presentation("source-theme.pptx");
try {
const target = new aspose.slides.Presentation("target.pptx");
try {
const sourceTheme = source.getMasterTheme();
const targetSlide = target.getSlides().get_Item(0);
const overrideTheme = targetSlide.getThemeManager().getOverrideTheme();
overrideTheme.initColorSchemeFrom(sourceTheme.getColorScheme());
overrideTheme.initFontSchemeFrom(sourceTheme.getFontScheme());
overrideTheme.initFormatSchemeFrom(sourceTheme.getFormatScheme());
target.save("theme-applied-to-slide.pptx", aspose.slides.SaveFormat.Pptx);
} finally {
target.dispose();
}
} finally {
source.dispose();
}
Dit wijzigt het thema dat die dia gebruikt zonder het thema dat andere dia’s erven te wijzigen. Om de lokale overschrijving te verwijderen en terug te keren naar geërfde waarden, roep OverrideTheme.clear aan.
Een thema‑overschrijving toepassen op een lay‑out
Een lay‑out‑niveau‑overschrijving is van toepassing op dia’s die die lay‑out gebruiken, tenzij een bepaalde dia zijn eigen overschrijving heeft. Dezelfde initialisatiemethoden kunnen worden gebruikt via de LayoutSlideThemeManager:
const aspose = {};
aspose.slides = require("aspose.slides.via.java");
const source = new aspose.slides.Presentation("source-theme.pptx");
try {
const target = new aspose.slides.Presentation("target.pptx");
try {
const sourceTheme = source.getMasterTheme();
const targetSlide = target.getSlides().get_Item(0);
const overrideTheme = targetSlide.getLayoutSlide().getThemeManager().getOverrideTheme();
overrideTheme.initColorSchemeFrom(sourceTheme.getColorScheme());
overrideTheme.initFontSchemeFrom(sourceTheme.getFontScheme());
overrideTheme.initFormatSchemeFrom(sourceTheme.getFormatScheme());
target.save("theme-applied-to-layout.pptx", aspose.slides.SaveFormat.Pptx);
} finally {
target.dispose();
}
} finally {
source.dispose();
}
Gebruik een master‑ of presentatieniveau‑thema wanneer veel lay‑outs en dia’s hetzelfde basisonderwerp moeten delen, een lay‑out‑overschrijving wanneer één lay‑out‑familie een andere styling nodig heeft, en een dia‑overschrijving alleen voor echte uitzonderingen. Overmatig veel dia‑overschrijvingen maken latere globale themawijzigingen moeilijk te voorspellen.
Thema‑achtergrondstijlen bijwerken
De achtergrondvullingen van het thema worden opgeslagen in FormatScheme.getBackgroundFillStyles. PowerPoint kan in de UI meer achtergrondkeuzes presenteren dan het aantal vuldefinities dat feitelijk in deze collectie is opgeslagen, omdat de UI thema‑vullingen kan combineren met themakleuren en andere stijl‑referenties.

Voordat je een achtergrondstijl gebruikt, inspecteer je de opgeslagen collectie en de huidige Background.getStyleIndex. Een stijl‑index van 0 betekent geen themavulling; positieve waarden zijn referenties naar themabackground‑stijlen. Dit verschilt van het indexeren van de JavaScript‑collectie rechtstreeks, waar index 0 het eerste opgeslagen item betekent. Ga er niet van uit dat elke presentatie evenveel achtergrond‑vulstijlen bevat.
Het volgende voorbeeld meldt het beschikbare aantal achtergrondvullingen, wijst een themareferentie toe aan de eerste master, en slaat de presentatie op:
const aspose = {};
aspose.slides = require("aspose.slides.via.java");
const java = require("java");
const presentation = new aspose.slides.Presentation("input.pptx");
try {
const backgroundStyles = presentation.getMasterTheme().getFormatScheme().getBackgroundFillStyles();
console.log("Background fill styles: " + backgroundStyles.size());
if (backgroundStyles.size() === 0) {
throw new Error("The presentation theme does not contain background fill styles.");
}
const masterSlide = presentation.getMasters().get_Item(0);
masterSlide.getBackground().setType(java.newByte(aspose.slides.BackgroundType.Themed));
masterSlide.getBackground().setStyleIndex(1);
presentation.save("theme-background.pptx", aspose.slides.SaveFormat.Pptx);
} finally {
presentation.dispose();
}
Het zichtbare resultaat hangt af van het themaitem dat door de master wordt gerefereerd en van eventuele achtergrond‑overschrijvingen op lay‑out‑ of dia‑niveau. Als een dia een eigen achtergrond gebruikt, kan het wijzigen van alleen de master‑achtergrond die dia niet beïnvloeden. Gebruik Background.getEffective wanneer je de uiteindelijke achtergrond na toepassing van overerving moet weten.
Waarschuwing
Beschouw de stijl‑index niet als een nul‑gebaseerde collectie‑index. Vermijd ook het hard‑coderen van een stijlnummer uit één bestand en ervan uitgaan dat het dezelfde weergave heeft in een ander bestand; themastijldefinities zijn presentatiespecifiek.Tip
Voor directe achtergrondformattering en achtergrond‑overerving, zie Presentation Background.Thema‑effecten bijwerken
Een thema‑format‑schema bevat afzonderlijke collecties voor vul‑, lijn‑ en effect‑stijlen, blootgesteld via FormatScheme.getFillStyles, FormatScheme.getLineStyles, en FormatScheme.getEffectStyles. Typische Office‑thema’s bevatten vaak drie hoofd‑stijlitems die visueel overeenkomen met subtiele, matige en intense opmaak, maar code moet elke collectie inspecteren in plaats van uit te gaan van een vast aantal.

Wanneer je deze collecties in JavaScript benadert, is de collectie‑index nul‑gebaseerd: index 0 is de eerste opgeslagen stijl en index 2 is de derde. Een vorm‑stijl‑referentie‑index is een apart concept, blootgesteld via ShapeStyle. Het wijzigen van een themastijl beïnvloedt vormen die naar die stijl verwijzen; vormen met directe opmaak kunnen ongewijzigd blijven.
Het volgende voorbeeld controleert of de vereiste stijl‑items bestaan, wijzigt de eerste lijn‑stijl, wijzigt de derde vul‑stijl, activeert een buitenste slagschaduw in de derde effect‑stijl, en slaat het resultaat op:
const aspose = {};
aspose.slides = require("aspose.slides.via.java");
const java = require("java");
const presentation = new aspose.slides.Presentation("Subtle_Moderate_Intense.pptx");
try {
const formatScheme = presentation.getMasterTheme().getFormatScheme();
if (formatScheme.getLineStyles().size() < 1 || formatScheme.getFillStyles().size() < 3 || formatScheme.getEffectStyles().size() < 3) {
throw new Error("The theme does not contain the style entries required by this example.");
}
formatScheme.getLineStyles().get_Item(0).getFillFormat().setFillType(java.newByte(aspose.slides.FillType.Solid));
formatScheme.getLineStyles().get_Item(0).getFillFormat().getSolidFillColor().setColor(java.getStaticFieldValue("java.awt.Color", "RED"));
formatScheme.getFillStyles().get_Item(2).setFillType(java.newByte(aspose.slides.FillType.Solid));
formatScheme.getFillStyles().get_Item(2).getSolidFillColor().setColor(java.newInstanceSync("java.awt.Color", 34, 139, 34));
const effectFormat = formatScheme.getEffectStyles().get_Item(2).getEffectFormat();
effectFormat.enableOuterShadowEffect();
effectFormat.getOuterShadowEffect().setDistance(10);
presentation.save("theme-effects.pptx", aspose.slides.SaveFormat.Pptx);
} finally {
presentation.dispose();
}
Voor vormen die naar deze slots verwijzen, wordt de eerste themalijn‑stijl rood, de derde themavul‑stijl een solide bosgroen, en krijgt de derde effect‑stijl een buitenste slagschaduw met een afstand van 10 punten. Het exacte visuele resultaat hangt nog steeds af van welke stijl‑slots elke vorm refereert en of directe opmaak de thema‑instelling overschrijft.

Bepalen of een effectieve solide vulling een themakleur gebruikt
Een vul kan direct op een object worden opgeslagen of geërfd van een alinea, lay‑out, master, themastijl of een ander opmaakniveau. Roep FillFormat.getEffective aan om die hiërarchie te resolven tot een onbewerkbare effectieve‑vullings‑snapshot. Controleer eerst de waarde van getFillType. Alleen wanneer deze FillType.Solid is, lees je de solide‑vulling‑eigenschappen.
Voor een solide vulling geeft getSolidFillColor de uiteindelijke gerenderde RGB‑waarde terug na overerving, themazoek en kleurovergangen. De methode getSolidFillSchemeColor retourneert het overeenkomstige logische SchemeColor‑slot, zoals Text1 of Accent6. Een waarde van SchemeColor.NotDefined betekent dat de effectieve solide vulling niet gebaseerd is op een scheme‑kleur. In een werkstroom waarbij vullingen ofwel themakleuren ofwel directe RGB‑kleuren zijn, identificeert deze waarde een directe RGB‑vulling.
Gebruik de lokale ColorFormat.getSchemeColor‑waarde niet alleen om een vulling te classificeren. Bijvoorbeeld, een tekstgedeelte kan geen lokaal gedefinieerde scheme‑kleur hebben, waardoor zijn lokale waarde NotDefined is, terwijl zijn effectieve vulling een themakleur erft en resolveert naar Text1 of Accent6. Omgekeerd vertelt getSolidFillSchemeColor je welk logisch themaslot de effectieve kleur heeft geproduceerd, maar het zegt niets over het niveau (object, alinea, lay‑out, master, etc.) waar deze waarde vandaan komt.
Het volgende voorbeeld laadt een presentatie, controleert zowel vorm‑vullingen als tekst‑gedeelte‑vullingen, drukt elke uiteindelijke RGB‑waarde en het bijbehorende scheme‑kleur af, en markeert solide vullingen die geen themakleur‑wijzigingen volgen:
const aspose = {};
aspose.slides = require("aspose.slides.via.java");
const java = require("java");
function toHexColor(color) {
const red = color.getRed().toString(16).padStart(2, "0");
const green = color.getGreen().toString(16).padStart(2, "0");
const blue = color.getBlue().toString(16).padStart(2, "0");
return `#${red}${green}${blue}`.toUpperCase();
}
function auditFill(objectName, localFill) {
const effectiveFill = localFill.getEffective();
if (effectiveFill.getFillType() !== aspose.slides.FillType.Solid) {
console.log(objectName + ": fill type = " + effectiveFill.getFillType() + "; not a solid fill.");
return;
}
const rgb = effectiveFill.getSolidFillColor();
const effectiveSchemeColor = effectiveFill.getSolidFillSchemeColor();
const localSchemeColor = localFill.getSolidFillColor().getSchemeColor();
console.log(objectName + ": RGB = " + toHexColor(rgb));
console.log(objectName + ": local scheme = " + localSchemeColor + ", effective scheme = " + effectiveSchemeColor);
if (effectiveSchemeColor === aspose.slides.SchemeColor.NotDefined) {
console.log(objectName + ": direct RGB or another non-scheme fill; audit as theme-independent.");
} else {
console.log(objectName + ": theme-dependent through " + effectiveSchemeColor + ".");
}
}
const presentation = new aspose.slides.Presentation("input.pptx");
try {
const slideCount = presentation.getSlides().size();
for (let slideIndex = 0; slideIndex < slideCount; slideIndex++) {
const slide = presentation.getSlides().get_Item(slideIndex);
const shapeCount = slide.getShapes().size();
for (let shapeIndex = 0; shapeIndex < shapeCount; shapeIndex++) {
const shape = slide.getShapes().get_Item(shapeIndex);
const shapeName = "Slide " + (slideIndex + 1) + ", shape " + (shapeIndex + 1);
auditFill(shapeName, shape.getFillFormat());
if (java.instanceOf(shape, "com.aspose.slides.IAutoShape")) {
const paragraphCount = shape.getTextFrame().getParagraphs().getCount();
for (let paragraphIndex = 0; paragraphIndex < paragraphCount; paragraphIndex++) {
const paragraph = shape.getTextFrame().getParagraphs().get_Item(paragraphIndex);
const portionCount = paragraph.getPortions().getCount();
for (let portionIndex = 0; portionIndex < portionCount; portionIndex++) {
const portion = paragraph.getPortions().get_Item(portionIndex);
const portionName = shapeName + ", paragraph " + (paragraphIndex + 1) + ", portion " + (portionIndex + 1);
auditFill(portionName, portion.getPortionFormat().getFillFormat());
}
}
}
}
}
} finally {
presentation.dispose();
}
De NotDefined‑tak levert een audit‑lijst van solide vullingen die niet reageren op wijzigingen in themakleur‑slots. Beoordeel die objecten wanneer een presentatie een nieuw merkpallet moet volgen. De gerapporteerde RGB‑waarde toont nog steeds het huidige uiterlijk, terwijl de scheme‑waarde uitlegt of dat uiterlijk verbonden is met het thema.
Effectieve‑formatobjecten zijn snapshots. Na het wijzigen van het presentatiethema, een thema‑overschrijving of enige geërfde opmaak, roep getEffective opnieuw aan en lees een nieuw effectieve‑vulling‑object voordat je kleuren vergelijkt of rapporteert.
Effectieve themawaarden lezen
Ruwe thema‑objecten vertellen je wat er op een bepaald niveau is gedefinieerd. Effectieve waarden vertellen je wat een dia of vorm daadwerkelijk gebruikt na overerving en lokale overschrijvingen. Voor een dia roep je BaseOverrideThemeManager.createThemeEffective aan. Voor een achtergrond gebruik je Background.getEffective, en voor een vulling FillFormat.getEffective.
Het volgende voorbeeld leest het effectieve thema, de achtergrond en de eerste vormvulling van een dia:
const aspose = {};
aspose.slides = require("aspose.slides.via.java");
const presentation = new aspose.slides.Presentation("input.pptx");
try {
const slide = presentation.getSlides().get_Item(0);
const effectiveTheme = slide.getThemeManager().createThemeEffective();
const effectiveBackground = slide.getBackground().getEffective();
console.log("Effective major Latin font: " + effectiveTheme.getFontScheme().getMajor().getLatinFont().getFontName());
console.log("Effective minor Latin font: " + effectiveTheme.getFontScheme().getMinor().getLatinFont().getFontName());
console.log("Effective background fill type: " + effectiveBackground.getFillFormat().getFillType());
if (slide.getShapes().size() > 0) {
const effectiveFill = slide.getShapes().get_Item(0).getFillFormat().getEffective();
console.log("First shape effective fill type: " + effectiveFill.getFillType());
if (effectiveFill.getFillType() === aspose.slides.FillType.Solid) {
console.log("First shape effective fill color: " + effectiveFill.getSolidFillColor());
}
}
} finally {
presentation.dispose();
}
Gebruik effectieve data voor weergavediagnostiek, validatie en vergelijkingen. Als je alleen Presentation.getMasterTheme inspecteert, kun je een master‑, lay‑out‑, dia‑ of vorm‑overschrijving missen die het uiteindelijke uiterlijk wijzigt.
FAQ
Heeft het toepassen van een extern thema invloed op elke dia in de presentatie?
Nee. MasterSlide.applyExternalThemeToDependingSlides wijst alleen de dia’s opnieuw toe die afhankelijk zijn van de geselecteerde master. Dia’s die andere masters gebruiken behouden hun bestaande thema’s.
Kan ik een thema toepassen op één enkele dia zonder de master te wijzigen?
Ja. Gebruik de SlideThemeManager van de dia en initialiseert zijn overschrijvings‑thema. De wijziging blijft lokaal voor die dia; andere dia’s blijven hun bestaande thema’s erven.
Wat is de veiligste manier om een thema van de ene presentatie naar de andere over te dragen?
Wanneer je een dia verplaatst en het oorspronkelijke uiterlijk wilt behouden, kloon dan de bron‑master naar de bestemming en kloon de dia met die master via MasterSlideCollection.addClone en SlideCollection.addClone. Hiermee blijven master, lay‑outs en thema samen.
Hoe kan ik de effectieve waarden zien na overerving en overschrijvingen?
Gebruik BaseOverrideThemeManager.createThemeEffective voor een dia‑ of lay‑out‑thema en de overeenkomstige effectieve‑data‑methoden voor format‑objecten zoals Background.getEffective en FillFormat.getEffective. Deze API’s retourneren de opgeloste waarden na toepassing van overerving en overschrijvingen.