Gestire i temi delle presentazioni in PHP
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 invece di memorizzare ogni proprietà visiva come valore fisso, così una modifica del tema può aggiornare molti oggetti contemporaneamente.
In Aspose.Slides, il tema a livello di presentazione è disponibile tramite Presentation.getMasterTheme. Una presentazione può anche contenere 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 di colori, lo schema di caratteri e lo schema di formattazione 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 principali proprietà del tema e segnala quante stili di sfondo, riempimento, linea ed effetto sono memorizzati nel tema:
use aspose\slides\Presentation;
$presentation = new Presentation("input.pptx");
try {
$theme = $presentation->getMasterTheme();
echo "Theme name: " . $theme->getName() . PHP_EOL;
echo "Accent 1: " . $theme->getColorScheme()->getAccent1()->getColor() . PHP_EOL;
echo "Major Latin font: " . $theme->getFontScheme()->getMajor()->getLatinFont()->getFontName() . PHP_EOL;
echo "Minor Latin font: " . $theme->getFontScheme()->getMinor()->getLatinFont()->getFontName() . PHP_EOL;
echo "Background fill styles: " . java_values($theme->getFormatScheme()->getBackgroundFillStyles()->size()) . PHP_EOL;
echo "Fill styles: " . java_values($theme->getFormatScheme()->getFillStyles()->size()) . PHP_EOL;
echo "Line styles: " . java_values($theme->getFormatScheme()->getLineStyles()->size()) . PHP_EOL;
echo "Effect styles: " . java_values($theme->getFormatScheme()->getEffectStyles()->size()) . PHP_EOL;
} finally {
$presentation->dispose();
}
Se un file utilizza più master, non assumere che ogni diapositiva abbia lo stesso tema effettivo. Ispeziona il master associato alla diapositiva e utilizza il flusso di lavoro del tema effettivo mostrato più avanti in questo articolo quando potrebbero esserci sovrascritture a livello 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 dell’enumerazione SchemeColor. Quando modifichi la voce corrispondente nello ColorScheme, tutti gli oggetti che ancora fanno riferimento a quel colore del tema vengono risolti contro il 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:
use aspose\slides\FillType;
use aspose\slides\Presentation;
use aspose\slides\SaveFormat;
use aspose\slides\SchemeColor;
use aspose\slides\ShapeType;
$presentation = new Presentation();
try {
$slide = $presentation->getSlides()->get_Item(0);
$shape = $slide->getShapes()->addAutoShape(ShapeType::Rectangle, 10, 10, 100, 100);
$shape->getFillFormat()->setFillType(FillType::Solid);
$shape->getFillFormat()->getSolidFillColor()->setSchemeColor(SchemeColor::Accent4);
$presentation->getMasterTheme()->getColorScheme()->getAccent4()->setColor(java("java.awt.Color")->RED);
$presentation->save("theme-color.pptx", SaveFormat::Pptx);
} finally {
$presentation->dispose();
}
$savedPresentation = new Presentation("theme-color.pptx");
try {
$savedSlide = $savedPresentation->getSlides()->get_Item(0);
$savedShape = $savedSlide->getShapes()->get_Item(0);
$effectiveColor = $savedShape->getFillFormat()->getEffective()->getSolidFillColor();
echo sprintf("Effective fill color: A=%d, R=%d, G=%d, B=%d", java_values($effectiveColor->getAlpha()), java_values($effectiveColor->getRed()), java_values($effectiveColor->getGreen()), java_values($effectiveColor->getBlue())) . PHP_EOL;
} finally {
$savedPresentation->dispose();
}
Poiché il rettangolo rimane collegato a Accent4, il suo colore visibile diventa rosso dopo la modifica del tema. Se sostituisci il colore della tavolozza con un colore diretto sulla forma, le successive modifiche a Accent4 non influenzeranno più quel riempimento.
Usare i colori della tavolozza aggiuntiva
PowerPoint deriva varianti più chiare e più scure da un colore del tema applicando trasformazioni di colore. Aspose.Slides espone queste trasformazioni attraverso l’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:
use aspose\slides\ColorTransformOperation;
use aspose\slides\FillType;
use aspose\slides\Presentation;
use aspose\slides\SaveFormat;
use aspose\slides\SchemeColor;
use aspose\slides\ShapeType;
$presentation = new Presentation();
try {
$slide = $presentation->getSlides()->get_Item(0);
$shape1 = $slide->getShapes()->addAutoShape(ShapeType::Rectangle, 10, 10, 50, 50);
$shape1->getFillFormat()->setFillType(FillType::Solid);
$shape1->getFillFormat()->getSolidFillColor()->setSchemeColor(SchemeColor::Accent4);
$shape2 = $slide->getShapes()->addAutoShape(ShapeType::Rectangle, 10, 70, 50, 50);
$shape2->getFillFormat()->setFillType(FillType::Solid);
$shape2->getFillFormat()->getSolidFillColor()->setSchemeColor(SchemeColor::Accent4);
$shape2->getFillFormat()->getSolidFillColor()->getColorTransform()->add(ColorTransformOperation::MultiplyLuminance, 0.2);
$shape2->getFillFormat()->getSolidFillColor()->getColorTransform()->add(ColorTransformOperation::AddLuminance, 0.8);
$shape3 = $slide->getShapes()->addAutoShape(ShapeType::Rectangle, 10, 130, 50, 50);
$shape3->getFillFormat()->setFillType(FillType::Solid);
$shape3->getFillFormat()->getSolidFillColor()->setSchemeColor(SchemeColor::Accent4);
$shape3->getFillFormat()->getSolidFillColor()->getColorTransform()->add(ColorTransformOperation::MultiplyLuminance, 0.4);
$shape3->getFillFormat()->getSolidFillColor()->getColorTransform()->add(ColorTransformOperation::AddLuminance, 0.6);
$shape4 = $slide->getShapes()->addAutoShape(ShapeType::Rectangle, 10, 190, 50, 50);
$shape4->getFillFormat()->setFillType(FillType::Solid);
$shape4->getFillFormat()->getSolidFillColor()->setSchemeColor(SchemeColor::Accent4);
$shape4->getFillFormat()->getSolidFillColor()->getColorTransform()->add(ColorTransformOperation::MultiplyLuminance, 0.6);
$shape4->getFillFormat()->getSolidFillColor()->getColorTransform()->add(ColorTransformOperation::AddLuminance, 0.4);
$shape5 = $slide->getShapes()->addAutoShape(ShapeType::Rectangle, 10, 250, 50, 50);
$shape5->getFillFormat()->setFillType(FillType::Solid);
$shape5->getFillFormat()->getSolidFillColor()->setSchemeColor(SchemeColor::Accent4);
$shape5->getFillFormat()->getSolidFillColor()->getColorTransform()->add(ColorTransformOperation::MultiplyLuminance, 0.75);
$shape6 = $slide->getShapes()->addAutoShape(ShapeType::Rectangle, 10, 310, 50, 50);
$shape6->getFillFormat()->setFillType(FillType::Solid);
$shape6->getFillFormat()->getSolidFillColor()->setSchemeColor(SchemeColor::Accent4);
$shape6->getFillFormat()->getSolidFillColor()->getColorTransform()->add(ColorTransformOperation::MultiplyLuminance, 0.5);
$presentation->save("theme-color-palette.pptx", SaveFormat::Pptx);
} finally {
$presentation->dispose();
}
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 SchemeColor negli slot di ColorScheme
L’enumerazione SchemeColor utilizza Text1, Background1, Text2 e Background2, mentre lo ColorScheme espone gli stessi slot del tema come Dark1, Light1, Dark2 e Light2. La corrispondenza è 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 principale per le intestazioni e un set secondario per il corpo del testo. I metodi FontScheme.getMajor e FontScheme.getMinor espongono tali set.
Gli identificatori di caratteri compatibili con PowerPoint possono essere usati nella formattazione del testo:
+mn-lt– Carattere corpo Latin (Minor Latin Font)+mj-lt– Carattere intestazione Latin (Major Latin Font)+mn-ea– Carattere corpo East Asian (Minor East Asian Font)+mj-ea– Carattere intestazione East Asian (Major East Asian Font)
L’esempio seguente crea un’intestazione che utilizza il carattere principale Latin del tema e una riga di corpo che utilizza il carattere secondario Latin del tema. Quindi modifica i caratteri del tema e salva il risultato:
use aspose\slides\FontData;
use aspose\slides\Presentation;
use aspose\slides\SaveFormat;
use aspose\slides\ShapeType;
$presentation = new Presentation();
try {
$slide = $presentation->getSlides()->get_Item(0);
$heading = $slide->getShapes()->addAutoShape(ShapeType::Rectangle, 40, 40, 500, 60);
$heading->getTextFrame()->setText("Theme heading");
$heading->getTextFrame()->getParagraphs()->get_Item(0)->getPortions()->get_Item(0)->getPortionFormat()->setLatinFont(new FontData("+mj-lt"));
$body = $slide->getShapes()->addAutoShape(ShapeType::Rectangle, 40, 120, 500, 60);
$body->getTextFrame()->setText("Theme body text");
$body->getTextFrame()->getParagraphs()->get_Item(0)->getPortions()->get_Item(0)->getPortionFormat()->setLatinFont(new FontData("+mn-lt"));
$presentation->getMasterTheme()->getFontScheme()->getMajor()->setLatinFont(new FontData("Aptos Display"));
$presentation->getMasterTheme()->getFontScheme()->getMinor()->setLatinFont(new FontData("Arial"));
$presentation->save("theme-fonts.pptx", SaveFormat::Pptx);
} finally {
$presentation->dispose();
}
L’intestazione segue il carattere principale e il testo del corpo segue il carattere secondario. Il testo che ha un nome di carattere esplicito anziché un identificatore del tema non cambierà automaticamente quando lo schema di caratteri del tema viene modificato.
Le collezioni di caratteri principali e secondari possono anche contenere 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.
Suggerimento
Per ulteriori informazioni sui caratteri nelle presentazioni, vedere PowerPoint Fonts.Copiare o applicare un tema
I flussi di lavoro seguenti risolvono diversi problemi legati ai temi.
Applicare un tema esterno alle diapositive dipendenti da un master
Usa MasterSlide::applyExternalThemeToDependingSlides quando disponi di un file tema di PowerPoint (.thmx) e desideri restylare ogni diapositiva che dipende da un determinato master. Seleziona il master dalla collezione Presentation::getMasters, rappresentata da MasterSlideCollection, e passa il percorso del file tema al metodo.
Il metodo esegue le seguenti operazioni:
- Crea un nuovo master slide basato 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 MasterSlide.
L’esempio seguente applica un tema esterno alle diapositive che dipendono dal primo master e salva la presentazione:
use aspose\slides\Presentation;
use aspose\slides\SaveFormat;
$presentation = new Presentation("presentation.pptx");
try {
$selectedMaster = $presentation->getMasters()->get_Item(0);
$themedMaster = $selectedMaster->applyExternalThemeToDependingSlides("corporate-theme.thmx");
echo "Created master: " . java_values($themedMaster->getName()) . PHP_EOL;
$presentation->save("presentation-with-external-theme.pptx", SaveFormat::Pptx);
} finally {
$presentation->dispose();
}
Un tema non valido, corrotto o non supportato può generare una PptxReadException. Convalida i percorsi forniti dagli utenti, gestisci eventuali errori 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 colori, i caratteri, i riempimenti e altre formattazioni assegnate direttamente possono rimanere invariati. Le sovrascritture a livello di layout e di diapositiva possono anche prevalere 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 la sostituzione dei font.
Questo è un flusso di lavoro 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 diapositiva o layout.
Applicare temi esterni diversi in una presentazione multimasster
Quando il master rilevante non è noto in anticipo, ottienilo da una diapositiva rappresentativa tramite Slide::getLayoutSlide e LayoutSlide::getMasterSlide. Conserva i riferimenti ai master originali prima di applicare i temi, perché 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:
use aspose\slides\Presentation;
use aspose\slides\SaveFormat;
$presentation = new Presentation("multi-master-presentation.pptx");
try {
if (java_values($presentation->getSlides()->size()) < 5) {
echo "The presentation does not contain the expected representative slides." . PHP_EOL;
} else {
$firstGroupMaster = $presentation->getSlides()->get_Item(0)->getLayoutSlide()->getMasterSlide();
$secondGroupMaster = $presentation->getSlides()->get_Item(4)->getLayoutSlide()->getMasterSlide();
if (java_values($firstGroupMaster->getSlideId()) === java_values($secondGroupMaster->getSlideId())) {
echo "The representative slides use the same master." . PHP_EOL;
} else {
$firstThemedMaster = $firstGroupMaster->applyExternalThemeToDependingSlides("blue-theme.thmx");
$secondThemedMaster = $secondGroupMaster->applyExternalThemeToDependingSlides("green-theme.thmx");
echo "First themed master: " . java_values($firstThemedMaster->getName()) . PHP_EOL;
echo "Second themed master: " . java_values($secondThemedMaster->getName()) . PHP_EOL;
$presentation->save("multi-master-with-external-themes.pptx", SaveFormat::Pptx);
}
}
} finally {
$presentation->dispose();
}
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.
Conservare il tema sorgente durante lo spostamento di diapositive
Se desideri spostare una diapositiva in un’altra presentazione mantenendo il design originale, clona il master sorgente nella presentazione di destinazione con MasterSlideCollection.addClone, quindi clona la diapositiva con SlideCollection.addClone e il master clonato. In questo modo il master, i suoi layout e il tema associato vengono trasferiti insieme.
use aspose\slides\Presentation;
use aspose\slides\SaveFormat;
$source = new Presentation("source-theme.pptx");
try {
$target = new Presentation("target.pptx");
try {
$sourceSlide = $source->getSlides()->get_Item(0);
$sourceMaster = $sourceSlide->getLayoutSlide()->getMasterSlide();
$clonedMaster = $target->getMasters()->addClone($sourceMaster);
$target->getSlides()->addClone($sourceSlide, $clonedMaster, true);
$target->save("theme-preserved.pptx", SaveFormat::Pptx);
} finally {
$target->dispose();
}
} finally {
$source->dispose();
}
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 colori, caratteri, sfondi ed effetti guidati dal tema.
Applicare valori del tema a una diapositiva esistente
Se la diapositiva di destinazione deve rimanere sul master e layout attuali, inizializza una sovrascrittura a livello di diapositiva dal tema sorgente. I metodi OverrideTheme.initColorSchemeFrom, OverrideTheme.initFontSchemeFrom e OverrideTheme.initFormatSchemeFrom copiano i tre componenti principali del tema nella sovrascrittura.
use aspose\slides\Presentation;
use aspose\slides\SaveFormat;
$source = new Presentation("source-theme.pptx");
try {
$target = new Presentation("target.pptx");
try {
$targetSlide = $target->getSlides()->get_Item(0);
$overrideTheme = $targetSlide->getThemeManager()->getOverrideTheme();
$overrideTheme->initColorSchemeFrom($source->getMasterTheme()->getColorScheme());
$overrideTheme->initFontSchemeFrom($source->getMasterTheme()->getFontScheme());
$overrideTheme->initFormatSchemeFrom($source->getMasterTheme()->getFormatScheme());
$target->save("theme-applied-to-slide.pptx", SaveFormat::Pptx);
} finally {
$target->dispose();
}
} finally {
$source->dispose();
}
Questo modifica 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 alle diapositive che usano quel layout, a meno che una diapositiva specifica non abbia una propria sovrascrittura. Gli stessi metodi di inizializzazione possono essere utilizzati tramite il LayoutSlideThemeManager:
use aspose\slides\Presentation;
use aspose\slides\SaveFormat;
$source = new Presentation("source-theme.pptx");
try {
$target = new Presentation("target.pptx");
try {
$targetSlide = $target->getSlides()->get_Item(0);
$overrideTheme = $targetSlide->getLayoutSlide()->getThemeManager()->getOverrideTheme();
$overrideTheme->initColorSchemeFrom($source->getMasterTheme()->getColorScheme());
$overrideTheme->initFontSchemeFrom($source->getMasterTheme()->getFontScheme());
$overrideTheme->initFormatSchemeFrom($source->getMasterTheme()->getFormatScheme());
$target->save("theme-applied-to-layout.pptx", SaveFormat::Pptx);
} finally {
$target->dispose();
}
} finally {
$source->dispose();
}
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 necessita di una stilistica diversa, e una sovrascrittura di diapositiva solo per vere eccezioni. Un eccesso di sovrascritture a livello di diapositiva rende più difficile prevedere le modifiche globali al tema.
Aggiornare gli stili di sfondo del tema
Gli sfondi del tema sono memorizzati in FormatScheme.getBackgroundFillStyles. PowerPoint può presentare più scelte di sfondo nella sua interfaccia rispetto al numero di definizioni di riempimento effettivamente memorizzate in questa collezione, perché l’interfaccia può combinare riempimenti di tema con colori di tema e altri riferimenti di stile.

