Hantera presentationsteman på Android

Introduktion

Ett presentationstema definierar en samordnad uppsättning färger, teckensnitt, bakgrundsstilar, fyllningar, linjer och effekter. Tema‑medvetna objekt refererar till dessa gemensamma definitioner istället för att lagra varje visuellt egendom som ett fast värde, så en temabytesuppdatering kan uppdatera många objekt på en gång.

I Aspose.Slides är presentationsnivåns tema tillgängligt via Presentation.getMasterTheme. En presentation kan också innehålla temaarvoder på lägre nivåer. En master kan åsidosätta presentations‑temat via MasterThemeManager.getOverrideTheme, medan en layout eller enskild bild kan åsidosätta dess ärvda tema via BaseOverrideThemeManager.getOverrideTheme. I praktiken löses det effektiva temat för en bild genom denna arvskedja: presentations‑tema, master‑åsidosättning, layout‑åsidosättning och bild‑åsidosättning.

Temakomponenter: färger, teckensnitt, bakgrundsstilar och effekter

Avsnitten nedan visar de vanligaste temaarbetsflödena: inspektera ett tema, ändra färger och teckensnitt, kopiera eller tillämpa ett tema, uppdatera bakgrunds‑ och effektstilar samt läsa av effektiva värden efter att arv och åsidosättningar har lösts.

Inspektera ett tema

Objektet MasterTheme exponerar temats färgschema, teckensnittsschema och format­schema via MasterTheme.getColorScheme, MasterTheme.getFontScheme och MasterTheme.getFormatScheme. Att inspektera dessa samlingar innan de ändras är särskilt användbart när en presentation kommer från en extern källa, eftersom antalet och innehållet i stil‑poster kan variera.

Följande exempel läser huvudtemaegenskaperna och rapporterar hur många bakgrunds‑, fyllnings‑, linje‑ och effekstilar som lagras i temat:

import com.aspose.slides.*;
import android.graphics.Color;

Presentation presentation = new Presentation("input.pptx");
try {
    IMasterTheme theme = presentation.getMasterTheme();
    int accent1 = theme.getColorScheme().getAccent1().getColor();
    System.out.println("Theme name: " + theme.getName());
    System.out.println(String.format("Accent 1: Color [A=%d, R=%d, G=%d, B=%d]", Color.alpha(accent1), Color.red(accent1), Color.green(accent1), Color.blue(accent1)));
    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();
}

Om en fil använder flera master‑bilder, anta inte att varje bild har samma effektiva tema. Inspektera den master som är kopplad till bilden och använd arbetsflödet för effektiva teman som visas senare i artikeln när layout‑ eller bild‑åsidosättningar kan finnas.

Ändra temafärger

Tema‑medvetna fyllningar, linjer och text kan referera till en logisk färg från uppräkningen SchemeColor. När du ändrar motsvarande post i IColorScheme, löses alla objekt som fortfarande refererar till den temafärgen mot det nya värdet. Objekt som använder en direkt RGB‑färg ändras inte av en temafärgsuppdatering.

Följande end‑to‑end‑exempel skapar en form som använder Accent4, ändrar temats Accent4‑färg till röd, sparar presentationen, öppnar den igen och skriver ut den effektiva fyllningsfärgen:

import com.aspose.slides.*;
import android.graphics.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();
    int effectiveColor = effectiveFill.getSolidFillColor();
    System.out.println(String.format("Effective fill color: Color [A=%d, R=%d, G=%d, B=%d]", Color.alpha(effectiveColor), Color.red(effectiveColor), Color.green(effectiveColor), Color.blue(effectiveColor)));
} finally {
    savedPresentation.dispose();
}

Eftersom rektangeln fortfarande är länkad till Accent4 blir dess synliga färg röd efter att temat har ändrats. Om du ersätter schema‑färgen med en direkt färg på formen, kommer senare ändringar av Accent4 inte längre att påverka den fyllningen.

Använd färger från den extra paletten

