Hantera presentationsteman i PHP
Introduktion
Ett presentationstema definierar en samordnad uppsättning färger, teckensnitt, bakgrundsstilar, fyllningar, linjer och effekter. Tema‑medvetna objekt refererar till dessa delade definitioner istället för att lagra varje visuell egenskap som ett fast värde, så en temaförändring kan uppdatera många objekt på en gång.
I Aspose.Slides finns presentationens tema tillgängligt via Presentation.getMasterTheme. En presentation kan också innehålla temaarv på lägre nivåer. En master kan åsidosätta presentationstemat via MasterThemeManager.getOverrideTheme, medan en layout eller en enskild bild kan åsidosätta sitt ärvda tema via BaseOverrideThemeManager.getOverrideTheme. I praktiken löses det effektiva temat för en bild genom denna arvskedja: presentationstema, master‑åsidosättning, layout‑åsidosättning och bild‑åsidosättning.

Avsnitten nedan visar de vanligaste temaarbetssätten: inspektera ett tema, ändra färger och teckensnitt, kopiera eller tillämpa ett tema, uppdatera bakgrunds‑ och effektstilar samt läsa effektiva värden efter att arv och åsidosättningar har lösts.
Inspektera ett tema
MasterTheme‑objektet 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 huvudtemats egenskaper och rapporterar hur många bakgrunds‑, fyllnings‑, linje‑ och effektstilar som lagras i temat:
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();
}
Om en fil använder flera masterobjekt, 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 enum‑typen SchemeColor. När du ändrar motsvarande post i ColorScheme 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:
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();
}
Eftersom rektangeln förblir länkad till Accent4 blir dess synliga färg röd efter att temat ändrats. Om du ersätter schema‑färgen med en direkt färg på formen, kommer senare förä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ärgtransformeringar. Aspose.Slides exponerar dessa transformationer via enum‑typen ColorTransformOperation.

