Gestire i temi della presentazione su Android
Introduzione
Un tema di presentazione definisce un insieme coordinato di colori, caratteri, stili di sfondo, riempimenti, linee ed effetti. Gli oggetti sensibili al tema fanno riferimento a queste definizioni condivise anziché memorizzare ogni proprietà visiva come valore fisso, così una modifica al tema può aggiornare molti oggetti contemporaneamente.
In Aspose.Slides, il tema a livello di presentazione è disponibile tramite Presentation.getMasterTheme. Una presentazione può contenere anche sovrascritture del tema a livelli inferiori. Un master può sovrascrivere il tema della presentazione tramite MasterThemeManager.getOverrideTheme, mentre un layout o una diapositiva individuale può sovrascrivere il tema ereditato tramite BaseOverrideThemeManager.getOverrideTheme. In pratica, il tema effettivo per una diapositiva è risolto attraverso questa catena di ereditarietà: tema della presentazione, sovrascrittura del master, sovrascrittura del layout e sovrascrittura della diapositiva.

Le sezioni seguenti mostrano i flussi di lavoro più comuni sul tema: ispezionare un tema, modificare colori e caratteri, copiare o applicare un tema, aggiornare stili di sfondo ed effetti, e leggere i valori effettivi dopo che ereditarietà e sovrascritture sono state risolte.
Ispezionare un Tema
L’oggetto MasterTheme espone lo schema colori, lo schema caratteri e lo schema formato del tema tramite MasterTheme.getColorScheme, MasterTheme.getFontScheme e MasterTheme.getFormatScheme. Ispezionare queste collezioni prima di modificarle è particolarmente utile quando una presentazione proviene da una fonte esterna, poiché il numero e il contenuto delle voci di stile possono variare.
L’esempio seguente legge le proprietà principali del tema e riporta quante voci di sfondo, riempimento, linea ed effetto sono memorizzate nel tema:
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();
}
Se un file utilizza più master, non dare per scontato che ogni diapositiva abbia lo stesso tema effettivo. Ispeziona il master associato alla diapositiva e usa il flusso di lavoro del tema effettivo mostrato più avanti in questo articolo quando possono essere presenti sovrascritture di layout o diapositiva.
Modificare i Colori del Tema
I riempimenti, le linee e il testo sensibili al tema possono fare riferimento a un colore logico della enumerazione SchemeColor. Quando cambi la voce corrispondente in IColorScheme, tutti gli oggetti che ancora fanno riferimento a quel colore del tema vengono risolti rispetto al nuovo valore. Gli oggetti che usano un colore RGB diretto non vengono modificati da un aggiornamento del colore del tema.
L’esempio end‑to‑end seguente crea una forma che utilizza Accent4, cambia il colore Accent4 del tema in rosso, salva la presentazione, la riapre e stampa il colore di riempimento effettivo:
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();
}
Poiché il rettangolo rimane collegato a Accent4, il suo colore visibile diventa rosso dopo la modifica del tema. Se sostituisci il colore di schema con un colore diretto sulla forma, le modifiche successive a Accent4 non influiranno più su quel riempimento.
Usare i Colori dalla Tavolozza Aggiuntiva
PowerPoint genera varianti più chiare e più scure da un colore del tema applicando trasformazioni di colore. Aspose.Slides espone queste trasformazioni tramite la enumerazione ColorTransformOperation.