PowerPoint härleder ljusare och mörkare varianter från en temafärg genom att tillämpa färg‑transformeringar. Aspose.Slides exponerar dessa transformationer via uppräkningen ColorTransformOperation.

Huvudtemafärger och ljusare samt mörkare färger genererade från den extra paletten

1 – Huvudtemafärger.

2 – Ljusare och mörkare varianter som produceras från huvudtemafärgerna.

Följande exempel skapar sex rektanglar baserade på Accent4, applicerar luminans‑transformeringar på fem av dem och sparar resultatet:

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();
}

Dessa varianter förblir baserade på temafärgen. Om Accent4 ändras senare räknas de transformerade färgerna om från det nya Accent4‑värdet.

Mappa SchemeColor‑värden till IColorScheme‑platser

Uppräkningen SchemeColor använder Text1, Background1, Text2 och Background2, medan IColorScheme exponerar samma temaplatser som Dark1, Light1, Dark2 och Light2. Mappningen är fast:

  • Text1 = Dark1
  • Background1 = Light1
  • Text2 = Dark2
  • Background2 = Light2

Detta är alternativa namn för samma temaplatser; de är inte värden som konverteras dynamiskt från en form till en annan.

Ändra temateckensnitt

Ett temateckensnittsschema innehåller en huvudteckensnittssats för rubriker och en bipteckensnittssats för brödtext. Metoderna IFontScheme.getMajor och IFontScheme.getMinor exponerar dessa satser.

PowerPoint‑kompatibla temateckensnittsidenterare kan användas i textformatering:

  • +mn-lt – Brödtext Latin (Minor Latin Font)
  • +mj-lt – Rubrik Latin (Major Latin Font)
  • +mn-ea – Brödtext Östasiatiskt (Minor East Asian Font)
  • +mj-ea – Rubrik Östasiatiskt (Major East Asian Font)

Följande exempel skapar en rubrik som använder det stora latin‑temateckensnittet och en brödtextrad som använder det lilla latin‑temateckensnittet. Därefter ändras temateckensnitten och resultatet sparas:

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();
}

Rubriken följer det stora teckensnittet och brödtexten följer det lilla teckensnittet. Text som har ett explicit teckensnittsnamn i stället för ett temaid‑identifierare byter inte automatiskt när temateckensnittsschemat ändras.

De stora och lilla teckensnittssamlingarna kan också innehålla teckensnittsmappningar för enskilda skriftsystem, såsom kyrilliska, arabiska, japanska, georgiska och thaan. För att inspektera, lägga till, ersätta eller ta bort dessa mappningar, se Script‑Specific Theme Fonts.

Kopiera eller tillämpa ett tema

Arbetsflödena nedan löser olika temarelaterade problem.

Tillämpa ett externt tema på en masters beroende bilder

Använd IMasterSlide.applyExternalThemeToDependingSlides när du har en PowerPoint‑temafil (.thmx) och vill återstyla alla bilder som är beroende av en viss master. Välj master‑bilden från samlingen Presentation.getMasters, som implementerar IMasterSlideCollection, och skicka temafilstigen till metoden.

Metoden utför följande operationer:

  1. Skapar en ny master‑bild baserad på den valda master‑bilden.
  2. Tillämpa det externa temat på den nya master‑bilden.
  3. Tilldelar den nya master‑bilden till alla bilder som tidigare var beroende av den valda master‑bilden.
  4. Returnerar den nyss skapade IMasterSlide.

Följande exempel tillämpar ett externt tema på de bilder som är beroende av den första master‑bilden och sparar presentationen:

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();
}

Ett ogiltigt, korrupt eller ej stödjande tema kan orsaka PptxReadException. Validera sökvägar som anges av användare, hantera fel vid filsystemstillgång och spara presentationen först när temat har tillämpats utan fel.

Endast de bilder som var beroende av den valda master‑bilden omplaceras. Bilder som är kopplade till andra master‑bilder behåller sina befintliga master‑bilder och teman. Tema‑medvetna färger, teckensnitt, fyllningar, linjer, bakgrunder och effekter löses mot det externa temat. Direkt tilldelade färger, teckensnitt, fyllningar och annan explicit formatering kan förbli oförändrade. Åsidosättningar på layout‑nivå och bild‑nivå kan också ha företräde framför värden som ärvs från den nya master‑bilden.

