Zarządzanie motywami prezentacji PowerPoint w Pythonie
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ólnych definicji zamiast przechowywać każdą właściwość wizualną jako stałą wartość, dzięki czemu zmiana motywu może zaktualizować wiele obiektów jednocześnie.
W Aspose.Slides motyw na poziomie prezentacji jest dostępny poprzez właściwość Presentation.master_theme. Prezentacja może także zawierać nadpisania motywu na niższych poziomach. Master może nadpisać motyw prezentacji za pomocą MasterThemeManager.override_theme, układ może nadpisać odziedziczony motyw za pomocą BaseOverrideThemeManager.override_theme, a pojedynczy slajd może zrobić to samo. W praktyce skuteczny motyw slajdu jest rozwiązywany w następującym łańcuchu dziedziczenia: motyw prezentacji, nadpisanie mastera, nadpisanie układu i nadpisanie slajdu.

Poniższe sekcje przedstawiają najczęstsze scenariusze związane z motywem: inspekcję motywu, zmianę kolorów i czcionek, kopiowanie lub zastosowanie motywu, aktualizację stylów tła i efektów oraz odczyt skutecznych wartości po rozpatrzeniu dziedziczenia i nadpisań.
Inspekcja motywu
Obiekt MasterTheme udostępnia własności color_scheme, font_scheme i format_scheme. Inspekcja tych kolekcji przed ich modyfikacją jest szczególnie przydatna, gdy prezentacja pochodzi ze źródła zewnętrznego, ponieważ liczba i zawartość wpisów stylów mogą się różnić.
Poniższy przykład odczytuje główne własności motywu i raportuje, ile stylów tła, wypełnień, linii i efektów jest przechowywanych w motywie:
import aspose.slides as slides
with slides.Presentation("input.pptx") as presentation:
theme = presentation.master_theme
print(f"Theme name: {theme.name}")
print(f"Accent 1: {theme.color_scheme.accent1.color}")
print(f"Major Latin font: {theme.font_scheme.major.latin_font.font_name}")
print(f"Minor Latin font: {theme.font_scheme.minor.latin_font.font_name}")
print(f"Background fill styles: {len(theme.format_scheme.background_fill_styles)}")
print(f"Fill styles: {len(theme.format_scheme.fill_styles)}")
print(f"Line styles: {len(theme.format_scheme.line_styles)}")
print(f"Effect styles: {len(theme.format_scheme.effect_styles)}")
Jeśli plik używa wielu masterów, nie zakładaj, że każdy slajd ma taki sam skuteczny motyw. Zbadaj master powiązany ze slajdem i użyj przepływu pracy „skuteczny motyw” przedstawionego dalej 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 ColorScheme motywu, wszystkie obiekty nadal odwołujące się do tego koloru motywu zostaną rozwiążone względem nowej wartości. Obiekty używające bezpośredniego koloru RGB nie zostaną zmienione 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 aspose.pydrawing as draw
import aspose.slides as slides
with slides.Presentation() as presentation:
slide = presentation.slides[0]
shape = slide.shapes.add_auto_shape(slides.ShapeType.RECTANGLE, 10, 10, 100, 100)
shape.fill_format.fill_type = slides.FillType.SOLID
shape.fill_format.solid_fill_color.scheme_color = slides.SchemeColor.ACCENT4
presentation.master_theme.color_scheme.accent4.color = draw.Color.red
presentation.save("theme-color.pptx", slides.export.SaveFormat.PPTX)
with slides.Presentation("theme-color.pptx") as saved_presentation:
saved_slide = saved_presentation.slides[0]
saved_shape = saved_slide.shapes[0]
effective_fill = saved_shape.fill_format.get_effective()
print(f"Effective fill color: {effective_fill.solid_fill_color}")
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życie kolorów z dodatkowej palety
PowerPoint generuje jaśniejsze i ciemniejsze warianty z koloru motywu, stosując transformacje kolorów. Aspose.Slides udostępnia te transformacje poprzez wyliczenie ColorTransformOperation.