1 – Colori principali del tema.
2 – Varianti più chiare e più scure prodotte dai colori principali del tema.
L’esempio seguente crea sei rettangoli basati su Accent4, applica trasformazioni di luminanza a cinque di essi e salva il risultato:
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();
}
Queste varianti rimangono basate sul colore del tema. Se Accent4 cambia in seguito, i colori trasformati vengono ricalcolati dal nuovo valore Accent4.
Mappare i Valori di SchemeColor agli Slot di IColorScheme
La enumerazione SchemeColor utilizza Text1, Background1, Text2 e Background2, mentre IColorScheme espone gli stessi slot del tema come Dark1, Light1, Dark2 e Light2. La mappatura è fissa:
Text1=Dark1Background1=Light1Text2=Dark2Background2=Light2
Questi sono nomi alternativi per gli stessi slot del tema; non sono valori convertiti dinamicamente da una forma all’altra.
Modificare i Caratteri del Tema
Uno schema di caratteri del tema contiene un set di caratteri principale per le intestazioni e un set secondario per il corpo del testo. I metodi IFontScheme.getMajor e IFontScheme.getMinor espongono questi set.
Gli identificatori di caratteri del tema compatibili con PowerPoint possono essere usati nella formattazione del testo:
+mn-lt– Carattere del corpo Latin (Minor Latin Font)+mj-lt– Carattere dell’intestazione Latin (Major Latin Font)+mn-ea– Carattere del corpo East Asian (Minor East Asian Font)+mj-ea– Carattere dell’intestazione East Asian (Major East Asian Font)
L’esempio seguente crea un’intestazione che utilizza il carattere Latin principale del tema e una riga di corpo che utilizza il carattere Latin secondario del tema. Successivamente cambia i caratteri del tema e salva il risultato:
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();
}
L’intestazione segue il carattere principale e il testo del corpo segue quello secondario. Il testo che ha un nome di carattere esplicito anziché un identificatore di tema non verrà cambiato automaticamente quando lo schema dei caratteri del tema cambia.
Le collezioni di caratteri principali e secondari possono contenere anche mappature di caratteri per singoli sistemi di scrittura, come cirillico, arabo, giapponese, georgiano e thaana. Per ispezionare, aggiungere, sostituire o rimuovere queste mappature, vedere Script-Specific Theme Fonts.
Tip
Per ulteriori informazioni sui caratteri delle presentazioni, vedere PowerPoint Fonts.Copiare o Applicare un Tema
I flussi di lavoro seguenti risolvono diversi problemi relativi al tema.
Applicare un Tema Esterno alle Diapositive Dipendenti da un Master
Utilizza IMasterSlide.applyExternalThemeToDependingSlides quando hai un file tema PowerPoint (.thmx) e vuoi modificare lo stile di ogni diapositiva che dipende da un master specifico. Seleziona il master dalla collezione Presentation.getMasters, che implementa IMasterSlideCollection, e passa il percorso del file tema al metodo.
Il metodo esegue le seguenti operazioni:
- Crea una nuova diapositiva master basata sul master selezionato.
- Applica il tema esterno al nuovo master.
- Assegna il nuovo master a tutte le diapositive che in precedenza dipendevano dal master selezionato.
- Restituisce il nuovo IMasterSlide.
L’esempio seguente applica un tema esterno alle diapositive che dipendono dal primo master e salva la presentazione:
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 tema non valido, corrotto o non supportato può causare PptxReadException. Convalida i percorsi forniti dagli utenti, gestisci i fallimenti di accesso al file system e salva la presentazione solo dopo che il tema è stato applicato correttamente.
Solo le diapositive che dipendevano dal master selezionato vengono riassegnate. Le diapositive associate ad altri master mantengono i loro master e temi esistenti. I colori, i caratteri, i riempimenti, le linee, gli sfondi e gli effetti sensibili al tema vengono risolti rispetto al tema esterno. I formati assegnati direttamente (colori, caratteri, riempimenti, ecc.) potrebbero rimanere invariati. Le sovrascritture a livello di layout e di diapositiva possono anche avere la precedenza sui valori ereditati dal nuovo master.
Il tema può fare riferimento a caratteri non disponibili nell’ambiente di runtime. Per una resa e un’esportazione coerenti, installa i caratteri richiesti, fornisci font tramite custom font sources, o configura font substitution.
Questo è un flusso di lavoro diretto a livello di master: il metodo accetta il percorso di un file .thmx e non richiede la creazione manuale di sovrascritture di tema a livello di layout o diapositiva.
Applicare Temi Esterni Diversi in una Presentazione Multi‑Master
Quando il master rilevante non è noto in anticipo, ottienilo da una diapositiva rappresentativa tramite ISlide.getLayoutSlide e ILayoutSlide.getMasterSlide. Conserva i riferimenti ai master originali prima di applicare qualsiasi tema, poiché ogni chiamata crea un nuovo master nella presentazione.
L’esempio seguente usa diapositive di due sezioni per individuare i loro master e applica un tema esterno diverso a ciascun gruppo:
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();
}
La prima chiamata influisce solo sulle diapositive che dipendevano da firstGroupMaster, e la seconda solo su quelle che dipendevano da secondGroupMaster. Le diapositive appartenenti a qualsiasi altro master non vengono restylate.
Preservare un Tema di Origine Quando Si Spostano Diapositive
Se vuoi spostare una diapositiva in un’altra presentazione preservandone il design originale, clona il master di origine nella presentazione di destinazione con IMasterSlideCollection.addClone, poi clona la diapositiva con ISlideCollection.addClone e il master clonato. In questo modo il master, i suoi layout e il tema associato viaggiano assieme.
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();
}
Questo è il flusso di lavoro consigliato quando la diapositiva sorgente deve apparire identica nella destinazione. Clonare semplicemente il contenuto su un master di destinazione non correlato può modificare i colori, i caratteri, gli sfondi e gli effetti guidati dal tema.
Applicare Valori di Tema a una Diapositiva Esistente
Se la diapositiva di destinazione deve rimanere sul master e layout corrente, inizializza una sovrascrittura a livello di diapositiva dal tema di origine. I metodi OverrideTheme.initColorSchemeFrom, OverrideTheme.initFontSchemeFrom e OverrideTheme.initFormatSchemeFrom copiano i tre componenti principali del tema nella sovrascrittura.
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();
}
Questo cambia il tema usato da quella diapositiva senza alterare il tema ereditato dalle altre diapositive. Per rimuovere la sovrascrittura locale e tornare ai valori ereditati, chiama OverrideTheme.clear.
Applicare una Sovrascrittura di Tema a un Layout
Una sovrascrittura a livello di layout si applica a tutte le diapositive che usano quel layout, a meno che una diapositiva specifica non abbia la sua propria sovrascrittura. Gli stessi metodi di inizializzazione possono essere usati tramite il 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();
}
Usa un tema a livello di master o di presentazione quando molti layout e diapositive devono condividere lo stesso design di base, una sovrascrittura di layout quando una famiglia di layout ha bisogno di uno stile diverso, e una sovrascrittura di diapositiva solo per vere eccezioni. Un eccesso di sovrascritture a livello di diapositiva rende più difficili da prevedere i cambiamenti globali del tema.
Aggiornare gli Stili di Sfondo del Tema
Gli sfondi del tema sono memorizzati in IFormatScheme.getBackgroundFillStyles. PowerPoint può presentare più scelte di sfondo nella sua interfaccia rispetto al numero di definizioni di riempimento effettivamente memorizzate in questa collezione, poiché l’interfaccia può combinare riempimenti di tema con colori di tema e altri riferimenti di stile.

