Zarządzanie motywami prezentacji w Javie
Wprowadzenie
Motyw prezentacji definiuje skoordynowany zestaw kolorów, czcionek, stylów tła, wypełnień, linii i efektów. Obiekty świadome motywu odwołują się do tych współdzielonych definicji zamiast przechowywać każdą właściwość wizualną jako stałą wartość, dzięki czemu zmiana motywu może jednocześnie zaktualizować wiele obiektów.
W Aspose.Slides motyw na poziomie prezentacji jest dostępny poprzez Presentation.getMasterTheme. Prezentacja może również zawierać nadpisania motywu na niższych poziomach. Master może nadpisać motyw prezentacji poprzez MasterThemeManager.getOverrideTheme, podczas gdy układ lub pojedynczy slajd może nadpisać odziedziczony motyw poprzez BaseOverrideThemeManager.getOverrideTheme. W praktyce skuteczny motyw dla slajdu jest rozwiązywany w łańcuchu dziedziczenia: motyw prezentacji, nadpisanie mastera, nadpisanie układu i nadpisanie slajdu.

Poniższe sekcje przedstawiają najczęstsze przepływy pracy z motywami: przeglądanie motywu, zmiana kolorów i czcionek, kopiowanie lub zastosowanie motywu, aktualizacja stylów tła i efektów oraz odczytywanie wartości skutecznych po rozwiązywaniu dziedziczenia i nadpisań.
Przeglądanie motywu
Obiekt MasterTheme udostępnia schemat kolorów, schemat czcionek i schemat formatowania motywu poprzez MasterTheme.getColorScheme, MasterTheme.getFontScheme i MasterTheme.getFormatScheme. Przeglądanie tych kolekcji przed ich modyfikacją jest szczególnie przydatne, gdy prezentacja pochodzi ze zewnętrznego źródła, ponieważ liczba i zawartość wpisów stylów mogą się różnić.
Poniższy przykład odczytuje główne właściwości motywu i raportuje, ile stylów tła, wypełnień, linii i efektów jest przechowywanych w motywie:
import com.aspose.slides.*;
Presentation presentation = new Presentation("input.pptx");
try {
IMasterTheme theme = presentation.getMasterTheme();
System.out.println("Theme name: " + theme.getName());
System.out.println("Accent 1: " + theme.getColorScheme().getAccent1().getColor());
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();
}
Jeśli plik używa wielu masterów, nie zakładaj, że każdy slajd ma taki sam skuteczny motyw. Przejrzyj master powiązany ze slajdem i użyj przepływu pracy ze skutecznym motywem przedstawionego później w tym artykule, gdy mogą występować nadpisania układu lub slajdu.
Zmiana kolorów motywu
Wypełnienia, linie i tekst świadome motywu mogą odwoływać się do logicznego koloru z wyliczenia SchemeColor. Gdy zmienisz odpowiedni wpis w IColorScheme, wszystkie obiekty, które nadal odwołują się do tego koloru motywu, są rozwiązywane względem nowej wartości. Obiekty używające bezpośredniego koloru RGB nie są zmieniane przez aktualizację koloru motywu.
Poniższy przykład end‑to‑end tworzy kształt używający Accent4, zmienia kolor Accent4 motywu na czerwony, zapisuje prezentację, otwiera ją ponownie i wypisuje skuteczny kolor wypełnienia:
import com.aspose.slides.*;
import java.awt.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();
System.out.println("Effective fill color: " + effectiveFill.getSolidFillColor());
} finally {
savedPresentation.dispose();
}
Ponieważ prostokąt pozostaje powiązany z Accent4, jego widoczny kolor staje się czerwony po zmianie motywu. Jeśli zamienisz kolor schematu na bezpośredni kolor w kształcie, późniejsze zmiany Accent4 nie będą już wpływać na to wypełnienie.
Użyj kolorów z dodatkowej palety
PowerPoint generuje jaśniejsze i ciemniejsze warianty koloru motywu, stosując przekształcenia kolorów. Aspose.Slides udostępnia te przekształcenia poprzez wyliczenie ColorTransformOperation.