Temat kan referera till teckensnitt som inte finns i körningsmiljön. För konsekvent rendering och export, installera de nödvändiga teckensnitten, tillhandahåll dem via custom font sources, eller konfigurera font substitution.

Detta är ett direkt master‑nivå‑arbetsflöde: metoden accepterar en filsökväg till en .thmx‑fil och kräver ingen manuell skapelse av bild‑ eller layout‑åversättningar.

Tillämpa olika externa teman i en multimaster‑presentation

När den relevanta master‑bilden inte är känd i förväg, hämta den från en representativ bild via ISlide.getLayoutSlide och ILayoutSlide.getMasterSlide. Spara de ursprungliga master‑referenserna innan du tillämpar några teman eftersom varje anrop skapar en ny master i presentationen.

Följande exempel använder bilder från två avsnitt för att lokalisera deras master‑bilder och tillämpar ett annat externt tema på varje grupp:

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();
}

Det första anropet påverkar bara de bilder som var beroende av firstGroupMaster, och det andra anropet påverkar bara de bilder som var beroende av secondGroupMaster. Bilder som tillhör någon annan master‑bild omformas inte.

Bevara ett källtema när bilder flyttas

Om du vill flytta en bild till en annan presentation och bevara dess ursprungliga design, klona käll‑master‑bilden till mål‑presentationen med IMasterSlideCollection.addClone, klona sedan bilden med ISlideCollection.addClone och den klonade master‑bilden. Detta bär med sig master‑bilden, dess layouter och det associerade temat tillsammans.

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();
}

Detta är det föredragna arbetsflödet när käll‑bilden måste se likadan ut i destinationen. Att enbart klona innehåll på en orelaterad mål‑master kan förändra temadrivna färger, teckensnitt, bakgrunder och effekter.

Tillämpa temavärden på en befintlig bild

Om mål‑bilden måste behålla sin nuvarande master‑ och layout‑bild, initiera en bild‑nivå‑åsidosättning från käll‑temat. Metoderna OverrideTheme.initColorSchemeFrom, OverrideTheme.initFontSchemeFrom och OverrideTheme.initFormatSchemeFrom kopierar de tre huvudtema‑komponenterna till åsidosättningen.

import com.aspose.slides.*;