Prima di utilizzare uno stile di sfondo, ispeziona la collezione memorizzata e l’attuale Background.getStyleIndex. Un indice di stile pari a 0 indica nessun riempimento tematico; i valori positivi sono riferimenti a stili di sfondo tematici. Questo è diverso dall’indicizzare direttamente la collezione Java, dove get_Item(0) indica il primo elemento memorizzato. Non dare per scontato che ogni presentazione contenga lo stesso numero di stili di riempimento di sfondo.
L’esempio seguente riporta il numero di riempimenti di sfondo disponibili, assegna un riferimento di sfondo tematico al primo master e salva la presentazione:
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();
}
Il risultato visibile dipende dalla voce di tema a cui fa riferimento il master e da eventuali sovrascritture di sfondo a livello di layout o diapositiva. Se una diapositiva usa il proprio sfondo, modificare solo lo sfondo del master potrebbe non influenzare quella diapositiva. Usa Background.getEffective quando hai bisogno di conoscere lo sfondo finale dopo l’applicazione dell’eredità.
Warning
Non trattare l’indice di stile come un indice di collezione basato su zero. Evita inoltre di codificare in modo fisso un numero di stile da un file e presumere che abbia lo stesso aspetto in un altro file; le definizioni di stile del tema sono specifiche per ogni presentazione.Tip
Per la formattazione diretta dello sfondo e l’eredità dello sfondo, vedere Presentation Background.Aggiornare gli Effetti del Tema
Uno schema di formato del tema contiene collezioni separate di riempimenti, linee ed effetti esposte tramite IFormatScheme.getFillStyles, IFormatScheme.getLineStyles e IFormatScheme.getEffectStyles. I temi tipici di Office contengono spesso tre voci principali che corrispondono visivamente a formattazioni sottile, moderata e intensa, ma il codice dovrebbe ispezionare ogni collezione anziché presumere un numero fisso.

Quando accedi a queste collezioni in Java, l’indice della collezione è basato su zero: get_Item(0) è il primo stile memorizzato e get_Item(2) è il terzo. Gli indici di riferimento dello stile di una forma sono un concetto separato, esposto tramite IShapeStyle. Modificare uno stile di tema influisce sulle forme che fanno riferimento a quello stile; le forme con formattazione diretta possono rimanere invariate.
L’esempio seguente verifica che le voci di stile richieste esistano, modifica il primo stile di linea, il terzo stile di riempimento, abilita un’ombra esterna nel terzo stile di effetto e salva il risultato:
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();
}
Per le forme che fanno riferimento a questi slot, il primo stile di linea del tema diventa rosso, il terzo stile di riempimento del tema diventa verde foresta solido, e il terzo stile di effetto ottiene un’ombra esterna con distanza di 10 punti. Il risultato visuale dipende ancora da quali slot di stile ogni forma fa riferimento e se una formattazione diretta sovrascrive il tema.