1 – Główne kolory motywu.
2 – Jaśniejsze i ciemniejsze warianty wyprodukowane z głównych kolorów motywu.
Poniższy przykład tworzy sześć prostokątów opartych na ACCENT4, stosuje transformacje luminancji do pięciu z nich i zapisuje wynik:
import aspose.slides as slides
with slides.Presentation() as presentation:
slide = presentation.slides[0]
shape1 = slide.shapes.add_auto_shape(slides.ShapeType.RECTANGLE, 10, 10, 50, 50)
shape1.fill_format.fill_type = slides.FillType.SOLID
shape1.fill_format.solid_fill_color.scheme_color = slides.SchemeColor.ACCENT4
shape2 = slide.shapes.add_auto_shape(slides.ShapeType.RECTANGLE, 10, 70, 50, 50)
shape2.fill_format.fill_type = slides.FillType.SOLID
shape2.fill_format.solid_fill_color.scheme_color = slides.SchemeColor.ACCENT4
shape2.fill_format.solid_fill_color.color_transform.add(slides.ColorTransformOperation.MULTIPLY_LUMINANCE, 0.2)
shape2.fill_format.solid_fill_color.color_transform.add(slides.ColorTransformOperation.ADD_LUMINANCE, 0.8)
shape3 = slide.shapes.add_auto_shape(slides.ShapeType.RECTANGLE, 10, 130, 50, 50)
shape3.fill_format.fill_type = slides.FillType.SOLID
shape3.fill_format.solid_fill_color.scheme_color = slides.SchemeColor.ACCENT4
shape3.fill_format.solid_fill_color.color_transform.add(slides.ColorTransformOperation.MULTIPLY_LUMINANCE, 0.4)
shape3.fill_format.solid_fill_color.color_transform.add(slides.ColorTransformOperation.ADD_LUMINANCE, 0.6)
shape4 = slide.shapes.add_auto_shape(slides.ShapeType.RECTANGLE, 10, 190, 50, 50)
shape4.fill_format.fill_type = slides.FillType.SOLID
shape4.fill_format.solid_fill_color.scheme_color = slides.SchemeColor.ACCENT4
shape4.fill_format.solid_fill_color.color_transform.add(slides.ColorTransformOperation.MULTIPLY_LUMINANCE, 0.6)
shape4.fill_format.solid_fill_color.color_transform.add(slides.ColorTransformOperation.ADD_LUMINANCE, 0.4)
shape5 = slide.shapes.add_auto_shape(slides.ShapeType.RECTANGLE, 10, 250, 50, 50)
shape5.fill_format.fill_type = slides.FillType.SOLID
shape5.fill_format.solid_fill_color.scheme_color = slides.SchemeColor.ACCENT4
shape5.fill_format.solid_fill_color.color_transform.add(slides.ColorTransformOperation.MULTIPLY_LUMINANCE, 0.75)
shape6 = slide.shapes.add_auto_shape(slides.ShapeType.RECTANGLE, 10, 310, 50, 50)
shape6.fill_format.fill_type = slides.FillType.SOLID
shape6.fill_format.solid_fill_color.scheme_color = slides.SchemeColor.ACCENT4
shape6.fill_format.solid_fill_color.color_transform.add(slides.ColorTransformOperation.MULTIPLY_LUMINANCE, 0.5)
presentation.save("theme-color-palette.pptx", slides.export.SaveFormat.PPTX)
Warianty te pozostają oparte na kolorze motywu. Jeśli później accent4 ulegnie zmianie, przekształcone kolory zostaną przeliczone z nowej wartości accent4.
Mapowanie wartości SchemeColor na sloty ColorScheme
Wyliczenie SchemeColor używa TEXT1, BACKGROUND1, TEXT2 i BACKGROUND2, podczas gdy ColorScheme udostępnia te same sloty motywu jako dark1, light1, dark2 i light2. Mapowanie jest stałe:
TEXT1=dark1BACKGROUND1=light1TEXT2=dark2BACKGROUND2=light2
Są to alternatywne nazwy tych samych slotów motywu; nie są to wartości dynamicznie konwertowane z jednej formy na inną.
Zmiana czcionek motywu
Schemat czcionek motywu zawiera zestaw głównych czcionek dla nagłówków oraz zestaw pomocniczych czcionek dla tekstu podstawowego. Własności FontScheme.major i FontScheme.minor udostępniają te zestawy.
Identyfikatory czcionek tematycznych zgodne z PowerPoint mogą być używane w formatowaniu tekstu:
+mn-lt– Czcionka podstawowa łacińska (Minor Latin Font)+mj-lt– Czcionka nagłówka łacińska (Major Latin Font)+mn-ea– Czcionka podstawowa wschodnio‑azjatycka (Minor East Asian Font)+mj-ea– Czcionka nagłówka wschodnio‑azjatycka (Major East Asian Font)
Poniższy przykład tworzy jeden nagłówek używający głównej łacińskiej czcionki motywu oraz jedną linię tekstu podstawowego używającą pomocniczej łacińskiej czcionki motywu. Następnie zmienia czcionki motywu i zapisuje wynik:
import aspose.slides as slides
with slides.Presentation() as presentation:
slide = presentation.slides[0]
heading = slide.shapes.add_auto_shape(slides.ShapeType.RECTANGLE, 40, 40, 500, 60)
heading.text_frame.text = "Theme heading"
heading.text_frame.paragraphs[0].portions[0].portion_format.latin_font = slides.FontData("+mj-lt")
body = slide.shapes.add_auto_shape(slides.ShapeType.RECTANGLE, 40, 120, 500, 60)
body.text_frame.text = "Theme body text"
body.text_frame.paragraphs[0].portions[0].portion_format.latin_font = slides.FontData("+mn-lt")
presentation.master_theme.font_scheme.major.latin_font = slides.FontData("Aptos Display")
presentation.master_theme.font_scheme.minor.latin_font = slides.FontData("Arial")
presentation.save("theme-fonts.pptx", slides.export.SaveFormat.PPTX)
Nagłówek podąża za czcionką główną, a tekst podstawowy za czcionką pomocniczą. Tekst, który ma explicite określoną nazwę czcionki zamiast identyfikatora tematycznego, nie zmieni się automatycznie po zmianie schematu czcionek motywu.
Zbiory czcionek głównej i pomocniczej mogą także zawierać mapowania czcionek dla poszczególnych systemów pisma, takich jak cyrylica, arabski, japoński, gruziński i thaana. Aby przeglądać, dodawać, wymieniać lub usuwać te mapowania, zobacz Script‑Specific Theme Fonts.
Wskazówka
Więcej informacji o czcionkach w prezentacjach znajdziesz w PowerPoint Fonts.Kopiowanie lub zastosowanie motywu
Poniższe przepływy pracy rozwiązują różne problemy związane z motywem.
Zastosowanie zewnętrznego motywu do slajdów zależnych od mastera
Użyj IMasterSlide.apply_external_theme_to_depending_slides gdy masz plik motywu PowerPoint (.thmx) i chcesz przystylizować każdy slajd zależny od konkretnego mastera. Wybierz master z kolekcji Presentation.masters, która implementuje MasterSlideCollection, i przekaż ścieżkę do pliku motywu metodzie.
Metoda wykonuje następujące operacje:
- Tworzy nowy slajd master na podstawie wybranego mastera.
- Zastosowuje zewnętrzny motyw do nowego mastera.
- Przypisuje nowy master do wszystkich slajdów, które wcześniej zależały od wybranego mastera.
- Zwraca nowo utworzony obiekt IMasterSlide.
Poniższy przykład stosuje zewnętrzny motyw do slajdów zależnych od pierwszego mastera i zapisuje prezentację:
import aspose.slides as slides
with slides.Presentation("presentation.pptx") as presentation:
selected_master = presentation.masters[0]
themed_master = selected_master.apply_external_theme_to_depending_slides("corporate-theme.thmx")
print(f"Created master: {themed_master.name}")
presentation.save("presentation-with-external-theme.pptx", slides.export.SaveFormat.PPTX)
Nieprawidłowy, uszkodzony lub nieobsługiwany motyw może spowodować wyjątek PptxException lub jeden z jego podklas związanych z formatem. 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 zostaną ponownie przypisane. Slajdy powiązane z innymi masterami zachowają istniejące mastery i motywy. Kolory, czcionki, wypełnienia, linie, tła i efekty świadome motywu zostaną rozwiążone 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ż przeważać nad 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 przez custom font sources, lub skonfiguruj font substitution.
To jest bezpośredni przepływ pracy na poziomie mastera: metoda przyjmuje ścieżkę do pliku .thmx i nie wymaga ręcznego tworzenia nadpisań motywu na poziomie slajdu czy układu.
Zastosowanie różnych zewnętrznych motywów w prezentacji wielomasterowej
Gdy odpowiedni master nie jest znany z góry, pobierz go z reprezentatywnego slajdu przy użyciu Slide.layout_slide oraz LayoutSlide.master_slide. Przechowaj odniesienia do oryginalnych 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 aspose.slides as slides
with slides.Presentation("multi-master-presentation.pptx") as presentation:
if len(presentation.slides) < 5:
print("The presentation does not contain the expected representative slides.")
else:
first_group_master = presentation.slides[0].layout_slide.master_slide
second_group_master = presentation.slides[4].layout_slide.master_slide
if first_group_master.slide_id == second_group_master.slide_id:
print("The representative slides use the same master.")
else:
first_themed_master = first_group_master.apply_external_theme_to_depending_slides("blue-theme.thmx")
second_themed_master = second_group_master.apply_external_theme_to_depending_slides("green-theme.thmx")
print(f"First themed master: {first_themed_master.name}")
print(f"Second themed master: {second_themed_master.name}")
presentation.save("multi-master-with-external-themes.pptx", slides.export.SaveFormat.PPTX)
Pierwsze wywołanie wpływa wyłącznie na slajdy zależne od first_group_master, a drugie wywołanie tylko na slajdy zależne od second_group_master. Slajdy należące do innych masterów nie zostaną przystylizowane.
Zachowanie źródłowego motywu przy przenoszeniu slajdów
Jeśli chcesz przenieść slajd do innej prezentacji i zachować jego pierwotny projekt, sklonuj źródłowy master do docelowej prezentacji przy użyciu MasterSlideCollection.add_clone, a następnie sklonuj slajd przy użyciu SlideCollection.add_clone i sklonowanego mastera. To przenosi master, jego układy i powiązany motyw razem.
import aspose.slides as slides
with slides.Presentation("source-theme.pptx") as source:
with slides.Presentation("target.pptx") as target:
source_slide = source.slides[0]
source_master = source_slide.layout_slide.master_slide
cloned_master = target.masters.add_clone(source_master)
target.slides.add_clone(source_slide, cloned_master, True)
target.save("theme-preserved.pptx", slides.export.SaveFormat.PPTX)
Jest to preferowany przepływ pracy, gdy źródłowy slajd musi wyglądać identycznie w miejscu docelowym. Samo klonowanie 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 na podstawie źródłowego motywu. Metody OverrideTheme.init_color_scheme_from, OverrideTheme.init_font_scheme_from i OverrideTheme.init_format_scheme_from kopiują trzy główne komponenty motywu do nadpisania.
import aspose.slides as slides
with slides.Presentation("source-theme.pptx") as source:
with slides.Presentation("target.pptx") as target:
target_slide = target.slides[0]
override_theme = target_slide.theme_manager.override_theme
override_theme.init_color_scheme_from(source.master_theme.color_scheme)
override_theme.init_font_scheme_from(source.master_theme.font_scheme)
override_theme.init_format_scheme_from(source.master_theme.format_scheme)
target.save("theme-applied-to-slide.pptx", slides.export.SaveFormat.PPTX)
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 korzystających z tego układu, chyba że konkretny slajd ma własne nadpisanie. Te same metody inicjalizacji mogą być użyte poprzez LayoutSlideThemeManager układu:
import aspose.slides as slides
with slides.Presentation("source-theme.pptx") as source:
with slides.Presentation("target.pptx") as target:
target_slide = target.slides[0]
override_theme = target_slide.layout_slide.theme_manager.override_theme
override_theme.init_color_scheme_from(source.master_theme.color_scheme)
override_theme.init_font_scheme_from(source.master_theme.font_scheme)
override_theme.init_format_scheme_from(source.master_theme.format_scheme)
target.save("theme-applied-to-layout.pptx", slides.export.SaveFormat.PPTX)
Używaj motywu na poziomie mastera lub prezentacji, gdy wiele układów i slajdów ma współdzielić ten sam podstawowy projekt, nadpisania układu, gdy rodzina układów wymaga innego stylu, oraz nadpisania slajdu tylko w prawdziwych 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 FormatScheme.background_fill_styles. PowerPoint może prezentować więcej opcji tła w interfejsie niż liczba definicji wypełnień fizycznie 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 sprawdź przechowywaną kolekcję i bieżącą własność Background.style_index. style_index używa 0 dla braku tematycznego wypełnienia; dodatnie wartości są odwołaniami do stylów tła motywu. To różni się od indeksowania kolekcji Pythona, gdzie [0] oznacza pierwszy przechowywany element. Nie zakładaj, że każda prezentacja zawiera taką samą liczbę stylów wypełnień tła.
Poniższy przykład raportuje liczbę dostępnych wypełnień tła, przypisuje odwołanie do tematycznego tła pierwszemu masterowi i zapisuje prezentację:
import aspose.slides as slides
with slides.Presentation("input.pptx") as presentation:
background_styles = presentation.master_theme.format_scheme.background_fill_styles
print(f"Background fill styles: {len(background_styles)}")
if len(background_styles) == 0:
raise RuntimeError("The presentation theme does not contain background fill styles.")
master_slide = presentation.masters[0]
master_slide.background.type = slides.BackgroundType.THEMED
master_slide.background.style_index = 1
presentation.save("theme-background.pptx", slides.export.SaveFormat.PPTX)
Widoczny rezultat zależy od wpisu motywu, do którego odwołuje się master, oraz od ewentualnych nadpisań tła na poziomie układu lub slajdu. Jeśli slajd używa własnego tła, zmiana wyłącznie tła mastera może nie wpłynąć na ten slajd. Użyj Background.get_effective gdy potrzebujesz znać ostateczne tło po zastosowaniu dziedziczenia.
Ostrzeżenie
Nie traktujstyle_index jako indeksu zero‑bazowego kolekcji. 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.
Wskazówka
Więcej informacji o bezpośrednim formatowaniu tła i dziedziczeniu tła znajdziesz w Presentation Background.Aktualizacja efektów motywu
Schemat formatu motywu zawiera osobne kolekcje FormatScheme.fill_styles, FormatScheme.line_styles i FormatScheme.effect_styles. 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ę.