1 - Główne kolory motywu.
2 - Jaśniejsze i ciemniejsze warianty wygenerowane z głównych kolorów motywu.
Poniższy przykład tworzy sześć prostokątów opartych na Accent4, stosuje przekształcenia luminancji do pięciu z nich i zapisuje wynik:
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();
}
Te warianty pozostają oparte na kolorze motywu. Jeśli Accent4 zmieni się później, przekształcone kolory zostaną przeliczone na podstawie nowej wartości Accent4.
Mapowanie wartości SchemeColor na miejsca w IColorScheme
Wyliczenie SchemeColor używa Text1, Background1, Text2 i Background2, podczas gdy IColorScheme udostępnia te same miejsca motywu jako Dark1, Light1, Dark2 i Light2. Mapowanie jest stałe:
Text1=Dark1Background1=Light1Text2=Dark2Background2=Light2
Są to alternatywne nazwy tych samych miejsc w motywie; nie są to wartości dynamicznie konwertowane z jednej formy na drugą.
Zmiana czcionek motywu
Schemat czcionek motywu zawiera zestaw głównych czcionek dla nagłówków oraz zestaw pomocniczych czcionek dla tekstu podstawowego. Metody IFontScheme.getMajor i IFontScheme.getMinor udostępniają te zestawy.
Identyfikatory czcionek motywu zgodne z PowerPoint można używać w formatowaniu tekstu:
+mn-lt– Czcionka podstawowa Latin (Minor Latin Font)+mj-lt– Czcionka nagłówka Latin (Major Latin Font)+mn-ea– Czcionka podstawowa East Asian (Minor East Asian Font)+mj-ea– Czcionka nagłówka East Asian (Major East Asian Font)
Poniższy przykład tworzy jeden nagłówek używający głównej czcionki Latin oraz jedną linię tekstu podstawowego używającą pomocniczej czcionki Latin. Następnie zmienia czcionki motywu i zapisuje wynik:
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();
}
Nagłówek podąża za czcionką główną, a tekst podstawowy za czcionką pomocniczą. Tekst, który ma wyraźnie określoną nazwę czcionki zamiast identyfikatora motywu, nie przełączy się automatycznie po zmianie schematu czcionek motywu.
Zbiory czcionek głównych i pomocniczych mogą również zawierać mapowania czcionek dla poszczególnych systemów pisma, takich jak cyrylica, arabski, japoński, gruziński i thaana. Aby przeglądać, dodawać, zamieniać lub usuwać te mapowania, zobacz Czcionki motywu specyficzne dla skryptu.
Porada
Więcej informacji o czcionkach w prezentacji znajdziesz w sekcji Czcionki PowerPoint.Kopiowanie lub zastosowanie motywu
Poniższe przepływy rozwiązują różne problemy związane z motywami.
Zastosowanie zewnętrznego motywu do slajdów zależnych od mastera
Użyj IMasterSlide.applyExternalThemeToDependingSlides gdy masz plik motywu PowerPoint (.thmx) i chcesz przestylizować każdy slajd zależny od konkretnego mastera. Wybierz master z kolekcji Presentation.getMasters, która implementuje IMasterSlideCollection, i przekaż ścieżkę do pliku motywu metodzie.
Metoda wykonuje następujące operacje:
- Tworzy nowy slajd master oparty na wybranym masterze.
- Zastosowuje zewnętrzny motyw do nowego mastera.
- Przypisuje nowego mastera wszystkim slajdom, które wcześniej zależały od wybranego mastera.
- Zwraca nowo utworzony IMasterSlide.
Poniższy przykład stosuje zewnętrzny motyw do slajdów zależnych od pierwszego mastera i zapisuje prezentację:
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();
}
Nieprawidłowy, uszkodzony lub nieobsługiwany motyw może spowodować PptxReadException. Waliduj ścieżki podawane przez użytkowników, obsługuj błędy dostępu do systemu plików i zapisuj prezentację dopiero po pomyślnym zastosowaniu motywu.
Tylko slajdy zależne od wybranego mastera są ponownie przypisywane. Slajdy powiązane z innymi masterami zachowują swoje dotychczasowe mastery i motywy. Kolory, czcionki, wypełnienia, linie, tła i efekty świadome motywu są rozwiązywane względem zewnętrznego motywu. Bezpośrednio przypisane kolory, czcionki, wypełnienia i inne formatowanie mogą pozostać niezmienione. Nadpisania na poziomie układu i slajdu mogą również mieć pierwszeństwo przed wartościami odziedziczonymi z nowego mastera.
Motyw może odwoływać się do czcionek, które nie są dostępne w środowisku uruchomieniowym. Dla spójnego renderowania i eksportu zainstaluj wymagane czcionki, udostępnij je poprzez niestandardowe źródła czcionek, lub skonfiguruj zastępowanie czcionek.
To jest bezpośredni przepływ na poziomie mastera: metoda przyjmuje ścieżkę do pliku .thmx i nie wymaga ręcznego tworzenia nadpisań motywu na poziomie slajdu lub układu.
Zastosowanie różnych zewnętrznych motywów w prezentacji z wieloma masterami
Gdy odpowiedni master nie jest znany z góry, pobierz go z reprezentatywnego slajdu przy pomocy ISlide.getLayoutSlide i ILayoutSlide.getMasterSlide. Przechowaj oryginalne odwołania do masterów przed zastosowaniem jakichkolwiek motywów, ponieważ każde wywołanie tworzy kolejny master w prezentacji.
Poniższy przykład używa slajdów z dwóch sekcji, aby zlokalizować ich mastery i stosuje inny zewnętrzny motyw do każdej grupy:
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();
}
Pierwsze wywołanie wpływa tylko na slajdy zależne od firstGroupMaster, a drugie wywołanie wpływa tylko na slajdy zależne od secondGroupMaster. Slajdy należące do innego mastera nie zostaną przestylizowane.
Zachowanie źródłowego motywu przy przenoszeniu slajdów
Jeśli chcesz przenieść slajd do innej prezentacji i zachować jego pierwotny wygląd, sklonuj źródłowy master do prezentacji docelowej przy pomocy IMasterSlideCollection.addClone, a następnie sklonuj slajd z ISlideCollection.addClone i sklonowanym masterem. To przenosi master, jego układy oraz powiązany motyw razem.
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();
}
Jest to preferowany przepływ, gdy źródłowy slajd musi wyglądać identycznie w miejscu docelowym. Proste kopiowanie treści na niepowiązany master docelowy może zmienić kolory, czcionki, tła i efekty sterowane przez motyw.
Zastosowanie wartości motywu do istniejącego slajdu
Jeśli docelowy slajd musi pozostać na bieżącym masterze i układzie, zainicjuj nadpisanie na poziomie slajdu z motywu źródłowego. Metody OverrideTheme.initColorSchemeFrom, OverrideTheme.initFontSchemeFrom i OverrideTheme.initFormatSchemeFrom kopiują trzy główne komponenty motywu do nadpisania.
import com.aspose.slides.*;
Presentation source = new Presentation("source-theme.pptx");
try {
Presentation target = new Presentation("target.pptx");
try {
ISlide targetSlide = presentation.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();
}
To zmienia motyw używany przez ten slajd bez zmiany motywu dziedziczonego przez inne slajdy. Aby usunąć lokalne nadpisanie i powrócić do wartości dziedziczonych, wywołaj OverrideTheme.clear.
Zastosowanie nadpisania motywu do układu
Nadpisanie na poziomie układu dotyczy slajdów używających tego układu, chyba że konkretny slajd ma własne nadpisanie. Te same metody inicjalizacji można użyć przez LayoutSlideThemeManager:
import com.aspose.slides.*;
Presentation source = new Presentation("source-theme.pptx");
try {
Presentation target = new Presentation("target.pptx");
try {
ISlide targetSlide = presentation.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();
}
Użyj motywu na poziomie mastera lub prezentacji, gdy wiele układów i slajdów ma współdzielić tę samą bazową konstrukcję, nadpisania układu, gdy jedna rodzina układów wymaga innego stylu, oraz nadpisania slajdu tylko w rzeczywistych wyjątkach. Nadmierna liczba nadpisań na poziomie slajdu utrudnia późniejsze globalne zmiany motywu.
Aktualizacja stylów tła motywu
Wypełnienia tła motywu są przechowywane w IFormatScheme.getBackgroundFillStyles. PowerPoint może prezentować w interfejsie więcej opcji tła niż faktyczna liczba definicji wypełnień przechowywanych w tej kolekcji, ponieważ UI może łączyć wypełnienia motywu z kolorami motywu i innymi odniesieniami stylów.

Przed użyciem stylu tła przejrzyj przechowywaną kolekcję i aktualny Background.getStyleIndex. Indeks stylu 0 oznacza brak wypełnienia motywowego; wartości dodatnie są odniesieniami do stylu tła motywu. Jest to inne niż indeksowanie kolekcji Java, gdzie get_Item(0) oznacza pierwszy przechowywany element. Nie zakładaj, że każda prezentacja zawiera taką samą liczbę stylów wypełnienia tła.
Poniższy przykład raportuje dostępny licznik wypełnień tła, przypisuje odniesienie do motywowego tła pierwszemu masterowi i zapisuje prezentację:
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();
}
Widoczny rezultat zależy od wpisu motywu, do którego odwołuje się master, oraz od wszelkich nadpisań tła na poziomie układu lub slajdu. Jeśli slajd używa własnego tła, zmiana samego tła mastera nie musi wpływać na ten slajd. Użyj Background.getEffective gdy potrzebujesz znać ostateczne tło po zastosowaniu dziedziczenia.
Ostrzeżenie
Nie traktuj indeksu stylu jako indeksu kolekcji zaczynającego się od zera. Unikaj także twardego kodowania numeru stylu z jednego pliku i zakładania, że będzie miał taki sam wygląd w innym pliku; definicje stylów motywu są specyficzne dla prezentacji.Porada
Więcej informacji o bezpośrednim formatowaniu tła i dziedziczeniu tła znajdziesz w sekcji Tło prezentacji.Aktualizacja efektów motywu
Schemat formatowania motywu zawiera osobne kolekcje stylów wypełnień, linii i efektów udostępniane przez IFormatScheme.getFillStyles, IFormatScheme.getLineStyles i IFormatScheme.getEffectStyles. Typowe motywy Office często zawierają trzy główne wpisy stylów, które wizualnie odpowiadają subtelnemu, umiarkowanemu i intensywnemu formatowaniu, ale kod powinien sprawdzać każdą kolekcję zamiast zakładać stałą liczbę.

Gdy uzyskujesz dostęp do tych kolekcji w Javie, indeks kolekcji jest zerowo‑indeksowany: get_Item(0) to pierwszy przechowywany styl, a get_Item(2) to trzeci. Indeksy odwołań stylu kształtu to odrębny koncept, udostępniany przez IShapeStyle. Modyfikacja stylu motywu wpływa na kształty, które odwołują się do tego stylu; kształty z bezpośrednim formatowaniem mogą pozostać niezmienione.
Poniższy przykład sprawdza, czy wymagane wpisy stylów istnieją, zmienia pierwszy styl linii, zmienia trzeci styl wypełnienia, włącza zewnętrzny cień w trzecim stylu efektu i zapisuje wynik:
import com.aspose.slides.*;
import java.awt.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(new Color(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();
}
Dla kształtów, które odwołują się do tych miejsc, pierwszy styl linii motywu staje się czerwony, trzeci styl wypełnienia motywu staje się jednolitym zielonym leśnym, a trzeci styl efektu zyskuje zewnętrzny cień o odległości 10 punktów. Dokładny wygląd nadal zależy od tego, które miejsca stylów odwołuje każdy kształt i czy bezpośrednie formatowanie nadpisuje motyw.

Określenie, czy skuteczne wypełnienie jednolite używa koloru motywu
Wypełnienie może być przechowywane bezpośrednio na obiekcie lub dziedziczone z akapitu, układu, mastera, stylu motywu lub innego poziomu formatowania. Wywołaj IFillFormat.getEffective aby rozwiązać tę hierarchię w niezmienny IFillFormatEffectiveData. Najpierw sprawdź IFillFormatEffectiveData.getFillType. Tylko gdy jest FillType.Solid, powinieneś odczytać właściwości wypełnienia jednolitego.
Dla wypełnienia jednolitego, IFillFormatEffectiveData.getSolidFillColor zwraca ostateczną wartość RGB po dziedziczeniu, wyszukiwaniu w motywie i zastosowanych przekształceniach kolorów. IFillFormatEffectiveData.getSolidFillSchemeColor zwraca odpowiadające logiczne miejsce SchemeColor, takie jak Text1 lub Accent6. Wartość SchemeColor.NotDefined oznacza, że skuteczne wypełnienie jednolite nie opiera się na kolorze schematu. W przepływie, w którym wypełnienia są albo kolorami motywu, albo bezpośrednimi kolorami RGB, ta wartość identyfikuje wypełnienie RGB.
Nie używaj wyłącznie lokalnej wartości IColorFormat.getSchemeColor do klasyfikacji wypełnienia. Na przykład fragment tekstu może nie mieć lokalnie zdefiniowanego koloru schematu, więc jego lokalna wartość to NotDefined, podczas gdy jego skuteczne wypełnienie dziedziczy kolor motywu i rozwiązuje się do Text1 lub Accent6. Odwrotnie, getSolidFillSchemeColor informuje, które logiczne miejsce motywu wygenerowało skuteczny kolor, ale nie mówi, z którego poziomu (obiekt, akapit, układ, master, itp.) pochodzi to miejsce.
Poniższy przykład ładuje prezentację, audytuje zarówno wypełnienia kształtów, jak i wypełnienia fragmentów tekstu, wypisuje każdą ostateczną wartość RGB i powiązany kolor schematu oraz oznacza wypełnienia jednolite, które nie będą śledzić zmian kolorów motywu:
import com.aspose.slides.*;
import java.awt.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;
}
Color rgb = effectiveFill.getSolidFillColor();
int effectiveSchemeColor = effectiveFill.getSolidFillSchemeColor();
int localSchemeColor = localFill.getSolidFillColor().getSchemeColor();
System.out.printf("%s: RGB = #%02X%02X%02X%n", objectName, rgb.getRed(), rgb.getGreen(), rgb.getBlue());
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();
}
Gałąź NotDefined dostarcza listę audytu wypełnień jednolitych, które nie będą reagować na zmiany w slotach kolorów motywu. Przejrzyj te obiekty, gdy prezentacja musi odpowiadać nowej palecie brandu. Zgłoszona wartość RGB nadal pokazuje aktualny wygląd, podczas gdy wartość schematu wyjaśnia, czy ten wygląd jest połączony z motywem.
Obiekty skutecznego formatu są migawkami. Po zmianie motywu prezentacji, nadpisania motywu lub dowolnego formatowania dziedziczonego, wywołaj ponownie getEffective i odczytaj nowy obiekt IFillFormatEffectiveData przed porównaniem lub raportowaniem kolorów.
Odczyt skutecznych wartości motywu
Surowe obiekty motywu mówią, co jest zdefiniowane na danym poziomie. Skuteczne wartości mówią, co slajd lub kształt faktycznie używa po rozwiązywaniu dziedziczenia i lokalnych nadpisań. Dla slajdu wywołaj BaseOverrideThemeManager.createThemeEffective. Dla tła użyj Background.getEffective, a dla wypełnienia FillFormat.getEffective.
Poniższy przykład odczytuje skuteczny motyw, tło i pierwsze wypełnienie kształtu ze slajdu:
import com.aspose.slides.*;
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) {
System.out.println("First shape effective fill color: " + effectiveFill.getSolidFillColor());
}
}
} finally {
presentation.dispose();
}
Używaj danych skutecznych do diagnostyki renderowania, walidacji i porównań. Jeśli przeglądasz tylko Presentation.getMasterTheme, możesz przeoczyć master, układ, slajd lub nadpisanie kształtu, które zmienia ostateczny wygląd.
FAQ
Czy zastosowanie zewnętrznego motywu wpływa na każdy slajd w prezentacji?
Nie. IMasterSlide.applyExternalThemeToDependingSlides przypisuje tylko slajdy zależne od wybranego mastera. Slajdy używające innych masterów zachowują istniejące motywy.
Czy mogę zastosować motyw do pojedynczego slajdu bez zmiany mastera?
Tak. Użyj SlideThemeManager slajdu i zainicjuj jego nadpisanie motywu. Zmiana pozostaje lokalna dla tego slajdu; inne slajdy nadal dziedziczą swoje istniejące motywy.
Jaki jest najbezpieczniejszy sposób przeniesienia motywu z jednej prezentacji do drugiej?
Podczas przenoszenia slajdu i zachowania jego pierwotnego wyglądu, sklonuj źródłowy master do docelowej prezentacji i sklonuj slajd z tym masterem przy pomocy IMasterSlideCollection.addClone oraz ISlideCollection.addClone. To utrzymuje master, układy i motyw razem.
Jak mogę zobaczyć skuteczne wartości po dziedziczeniu i nadpisaniach?
Użyj BaseOverrideThemeManager.createThemeEffective dla slajdu lub układu oraz odpowiednich metod zwracających dane skuteczne dla obiektów formatowania, takich jak Background.getEffective i FillFormat.getEffective. Te interfejsy zwracają rozwiązywane wartości po zastosowaniu dziedziczenia i nadpisań.