Determinare se un Riempimento Solido Effettivo Usa un Colore del Tema
Un riempimento può essere memorizzato direttamente su un oggetto o ereditato da un paragrafo, layout, master, stile del tema o un altro livello di formattazione. Chiama IFillFormat.getEffective per risolvere quella gerarchia in un oggetto immutabile IFillFormatEffectiveData. Prima controlla IFillFormatEffectiveData.getFillType. Solo quando è FillType.Solid dovresti leggere le proprietà del riempimento solido.
Per un riempimento solido, IFillFormatEffectiveData.getSolidFillColor restituisce il valore RGB finale renderizzato dopo l’eredità, la ricerca nel tema e le trasformazioni di colore. IFillFormatEffectiveData.getSolidFillSchemeColor restituisce lo slot logico corrispondente di SchemeColor, ad esempio Text1 o Accent6. Un valore SchemeColor.NotDefined indica che il riempimento solido effettivo non si basa su un colore di schema. In un flusso di lavoro in cui i riempimenti sono o colori di tema o colori RGB diretti, questo valore identifica un riempimento RGB diretto.
Non utilizzare il valore locale di IColorFormat.getSchemeColor da solo per classificare un riempimento. Per esempio, una porzione di testo può non avere un colore di schema definito localmente, quindi il suo valore locale è NotDefined, mentre il suo riempimento effettivo eredita un colore di tema e risolve a Text1 o Accent6. Al contrario, getSolidFillSchemeColor indica quale slot logico del tema ha prodotto il colore effettivo, ma non indica se quello slot provenga dall’oggetto, dal paragrafo, dal layout, dal master o da un altro livello della gerarchia di formattazione.
L’esempio seguente carica una presentazione, esamina sia i riempimenti delle forme che quelli delle porzioni di testo, stampa ogni valore RGB finale e il colore di schema associato, e segnala i riempimenti solidi che non seguiranno le modifiche ai colori del tema:
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();
}
Il ramo NotDefined fornisce un elenco di audit di riempimenti solidi che non risponderanno ai cambiamenti negli slot di colore del tema. Rivedi quegli oggetti quando una presentazione deve adeguarsi a una nuova palette di brand. Il valore RGB riportato mostra comunque l’aspetto attuale, mentre il valore di schema spiega se quell’aspetto è collegato al tema.
Gli oggetti di formato effettivo sono istantanee. Dopo aver cambiato il tema della presentazione, una sovrascrittura di tema o qualsiasi formattazione ereditata, chiama nuovamente getEffective e leggi un nuovo oggetto IFillFormatEffectiveData prima di confrontare o segnalare i colori.
Leggere i Valori Effettivi del Tema
Gli oggetti tema grezzi indicano cosa è definito a un determinato livello. I valori effettivi indicano cosa una diapositiva o una forma utilizza realmente dopo che ereditarietà e sovrascritture locali sono state risolte. Per una diapositiva, chiama BaseOverrideThemeManager.createThemeEffective. Per uno sfondo, utilizza Background.getEffective, e per un riempimento usa FillFormat.getEffective.
L’esempio seguente legge il tema effettivo, lo sfondo e il riempimento della prima forma da una diapositiva:
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();
}
Usa i dati effettivi per diagnostica di rendering, validazione e confronti. Se ispezioni solo Presentation.getMasterTheme, potresti perdere un master, layout, diapositiva o sovrascrittura di forma che modifica l’aspetto finale.
FAQ
Applicare un tema esterno influisce su tutte le diapositive della presentazione?
No. IMasterSlide.applyExternalThemeToDependingSlides riassegna solo le diapositive che dipendono dal master selezionato. Le diapositive che usano altri master mantengono i loro temi esistenti.
Posso applicare un tema a una singola diapositiva senza cambiare il master?
Sì. Usa il SlideThemeManager della diapositiva e inizializza la sua sovrascrittura di tema. La modifica rimane locale a quella diapositiva; le altre diapositive continuano a ereditare i loro temi attuali.
Qual è il modo più sicuro per trasferire un tema da una presentazione all’altra?
Quando sposti una diapositiva e ne preservi l’aspetto di origine, clona il master di origine nella destinazione e clona la diapositiva con quel master usando IMasterSlideCollection.addClone e ISlideCollection.addClone. In questo modo il master, i layout e il tema rimangono insieme.
Come posso vedere i valori effettivi dopo l’eredità e le sovrascritture?
Usa BaseOverrideThemeManager.createThemeEffective per una diapositiva o un layout di tema e i metodi di dati effettivi corrispondenti per oggetti di formato come Background.getEffective e FillFormat.getEffective. Queste API restituiscono i valori risolti dopo che ereditarietà e sovrascritture sono state applicate.