Presentation source = new Presentation("source-theme.pptx");
try {
    Presentation target = new Presentation("target.pptx");
    try {
        ISlide targetSlide = target.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();
}

Detta ändrar temat som den bilden använder utan att ändra temat som ärvs av andra bilder. För att ta bort den lokala åsidosättningen och återgå till ärvda värden, anropa OverrideTheme.clear.

Tillämpa en temåsåsidosättning på en layout

En layout‑nivå‑åsidosättning gäller för bilder som använder den layouten, såvida inte en särskild bild har sin egen åsidosättning. Samma initieringsmetoder kan användas via LayoutSlideThemeManager:

import com.aspose.slides.*;

Presentation source = new Presentation("source-theme.pptx");
try {
    Presentation target = new Presentation("target.pptx");
    try {
        ISlide targetSlide = target.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();
}

Använd ett master‑ eller presentations‑tema när många layouter och bilder bör dela samma grunddesign, en layout‑åsidosättning när en layout‑familj behöver annan stil, och en bild‑åsidosättning endast för verkliga undantag. Överdriven bild‑nivå‑åsidosättning gör senare globala temabyten svårare att förutsäga.

Uppdatera temats bakgrundsstilar

Temats bakgrundsfyllningar lagras i IFormatScheme.getBackgroundFillStyles. PowerPoint kan presentera fler bakgrundsalternativ i sitt UI än antalet fyllningsdefinitioner som fysiskt lagras i den här samlingen, eftersom UI kan kombinera temafyllningar med temafärger och andra stilreferenser.

PowerPoint‑bakgrundsgalleri för ett presentations‑tema

Innan du använder en bakgrundsstil, inspektera den lagrade samlingen och den aktuella Background.getStyleIndex. Ett stil‑index på 0 betyder ingen temafyllning; positiva värden är referenser till temats bakgrundsstilar. Detta skiljer sig från att indexera Java‑samlingen direkt, där get_Item(0) betyder det första lagrade objektet. Anta inte att varje presentation innehåller samma antal bakgrundsfyllningsstilar.

Följande exempel rapporterar antalet tillgängliga bakgrundsfyllningar, tilldelar en temareferens till den första master‑bilden och sparar presentationen:

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();
}

Det synliga resultatet beror på temapost som refereras av master‑bilden och på eventuella bakgrundsåsidosättningar på layout‑ eller bild‑nivå. Om en bild använder sin egen bakgrund kan en ändring av endast master‑bakgrunden lämna den bilden oförändrad. Använd Background.getEffective när du behöver veta den slutgiltiga bakgrunden efter att arv har tillämpats.

Uppdatera temats effekter

Ett temafor­matschema innehåller separata samlingar för fyllning, linje och effekt‑stilar, som exponeras via IFormatScheme.getFillStyles, IFormatScheme.getLineStyles och IFormatScheme.getEffectStyles. Vanliga Office‑teman innehåller ofta tre huvudstilsposter som visuellt motsvarar subtil, måttlig och intensiv formatering, men kod bör inspektera varje samling istället för att anta ett fast antal.

Subtila, måttliga och intensiva temaeffekter applicerade på samma form

När du handlar med dessa samlingar i Java är samlings‑indexet nollbaserat: get_Item(0) är den första lagrade stilen och get_Item(2) är den tredje. En forms stil‑referens‑index är ett separat koncept, exponerat via IShapeStyle. Att modifiera en temastil påverkar former som refererar till den temastilen; former med direkt formatering kan förbli oförändrade.

Följande exempel kontrollerar att de nödvändiga stil‑poster finns, ändrar den första linjestilen, ändrar den tredje fyllningsstilen, aktiverar ett yttre skuggor i den tredje effektstilen och sparar resultatet:

import com.aspose.slides.*;
import android.graphics.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(Color.rgb(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();
}

För former som refererar dessa platser blir den första temalinjestilen röd, den tredje temafyllningsstilen blir solid skoggrön, och den tredje effektstilen får en yttre skugga med ett avstånd på 10 punkter. Det exakta visuella resultatet beror fortfarande på vilka stil‑platser varje form refererar och huruvida direkt formatering åsidosätter temat.

Temaeffektstilar efter ändring av linje-, fyllnings‑ och skugginställningar

Avgöra om en effektiv solid fyllning använder en temafärg

En fyllning kan lagras direkt på ett objekt eller ärvas från ett stycke, en layout, en master, ett temastil eller en annan formateringsnivå. Anropa IFillFormat.getEffective för att lösa den hierarkin till en oföränderlig IFillFormatEffectiveData. Kontrollera först IFillFormatEffectiveData.getFillType. Endast när den är FillType.Solid bör du läsa solid‑fyllningsegenskaperna.

För en solid fyllning returnerar IFillFormatEffectiveData.getSolidFillColor det slutgiltiga renderade RGB‑värdet efter arv, temauppsökning och färgtransformeringar. IFillFormatEffectiveData.getSolidFillSchemeColor returnerar motsvarande logiska SchemeColor‑slot, t.ex. Text1 eller Accent6. Ett värde SchemeColor.NotDefined betyder att den effektiva solida fyllningen inte är baserad på en schema‑färg. I ett arbetsflöde där fyllningar är antingen temafärger eller direkta RGB‑färger identifierar detta värde en direkt RGB‑fyllning.

Använd inte enbart det lokala IColorFormat.getSchemeColor‑värdet för att klassificera en fyllning. Till exempel kan en textdel sakna en lokalt definierad schema‑färg, så dess lokala värde är NotDefined, medan dess effektiva fyllning ärvd en temafärg och löser till Text1 eller Accent6. Däremot visar getSolidFillSchemeColor vilken logisk temaslot som producerade den effektiva färgen, men berättar inte om den slott kom från objektet, stycket, layouten, master‑bilden eller en annan nivå i formaterings‑hierarkin.

Följande exempel laddar en presentation, granskar både form‑fyllningar och text‑del‑fyllningar, skriver ut varje slutgiltigt RGB‑värde och associerad schema‑färg, samt markerar solida fyllningar som inte kommer följa temafärgsändringar:

import com.aspose.slides.*;
import android.graphics.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;
    }

    int rgb = effectiveFill.getSolidFillColor();
    int effectiveSchemeColor = effectiveFill.getSolidFillSchemeColor();
    int localSchemeColor = localFill.getSolidFillColor().getSchemeColor();

    System.out.printf("%s: RGB = #%02X%02X%02X%n", objectName, Color.red(rgb), Color.green(rgb), Color.blue(rgb));
    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();
}