Prima di usare uno stile di sfondo, ispeziona la collezione memorizzata e il valore corrente di 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’indicizzazione diretta della collezione PHP, dove get_Item(0) indica il primo elemento memorizzato. Non assumere che ogni presentazione contenga lo stesso numero di stili di riempimento di sfondo.
L’esempio seguente segnala il conteggio dei riempimenti di sfondo disponibili, assegna un riferimento di sfondo tematico al primo master e salva la presentazione:
use aspose\slides\BackgroundType;
use aspose\slides\Presentation;
use aspose\slides\SaveFormat;
$presentation = new Presentation("input.pptx");
try {
$backgroundStyleCount = java_values($presentation->getMasterTheme()->getFormatScheme()->getBackgroundFillStyles()->size());
echo "Background fill styles: " . $backgroundStyleCount . PHP_EOL;
if ($backgroundStyleCount === 0) {
throw new RuntimeException("The presentation theme does not contain background fill styles.");
}
$masterSlide = $presentation->getMasters()->get_Item(0);
$masterSlide->getBackground()->setType(BackgroundType::Themed);
$masterSlide->getBackground()->setStyleIndex(1);
$presentation->save("theme-background.pptx", SaveFormat::Pptx);
} finally {
$presentation->dispose();
}
Il risultato visibile dipende dalla voce di tema a cui il master fa riferimento e da eventuali sovrascritture di sfondo a livello di layout o diapositiva. Se una diapositiva utilizza un 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’ereditarietà.
Attenzione
Non trattare l’indice di stile come un indice di collezione basato su zero. Evita anche di codificare in modo rigido un numero di stile preso da un file e di presumere che abbia lo stesso aspetto in un altro file; le definizioni di stile del tema sono specifiche della presentazione.Suggerimento
Per la formattazione diretta dello sfondo e l’ereditarietà 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 FormatScheme.getFillStyles, FormatScheme.getLineStyles e FormatScheme.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 invece di presumere un conteggio fisso.