1 – Huvudtemafärger.
2 – Ljusare och mörkare varianter skapade från huvudtemafärgerna.
Följande exempel skapar sex rektanglar baserade på Accent4, applicerar luminans‑transformeringar på fem av dem och sparar resultatet:
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();
}
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 ColorScheme‑platser
Enum‑typen SchemeColor använder Text1, Background1, Text2 och Background2, medan ColorScheme exponerar samma temaplatser som Dark1, Light1, Dark2 och Light2. Mappningen är fast:
Text1=Dark1Background1=Light1Text2=Dark2Background2=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 temafonter
Ett temafontschema innehåller en huvudteckensnittsuppsättning för rubriker och en mindre teckensnittsuppsättning för brödtext. Metoderna FontScheme.getMajor och FontScheme.getMinor exponerar dessa uppsättningar.
PowerPoint‑kompatibla temafont‑identifierare kan användas i textformatering:
+mn-lt– Brödtext Latin (Minor Latin Font)+mj-lt– Rubrik Latin (Major Latin Font)+mn-ea– Brödtext Östasiatisk (Minor East Asian Font)+mj-ea– Rubrik Östasiatisk (Major East Asian Font)
Följande exempel skapar en rubrik som använder det stora Latin‑temafontet och en brödtextrad som använder det lilla Latin‑temafontet. Därefter ändras temafontsen och resultatet sparas:
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();
}
Rubriken följer det stora teckensnittet och brödtexten följer det lilla teckensnittet. Text som har ett explicit teckensnittsnamn istället för en temabaserad identifierare byter inte automatiskt när temafont‑schemat förändras.
De stora och små teckensnittssamlingarna kan också innehålla teckensnittsmappningar för enskilda skriftsystem, såsom kyrilliska, arabiska, japanska, georgiska och thaana. För att inspektera, lägga till, ersätta eller ta bort dessa mappningar, se Script‑Specific Theme Fonts.
Tips
För mer information om presentationsfonter, se PowerPoint‑fonter.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 MasterSlide::applyExternalThemeToDependingSlides när du har en PowerPoint‑temafil (.thmx) och vill omstyla varje bild som beror på en viss master. Välj master från samlingen Presentation::getMasters, som representeras av MasterSlideCollection, och skicka temafilens sökväg till metoden.
Metoden utför följande operationer:
- Skapar en ny masterslide baserad på den valda mastern.
- Tillämpa det externa temat på den nya mastern.
- Tilldela den nya mastern till alla bilder som tidigare berodde på den valda mastern.
- Returnerar den nyss skapade MasterSlide.
Följande exempel tillämpar ett externt tema på de bilder som beror på den första mastern och sparar presentationen:
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();
}
Ett ogiltigt, korrupt eller ej stödd tema kan orsaka PptxReadException. Validera sökvägar som anges av användare, hantera misslyckade filsystem‑åtkomster och spara presentationen först efter att temat har tillämpats framgångsrikt.
Endast de bilder som berodde på den valda mastern omplaceras. Bilder som är kopplade till andra master‑objekt behåller sina befintliga master‑ och temainställningar. Tema‑medvetna färger, fonter, fyllningar, linjer, bakgrunder och effekter löses mot det externa temat. Direkt tilldelade färger, fonter, fyllningar och annan explicit formatering kan förbli oförändrade. Åsidosättningar på layout‑ och bildnivå kan också ha företräde framför värden som ärvts från den nya mastern.
Temat kan referera till fonter som inte finns i körmiljön. För konsekvent rendering och export, installera de nödvändiga fontarna, 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 inte att du manuellt skapar tema‑åsidosättningar på bild‑ eller layoutnivå.
Tillämpa olika externa teman i en presentation med flera masterobjekt
När den relevanta mastern inte är känd i förväg, hämta den från en representativ bild via Slide::getLayoutSlide och LayoutSlide::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å sektioner för att lokalisera deras master‑objekt och tillämpar ett annat externt tema på varje grupp:
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();
}
Det första anropet påverkar endast de bilder som berodde på $firstGroupMaster, och det andra anropet påverkar endast de bilder som berodde på $secondGroupMaster. Bilder som tillhör någon annan master återstylingas 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‑mastern till mål‑presentationen med MasterSlideCollection.addClone, klona sedan bilden med SlideCollection.addClone och den klonade mastern. Detta för med master‑objektet, dess layouter och det tillhörande temat.
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();
}
Detta är det föredragna arbetsflödet när källbilden måste se likadan ut i destinationen. Att bara klona innehåll till en orelaterad destinations‑master kan ändra temadrivna färger, fonter, bakgrunder och effekter.
Tillämpa temavärden på en befintlig bild
Om mål‑bilden måste ligga kvar på sin nuvarande master och layout, 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.
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();
}
Detta ändrar temat som används av den bilden 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 ett temaarv på en layout
En layout‑nivå‑åsidosättning gäller för bilder som använder den layouten, såvida inte en specifik bild har sin egen åsidosättning. Samma initieringsmetoder kan användas via 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();
}
Använd ett master‑ eller presentation‑nivå‑tema när många layouter och bilder ska dela samma grunddesign, en layout‑åsidosättning när en layout‑familj behöver annan styling, och en bild‑åsidosättning endast för verkliga undantag. Överdrivna bild‑nivå‑åsidosättningar gör senare globala temaförändringar svårare att förutsäga.
Uppdatera temats bakgrundsstilar
Temats bakgrundsfyllningar lagras i FormatScheme.getBackgroundFillStyles. PowerPoint kan presentera fler bakgrundsalternativ i sitt UI än antalet fyllningsdefinitioner som faktiskt lagras i denna samling, eftersom UI kan kombinera temafyllningar med temafärger och andra stilreferenser.

Innan du använder en bakgrundsstil, inspektera den lagrade samlingen och det aktuella Background.getStyleIndex. En stil‑index på 0 betyder ingen tematisk fyllning; positiva värden är referenser till temats bakgrundsstil. Detta skiljer sig från att indexera PHP‑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 tematisk bakgrundsreferens till den första mastern och sparar presentationen:
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();
}
Det synliga resultatet beror på temaposten som refereras av mastern och på eventuella bakgrunds‑åsidosättningar på layout‑ eller bildnivå. Om en bild använder sin egen bakgrund, kanske en ändring av endast master‑bakgrunden inte påverkar den bilden. Använd Background.getEffective när du behöver veta den slutgiltiga bakgrunden efter att arv har tillämpats.
Varning
Behandla inte stilindexen som ett nollbaserat samlingsindex. Undvik också att hårdkoda ett stilnummer från en fil och anta att det har samma utseende i en annan fil; temastilsdefinitioner är presentationsspecifika.Tips
För direkt bakgrundsformatering och bakgrundsärvning, se Presentationens bakgrund.Uppdatera temaeffekter
Ett temas format‑schema innehåller separata fyllnings‑, linje‑ och effektstilsamlingar som exponeras via FormatScheme.getFillStyles, FormatScheme.getLineStyles och FormatScheme.getEffectStyles. Vanliga Office‑teman innehåller ofta tre huvudsakliga stilposter 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.