Grenen NotDefined ger en granskningslista över solida fyllningar som inte svarar på förändringar i temafärg‑slott. Granska dessa objekt när en presentation måste följa en ny varumärkespalett. Det rapporterade RGB‑värdet visar fortfarande det aktuella utseendet, medan schema‑värdet förklarar huruvida detta utseende är kopplat till temat.

Effektiva format‑objekt är ögonblicksbilder. Efter att ha ändrat presentations‑temat, en temåsåsidosättning eller någon ärvd formatering, anropa getEffective igen och läs ett nytt IFillFormatEffectiveData‑objekt innan du jämför eller rapporterar färger.

Läsa effektiva temavärden

Råa temaobjekt visar vad som är definierat på en viss nivå. Effektiva värden visar vad en bild eller form faktiskt använder efter att arv och lokala åsidosättningar lösts. För en bild, anropa BaseOverrideThemeManager.createThemeEffective. För en bakgrund, använd Background.getEffective, och för en fyllning, använd FillFormat.getEffective.

Följande exempel läser det effektiva temat, bakgrunden och den första formens fyllning från en bild:

import com.aspose.slides.*;
import android.graphics.Color;

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) {
            int effectiveColor = effectiveFill.getSolidFillColor();
            System.out.println(String.format("First shape effective fill color: Color [A=%d, R=%d, G=%d, B=%d]", Color.alpha(effectiveColor), Color.red(effectiveColor), Color.green(effectiveColor), Color.blue(effectiveColor)));
        }
    }
} finally {
    presentation.dispose();
}

Använd effektiva data för bilddiagnostik, validering och jämförelser. Om du bara inspekterar Presentation.getMasterTheme, kan du missa en master‑, layout‑, bild‑ eller form‑åsidosättning som förändrar det slutliga utseendet.

FAQ

Påverkar tillämpning av ett externt tema varje bild i presentationen?

Nej. IMasterSlide.applyExternalThemeToDependingSlides omfördelar endast de bilder som är beroende av den valda master‑bilden. Bilder som använder andra master‑bilder behåller sina befintliga teman.

Kan jag tillämpa ett tema på en enda bild utan att ändra master‑bilden?

Ja. Använd bildens SlideThemeManager och initiera dess åsidosättnings‑tema. Ändringen förblir lokal för den bilden; andra bilder fortsätter ärva sina befintliga teman.

Vad är det säkraste sättet att föra ett tema från en presentation till en annan?

När du flyttar en bild och vill bevara dess källutseende, klona käll‑master‑bilden till destinationen och klona bilden med den master‑bilden via IMasterSlideCollection.addClone och ISlideCollection.addClone. Detta behåller master‑bilden, layouterna och temat tillsammans.

Hur kan jag se de effektiva värdena efter arv och åsidosättningar?

Använd BaseOverrideThemeManager.createThemeEffective för en bild‑ eller layout‑tema och motsvarande effektiva‑data‑metoder för formatobjekt såsom Background.getEffective och FillFormat.getEffective. Dessa API‑er returnerar de lösta värdena efter att arv och åsidosättningar har tillämpats.