Quando accedi a queste collezioni in PHP, l’indice della collezione è basato su zero: get_Item(0) è il primo stile memorizzato e get_Item(2) è il terzo. Gli indici di riferimento di stile di una forma sono un concetto separato, esposto tramite ShapeStyle. Modificare uno stile del tema influenza le forme che lo riferiscono; le forme con formattazione diretta possono rimanere inalterate.
L’esempio seguente verifica che le voci di stile richieste esistano, modifica il primo stile di linea, modifica il terzo stile di riempimento, abilita un’ombra esterna nel terzo stile di effetto e salva il risultato:
use aspose\slides\FillType;
use aspose\slides\Presentation;
use aspose\slides\SaveFormat;
$presentation = new Presentation("Subtle_Moderate_Intense.pptx");
try {
$formatScheme = $presentation->getMasterTheme()->getFormatScheme();
if (java_values($formatScheme->getLineStyles()->size()) < 1 || java_values($formatScheme->getFillStyles()->size()) < 3 || java_values($formatScheme->getEffectStyles()->size()) < 3) {
throw new RuntimeException("The theme does not contain the style entries required by this example.");
}
$formatScheme->getLineStyles()->get_Item(0)->getFillFormat()->setFillType(FillType::Solid);
$formatScheme->getLineStyles()->get_Item(0)->getFillFormat()->getSolidFillColor()->setColor(java("java.awt.Color")->RED);
$formatScheme->getFillStyles()->get_Item(2)->setFillType(FillType::Solid);
$formatScheme->getFillStyles()->get_Item(2)->getSolidFillColor()->setColor(new Java("java.awt.Color", 34, 139, 34));
$effectFormat = $formatScheme->getEffectStyles()->get_Item(2)->getEffectFormat();
$effectFormat->enableOuterShadowEffect();
$effectFormat->getOuterShadowEffect()->setDistance(10.0);
$presentation->save("theme-effects.pptx", SaveFormat::Pptx);
} finally {
$presentation->dispose();
}
Per le forme che fanno riferimento a questi slot, il primo stile di linea diventa rosso, il terzo stile di riempimento diventa verde foresta solido, e il terzo stile di effetto ottiene un’ombra esterna con distanza di 10 punti. Il risultato visivo esatto dipende comunque da quali slot di stile ogni forma riferisce e se una formattazione diretta sovrascrive il tema.