När du får åtkomst till dessa samlingar i PHP är samlingsindexet nollbaserat: get_Item(0) är den första lagrade stilen och get_Item(2) är den tredje. En formens stil‑referensindex är ett separat begrepp, exponerat via ShapeStyle. Att ändra 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 erforderliga stilposterna finns, ändrar den första linjestilen, ändrar den tredje fyllningsstilen, aktiverar ett yttre skugga i den tredje effektstilen och sparar resultatet:
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();
}
För former som refererar till dessa platser blir den första temalinjestilen röd, den tredje temafyllningsstilen en 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 stilplatser varje form refererar till och om direkt formatering åsidosätter temat.

Bestäm 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 FillFormat::getEffective för att lösa den hierarkin till ett oföränderligt effektivt fyllningsdata. Kontrollera först dess getFillType‑resultat. Endast när det är FillType::Solid bör du läsa de solida fyllningsegenskaperna.
För en solid fyllning returnerar getSolidFillColor det slutgiltiga renderade RGB‑värdet efter arv, temauppslagning och färgtransformeringar. Metoden getSolidFillSchemeColor returnerar motsvarande logiska SchemeColor-plats, såsom Text1 eller Accent6. Ett värde av SchemeColor::NotDefined betyder att den effektiva solida fyllningen inte är baserad på en schemafärg. I ett arbetsflöde där fyllningar antingen är temafärger eller direkta RGB‑färger identifierar detta värde en direkt RGB‑fyllning.
Använd inte enbart det lokala värdet från ColorFormat::getSchemeColor för att klassificera en fyllning. Till exempel kan en textdel sakna lokalt definierad schemafärg, så dess lokala värde är NotDefined, medan dess effektiva fyllning ärvs av en temafärg och löser till Text1 eller Accent6. Omvänt visar getSolidFillSchemeColor vilken logisk temaplatsslot som producerade den effektiva färgen, men den anger inte om den slottet kom från objektet, stycket, layouten, mastern eller en annan nivå i formateringshierarkin.
Följande exempel läser in en presentation, granskar både form‑fyllningar och text‑del‑fyllningar, skriver ut varje slutgiltigt RGB‑värde och tillhörande schemafärg, samt flaggar solida fyllningar som inte kommer att följa temafärgsändringar:
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();
}
Grenen NotDefined ger en granskningslista över solida fyllningar som inte kommer att reagera på förändringar i temafärgs‑slotar. 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 schemavärdet förklarar huruvida det utseendet är kopplat till temat.
Effektiva format‑objekt är ögonblicksbilder. Efter att ha ändrat presentationstemat, ett tema‑override eller någon ärvd formatering, anropa getEffective igen och läs nya effektiva fyllningsdata innan du jämför eller rapporterar färger.
Läs effektiva temavärden
Råa tema‑objekt 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 har 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 form‑fyllningen från en bild:
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();
}
Använd effektiva data för renderingsdiagnostik, validering och jämförelser. Om du bara inspekterar Presentation.getMasterTheme, kan du missa ett master‑, layout‑, bild‑ eller form‑override som förändrar det slutgiltiga utseendet.
Vanliga frågor
Påverkar tillämpning av ett externt tema varje bild i presentationen?
Nej. MasterSlide::applyExternalThemeToDependingSlides omfördelar endast de bilder som beror på den valda mastern. Bilder som använder andra master‑objekt behåller sina befintliga teman.
Kan jag tillämpa ett tema på en enskild bild utan att ändra master?
Ja. Använd bildens SlideThemeManager och initiera dess override‑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 bevarar dess källutseende, klona käll‑mastern till destinationen och klona bilden med den mastern med MasterSlideCollection.addClone och SlideCollection.addClone. Detta behåller master, layouter och tema 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 de motsvarande effektiva‑data‑metoderna 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.