Kiedy uzyskujesz dostęp do tych kolekcji w Pythonie, indeks kolekcji jest zero‑bazowy: [0] to pierwszy przechowywany styl, a [2] to trzeci. Indeksy referencji stylu kształtu to odrębna koncepcja, udostępniana 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 aspose.pydrawing as draw
import aspose.slides as slides
with slides.Presentation("Subtle_Moderate_Intense.pptx") as presentation:
format_scheme = presentation.master_theme.format_scheme
if len(format_scheme.line_styles) < 1 or len(format_scheme.fill_styles) < 3 or len(format_scheme.effect_styles) < 3:
raise RuntimeError("The theme does not contain the style entries required by this example.")
format_scheme.line_styles[0].fill_format.fill_type = slides.FillType.SOLID
format_scheme.line_styles[0].fill_format.solid_fill_color.color = draw.Color.red
format_scheme.fill_styles[2].fill_type = slides.FillType.SOLID
format_scheme.fill_styles[2].solid_fill_color.color = draw.Color.forest_green
format_scheme.effect_styles[2].effect_format.enable_outer_shadow_effect()
format_scheme.effect_styles[2].effect_format.outer_shadow_effect.distance = 10
presentation.save("theme-effects.pptx", slides.export.SaveFormat.PPTX)
Dla kształtów odwołujących się do tych slotów, pierwszy styl linii motywu staje się czerwony, trzeci styl wypełnienia motywu staje się jednolitym zielonym lasem, a trzeci styl efektu zyskuje zewnętrzny cień z odległością 10 punktów. Dokładny wygląd nadal zależy od tego, które sloty stylu referuje 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 FillFormat.get_effective, aby rozwiązać tę hierarchię w niezmienny IFillFormatEffectiveData. Najpierw sprawdź IFillFormatEffectiveData.fill_type. Tylko gdy jest on FillType.SOLID, odczytaj właściwości wypełnienia jednolitego.
Dla wypełnienia jednolitego, IFillFormatEffectiveData.solid_fill_color zwraca ostateczną wartość RGB po zastosowaniu dziedziczenia, wyszukiwania w motywie i transformacji kolorów. IFillFormatEffectiveData.solid_fill_scheme_color zwraca odpowiadający logiczny slot SchemeColor, taki jak TEXT1 lub ACCENT6. Wartość SchemeColor.NOT_DEFINED oznacza, że skuteczne wypełnienie jednolite nie opiera się na kolorze schematu. W przepływie pracy, w którym wypełnienia są albo kolorami tematycznymi, albo bezpośrednimi kolorami RGB, ta wartość identyfikuje wypełnienie RGB.
Nie używaj wyłącznie lokalnej wartości IColorFormat.scheme_color do klasyfikacji wypełnienia. Na przykład fragment tekstu może nie mieć lokalnie zdefiniowanego koloru schematu, więc jego lokalna wartość to NOT_DEFINED, podczas gdy jego skuteczne wypełnienie dziedziczy kolor motywu i rozwiązuje się do TEXT1 lub ACCENT6. Natomiast solid_fill_scheme_color mówi, który logiczny slot motywu wygenerował skuteczny kolor, ale nie mówi, z którego poziomu (obiekt, akapit, układ, master czy inny) pochodzi.
Poniższy przykład ładuje prezentację, audytuje zarówno wypełnienia kształtów, jak i wypełnienia fragmentów tekstu, wypisuje każdą końcową wartość RGB i powiązany kolor schematu oraz oznacza wypełnienia jednolite, które nie będą śledzić zmian kolorów motywu:
import aspose.slides as slides
def audit_fill(object_name, local_fill):
effective_fill = local_fill.get_effective()
if effective_fill.fill_type != slides.FillType.SOLID:
print(f"{object_name}: fill type = {effective_fill.fill_type}; not a solid fill.")
return
rgb = effective_fill.solid_fill_color
effective_scheme_color = effective_fill.solid_fill_scheme_color
local_scheme_color = local_fill.solid_fill_color.scheme_color
print(f"{object_name}: RGB = #{rgb.r:02X}{rgb.g:02X}{rgb.b:02X}")
print(f"{object_name}: local scheme = {local_scheme_color}, effective scheme = {effective_scheme_color}")
if effective_scheme_color == slides.SchemeColor.NOT_DEFINED:
print(f"{object_name}: direct RGB or another non-scheme fill; audit as theme-independent.")
else:
print(f"{object_name}: theme-dependent through {effective_scheme_color}.")
with slides.Presentation("input.pptx") as presentation:
for slide_index, slide in enumerate(presentation.slides):
for shape_index, shape in enumerate(slide.shapes):
shape_name = f"Slide {slide_index + 1}, shape {shape_index + 1}"
audit_fill(shape_name, shape.fill_format)
if isinstance(shape, slides.AutoShape):
for paragraph_index, paragraph in enumerate(shape.text_frame.paragraphs):
for portion_index, portion in enumerate(paragraph.portions):
portion_name = f"{shape_name}, paragraph {paragraph_index + 1}, portion {portion_index + 1}"
audit_fill(portion_name, portion.portion_format.fill_format)
Gałąź NOT_DEFINED 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 podążać za nową paletą firmową. Zgłoszona wartość RGB nadal pokazuje bieżący wygląd, a 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 get_effective i odczytaj nowy obiekt IFillFormatEffectiveData przed porównaniem lub raportowaniem kolorów.
Odczyt skutecznych wartości motywu
Surowe obiekty motywu informują, co jest zdefiniowane na danym poziomie. Skuteczne wartości informują, co slajd lub kształt faktycznie używa po rozpatrzeniu dziedziczenia i lokalnych nadpisań. Dla slajdu wywołaj BaseOverrideThemeManager.create_theme_effective. Dla tła użyj Background.get_effective, a dla wypełnienia FillFormat.get_effective.
Poniższy przykład odczytuje skuteczny motyw, tło i pierwsze wypełnienie kształtu ze slajdu:
import aspose.slides as slides
with slides.Presentation("input.pptx") as presentation:
slide = presentation.slides[0]
effective_theme = slide.theme_manager.create_theme_effective()
effective_background = slide.background.get_effective()
print(f"Effective major Latin font: {effective_theme.font_scheme.major.latin_font.font_name}")
print(f"Effective minor Latin font: {effective_theme.font_scheme.minor.latin_font.font_name}")
print(f"Effective background fill type: {effective_background.fill_format.fill_type}")
if len(slide.shapes) > 0:
effective_fill = slide.shapes[0].fill_format.get_effective()
print(f"First shape effective fill type: {effective_fill.fill_type}")
if effective_fill.fill_type == slides.FillType.SOLID:
print(f"First shape effective fill color: {effective_fill.solid_fill_color}")
Używaj danych skutecznych do diagnostyki renderowania, walidacji i porównań. Jeśli sprawdzisz tylko Presentation.master_theme, możesz pominąć master, układ, slajd lub nadpisanie kształtu, które zmieniają ostateczny wygląd.
FAQ
Czy zastosowanie zewnętrznego motywu wpływa na każdy slajd w prezentacji?
Nie. IMasterSlide.apply_external_theme_to_depending_slides przypisuje tylko te slajdy, które zależą 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ą 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 użyciu MasterSlideCollection.add_clone oraz SlideCollection.add_clone. Dzięki temu master, układy i motyw pozostają razem.
Jak mogę zobaczyć skuteczne wartości po dziedziczeniu i nadpisaniach?
Użyj BaseOverrideThemeManager.create_theme_effective dla motywu slajdu lub układu oraz odpowiadających metod danych skutecznych dla obiektów formatów, takich jak Background.get_effective i FillFormat.get_effective. Te API zwracają rozstrzygnięte wartości po zastosowaniu dziedziczenia i nadpisań.