Determinare se un riempimento solido effettivo utilizza un colore del tema
Un riempimento può essere memorizzato direttamente su un oggetto o ereditato da un paragrafo, layout, master, stile di tema o altro livello di formattazione. Chiama FillFormat::getEffective per risolvere tale gerarchia in dati di riempimento effettivi immutabili. Prima controlla il risultato di getFillType. Solo quando è FillType::Solid dovresti leggere le proprietà del riempimento solido.
Per un riempimento solido, getSolidFillColor restituisce il valore RGB finale renderizzato dopo ereditarietà, ricerca del tema e trasformazioni di colore. Il metodo getSolidFillSchemeColor restituisce lo slot logico corrispondente di SchemeColor, come Text1 o Accent6. Un valore SchemeColor::NotDefined indica che il riempimento solido effettivo non si basa su un colore della tavolozza. In un flusso di lavoro in cui i riempimenti sono o colori del tema o RGB diretti, questo valore identifica un riempimento RGB diretto.
Non utilizzare solo il valore locale di ColorFormat::getSchemeColor 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 del tema e si risolve in Text1 o Accent6. Al contrario, getSolidFillSchemeColor indica quale slot logico del tema ha prodotto il colore effettivo, ma non dice da quale livello (oggetto, paragrafo, layout, master o altro) provenga.
L’esempio seguente carica una presentazione, esamina sia i riempimenti delle forme sia quelli delle porzioni di testo, stampa ogni valore RGB finale e il relativo colore di schema, e segnala i riempimenti solidi che non seguiranno le modifiche ai colori del tema:
use aspose\slides\FillType;
use aspose\slides\Presentation;
use aspose\slides\SchemeColor;
$auditFill = function (string $objectName, $localFill): void {
$effectiveFill = $localFill->getEffective();
if (java_values($effectiveFill->getFillType()) != FillType::Solid) {
echo $objectName . ": fill type = " . java_values($effectiveFill->getFillType()) . "; not a solid fill." . PHP_EOL;
return;
}
$rgb = $effectiveFill->getSolidFillColor();
$effectiveSchemeColor = java_values($effectiveFill->getSolidFillSchemeColor());
$localSchemeColor = java_values($localFill->getSolidFillColor()->getSchemeColor());
echo sprintf("%s: RGB = #%02X%02X%02X", $objectName, java_values($rgb->getRed()), java_values($rgb->getGreen()), java_values($rgb->getBlue())) . PHP_EOL;
echo $objectName . ": local scheme = " . $localSchemeColor . ", effective scheme = " . $effectiveSchemeColor . PHP_EOL;
if ($effectiveSchemeColor == SchemeColor::NotDefined) {
echo $objectName . ": direct RGB or another non-scheme fill; audit as theme-independent." . PHP_EOL;
} else {
echo $objectName . ": theme-dependent through " . $effectiveSchemeColor . "." . PHP_EOL;
}
};
$autoShapeClass = new JavaClass("com.aspose.slides.AutoShape");
$presentation = new Presentation("input.pptx");
try {
$slideCount = java_values($presentation->getSlides()->size());
for ($slideIndex = 0; $slideIndex < $slideCount; $slideIndex++) {
$slide = $presentation->getSlides()->get_Item($slideIndex);
$shapeCount = java_values($slide->getShapes()->size());
for ($shapeIndex = 0; $shapeIndex < $shapeCount; $shapeIndex++) {
$shape = $slide->getShapes()->get_Item($shapeIndex);
$shapeName = "Slide " . ($slideIndex + 1) . ", shape " . ($shapeIndex + 1);
$auditFill($shapeName, $shape->getFillFormat());
if (java_instanceof($shape, $autoShapeClass)) {
$paragraphCount = java_values($shape->getTextFrame()->getParagraphs()->getCount());
for ($paragraphIndex = 0; $paragraphIndex < $paragraphCount; $paragraphIndex++) {
$paragraph = $shape->getTextFrame()->getParagraphs()->get_Item($paragraphIndex);
$portionCount = java_values($paragraph->getPortions()->getCount());
for ($portionIndex = 0; $portionIndex < $portionCount; $portionIndex++) {
$portion = $paragraph->getPortions()->get_Item($portionIndex);
$portionName = $shapeName . ", paragraph " . ($paragraphIndex + 1) . ", portion " . ($portionIndex + 1);
$auditFill($portionName, $portion->getPortionFormat()->getFillFormat());
}
}
}
}
}
} finally {
$presentation->dispose();
}
Il ramo NotDefined fornisce un elenco di audit dei riempimenti solidi che non risponderanno alle modifiche degli slot colore del tema. Rivedi quegli oggetti quando una presentazione deve aderire a una nuova tavolozza di marca. Il valore RGB segnalato mostra ancora l’aspetto attuale, mentre il valore di schema spiega se quell’aspetto è collegato al tema.
Gli oggetti di formato efficace sono istantanee. Dopo aver cambiato il tema della presentazione, una sovrascrittura di tema o qualsiasi formattazione ereditata, chiama nuovamente getEffective e leggi i nuovi dati di riempimento effettivi prima di confrontare o segnalare i colori.
Leggere i valori di tema effettivi
Gli oggetti tema grezzi indicano cosa è definito a un determinato livello. I valori effettivi indicano cosa usa realmente una diapositiva o una forma dopo l’ereditarietà e le sovrascritture locali. Per una diapositiva, chiama BaseOverrideThemeManager.createThemeEffective. Per uno sfondo, usa Background.getEffective, e per un riempimento, usa FillFormat.getEffective.
L’esempio seguente legge il tema effettivo, lo sfondo e il primo riempimento della forma da una diapositiva:
use aspose\slides\FillType;
use aspose\slides\Presentation;
$presentation = new Presentation("input.pptx");
try {
$slide = $presentation->getSlides()->get_Item(0);
$effectiveTheme = $slide->getThemeManager()->createThemeEffective();
$effectiveBackground = $slide->getBackground()->getEffective();
echo "Effective major Latin font: " . $effectiveTheme->getFontScheme()->getMajor()->getLatinFont()->getFontName() . PHP_EOL;
echo "Effective minor Latin font: " . $effectiveTheme->getFontScheme()->getMinor()->getLatinFont()->getFontName() . PHP_EOL;
echo "Effective background fill type: " . java_values($effectiveBackground->getFillFormat()->getFillType()) . PHP_EOL;
if (java_values($slide->getShapes()->size()) > 0) {
$effectiveFill = $slide->getShapes()->get_Item(0)->getFillFormat()->getEffective();
echo "First shape effective fill type: " . java_values($effectiveFill->getFillType()) . PHP_EOL;
if (java_values($effectiveFill->getFillType()) == FillType::Solid) {
$effectiveColor = $effectiveFill->getSolidFillColor();
echo sprintf("First shape effective fill color: A=%d, R=%d, G=%d, B=%d", java_values($effectiveColor->getAlpha()), java_values($effectiveColor->getRed()), java_values($effectiveColor->getGreen()), java_values($effectiveColor->getBlue())) . PHP_EOL;
}
}
} finally {
$presentation->dispose();
}
Usa i dati effettivi per diagnosi di rendering, validazione e confronti. Se ispezioni solo Presentation.getMasterTheme, potresti perdere una sovrascrittura a livello di master, layout, diapositiva o forma che modifica l’aspetto finale.
FAQ
L’applicazione di un tema esterno influisce su tutte le diapositive della presentazione?
No. MasterSlide::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 esistenti.
Qual è il modo più sicuro per trasferire un tema da una presentazione all’altra?
Quando sposti una diapositiva preservandone l’aspetto sorgente, clona il master sorgente nella destinazione e clona la diapositiva con quel master usando MasterSlideCollection.addClone e SlideCollection.addClone. Questo mantiene insieme master, layout e tema.
Come posso vedere i valori effettivi dopo l’ereditarietà e le sovrascritture?
Usa BaseOverrideThemeManager.createThemeEffective per un tema di diapositiva o layout e i metodi corrispondenti di dati effettivi per oggetti di formato come Background.getEffective e FillFormat.getEffective. Queste API restituiscono i valori risolti dopo l’applicazione di ereditarietà e sovrascritture.