Präsentationsdesigns in Python über Java verwalten

Einleitung

Ein Präsentations‑Design definiert ein abgestimmtes Set aus Farben, Schriften, Hintergrundstilen, Füllungen, Linien und Effekten. Design‑bewusste Objekte verweisen auf diese gemeinsamen Definitionen, anstatt jede visuelle Eigenschaft als festen Wert zu speichern, sodass ein Design‑Wechsel viele Objekte gleichzeitig aktualisieren kann.

In Aspose.Slides ist das Präsentations‑Design über Presentation.getMasterTheme verfügbar. Eine Präsentation kann außerdem Design‑Überschreibungen auf niedrigeren Ebenen enthalten. Ein Master kann das Präsentations‑Design über MasterThemeManager.getOverrideTheme überschreiben, während ein Layout oder eine einzelne Folie ihr geerbtes Design über BaseOverrideThemeManager.getOverrideTheme überschreiben kann. In der Praxis wird das effektive Design einer Folie über diese Vererbungskette ermittelt: Präsentations‑Design, Master‑Überschreibung, Layout‑Überschreibung und Folien‑Überschreibung.

Design‑Komponenten: Farben, Schriften, Hintergrundstile und Effekte

Die nachfolgenden Abschnitte zeigen die gängigsten Design‑Workflows: Design inspizieren, Farben und Schriften ändern, ein Design kopieren oder anwenden, Hintergrund‑ und Effektstile aktualisieren und effektive Werte nach Vererbung und Überschreibungen auslesen.

Ein Design inspizieren

Das Objekt MasterTheme stellt das Farbschema, das Schriften­schema und das Formatschema über MasterTheme.getColorScheme, MasterTheme.getFontScheme und MasterTheme.getFormatScheme bereit. Diese Sammlungen vor der Änderung zu inspizieren ist besonders nützlich, wenn eine Präsentation aus einer externen Quelle stammt, da die Anzahl und der Inhalt der Style‑Einträge variieren können.

Das folgende Beispiel liest die Haupteigenschaften des Designs und gibt an, wie viele Hintergrund‑, Füll‑, Linien‑ und Effekt‑Stile im Design gespeichert sind:

import jpype
import asposeslides

if not jpype.isJVMStarted():
    jpype.startJVM()

from asposeslides.api import Presentation

presentation = Presentation("input.pptx")
try:
    theme = presentation.getMasterTheme()
    print("Theme name:", theme.getName())
    print("Accent 1:", theme.getColorScheme().getAccent1().getColor())
    print("Major Latin font:", theme.getFontScheme().getMajor().getLatinFont().getFontName())
    print("Minor Latin font:", theme.getFontScheme().getMinor().getLatinFont().getFontName())
    print("Background fill styles:", theme.getFormatScheme().getBackgroundFillStyles().size())
    print("Fill styles:", theme.getFormatScheme().getFillStyles().size())
    print("Line styles:", theme.getFormatScheme().getLineStyles().size())
    print("Effect styles:", theme.getFormatScheme().getEffectStyles().size())
finally:
    presentation.dispose()

Verwendet eine Datei mehrere Master, darf nicht angenommen werden, dass jede Folie dasselbe effektive Design hat. Inspizieren Sie den Master, der der Folie zugeordnet ist, und nutzen Sie den später in diesem Artikel gezeigten Workflow für effektive Designs, wenn Layout‑ oder Folien‑Überschreibungen vorhanden sein können.

Design‑Farben ändern

Design‑bewusste Füllungen, Linien und Texte können sich auf eine logische Farbe aus der Aufzählung SchemeColor beziehen. Wenn Sie den entsprechenden Eintrag im ColorScheme ändern, werden alle Objekte, die noch auf diese Design‑Farbe verweisen, gegen den neuen Wert aufgelöst. Objekte, die eine direkte RGB‑Farbe verwenden, werden durch eine Design‑Farb‑Aktualisierung nicht geändert.

Das folgende End‑to‑End‑Beispiel erstellt eine Form, die Accent4 verwendet, ändert die Design‑Farbe Accent4 zu Rot, speichert die Präsentation, öffnet sie erneut und gibt die effektive Füllfarbe aus:

import jpype
import asposeslides

if not jpype.isJVMStarted():
    jpype.startJVM()

from asposeslides.api import FillType, Presentation, SaveFormat, SchemeColor, ShapeType
from java.awt import Color

presentation = 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(Color.RED)
    presentation.save("theme-color.pptx", SaveFormat.Pptx)
finally:
    presentation.dispose()

saved_presentation = Presentation("theme-color.pptx")
try:
    saved_slide = saved_presentation.getSlides().get_Item(0)
    saved_shape = saved_slide.getShapes().get_Item(0)
    effective_fill = saved_shape.getFillFormat().getEffective()
    print("Effective fill color:", effective_fill.getSolidFillColor())
finally:
    saved_presentation.dispose()

Da das Rechteck weiterhin mit Accent4 verknüpft ist, wird seine sichtbare Farbe nach der Design‑Änderung rot. Ersetzen Sie die Schema‑Farbe durch eine direkte Farbe in der Form, wird eine spätere Änderung von Accent4 diese Füllung nicht mehr beeinflussen.

Farben aus der zusätzlichen Palette verwenden

PowerPoint leitet hellere und dunklere Varianten von einer Design‑Farbe ab, indem Farbtransformationen angewendet werden. Aspose.Slides stellt diese Transformationen über die Aufzählung ColorTransformOperation bereit.

Haupt‑Design‑Farben sowie hellere und dunklere Farben, die aus der zusätzlichen Palette erzeugt wurden

1 – Haupt‑Design‑Farben.
2 – Hellere und dunklere Varianten, die aus den Haupt‑Design‑Farben erzeugt wurden.

Das folgende Beispiel erstellt sechs Rechtecke basierend auf Accent4, wendet Luminanz‑Transformationen auf fünf davon an und speichert das Ergebnis:

import jpype
import asposeslides

if not jpype.isJVMStarted():
    jpype.startJVM()

from asposeslides.api import ColorTransformOperation, FillType, Presentation, SaveFormat, SchemeColor, ShapeType

presentation = Presentation()
try:
    slide = presentation.getSlides().get_Item(0)

    base_shape = slide.getShapes().addAutoShape(ShapeType.Rectangle, 10, 10, 50, 50)
    base_shape.getFillFormat().setFillType(FillType.Solid)
    base_shape.getFillFormat().getSolidFillColor().setSchemeColor(SchemeColor.Accent4)

    lightest_shape = slide.getShapes().addAutoShape(ShapeType.Rectangle, 10, 70, 50, 50)
    lightest_shape.getFillFormat().setFillType(FillType.Solid)
    lightest_shape.getFillFormat().getSolidFillColor().setSchemeColor(SchemeColor.Accent4)
    lightest_shape.getFillFormat().getSolidFillColor().getColorTransform().add(ColorTransformOperation.MultiplyLuminance, 0.2)
    lightest_shape.getFillFormat().getSolidFillColor().getColorTransform().add(ColorTransformOperation.AddLuminance, 0.8)

    lighter_shape = slide.getShapes().addAutoShape(ShapeType.Rectangle, 10, 130, 50, 50)
    lighter_shape.getFillFormat().setFillType(FillType.Solid)
    lighter_shape.getFillFormat().getSolidFillColor().setSchemeColor(SchemeColor.Accent4)
    lighter_shape.getFillFormat().getSolidFillColor().getColorTransform().add(ColorTransformOperation.MultiplyLuminance, 0.4)
    lighter_shape.getFillFormat().getSolidFillColor().getColorTransform().add(ColorTransformOperation.AddLuminance, 0.6)

    light_shape = slide.getShapes().addAutoShape(ShapeType.Rectangle, 10, 190, 50, 50)
    light_shape.getFillFormat().setFillType(FillType.Solid)
    light_shape.getFillFormat().getSolidFillColor().setSchemeColor(SchemeColor.Accent4)
    light_shape.getFillFormat().getSolidFillColor().getColorTransform().add(ColorTransformOperation.MultiplyLuminance, 0.6)
    light_shape.getFillFormat().getSolidFillColor().getColorTransform().add(ColorTransformOperation.AddLuminance, 0.4)

    dark_shape = slide.getShapes().addAutoShape(ShapeType.Rectangle, 10, 250, 50, 50)
    dark_shape.getFillFormat().setFillType(FillType.Solid)
    dark_shape.getFillFormat().getSolidFillColor().setSchemeColor(SchemeColor.Accent4)
    dark_shape.getFillFormat().getSolidFillColor().getColorTransform().add(ColorTransformOperation.MultiplyLuminance, 0.75)

    darker_shape = slide.getShapes().addAutoShape(ShapeType.Rectangle, 10, 310, 50, 50)
    darker_shape.getFillFormat().setFillType(FillType.Solid)
    darker_shape.getFillFormat().getSolidFillColor().setSchemeColor(SchemeColor.Accent4)
    darker_shape.getFillFormat().getSolidFillColor().getColorTransform().add(ColorTransformOperation.MultiplyLuminance, 0.5)

    presentation.save("theme-color-palette.pptx", SaveFormat.Pptx)
finally:
    presentation.dispose()

Diese Varianten bleiben an die Design‑Farbe gebunden. Ändert sich später Accent4, werden die transformierten Farben aus dem neuen Accent4‑Wert neu berechnet.

SchemeColor‑Werte den ColorScheme‑Plätzen zuordnen

Die Aufzählung SchemeColor verwendet Text1, Background1, Text2 und Background2, während das ColorScheme dieselben Design‑Plätze als Dark1, Light1, Dark2 und Light2 bereitstellt. Die Zuordnung ist fest:

  • Text1 = Dark1
  • Background1 = Light1
  • Text2 = Dark2
  • Background2 = Light2

Dies sind alternative Bezeichnungen für dieselben Design‑Plätze; sie sind keine Werte, die dynamisch von einer Form in die andere konvertiert werden.

Design‑Schriften ändern

Ein Design‑Schriften‑Schema enthält ein Haupt‑Schriftset für Überschriften und ein Neben‑Schriftset für Fließtext. Die Methoden FontScheme.getMajor und FontScheme.getMinor geben diese Sets frei.

PowerPoint‑kompatible Design‑Schrift‑Kennungen können in der Textformatierung verwendet werden:

  • +mn‑lt – Fließtext‑Schrift Lateinisch (Minor Latin Font)
  • +mj‑lt – Überschrifts‑Schrift Lateinisch (Major Latin Font)
  • +mn‑ea – Fließtext‑Schrift Ostasiatisch (Minor East Asian Font)
  • +mj‑ea – Überschrifts‑Schrift Ostasiatisch (Major East Asian Font)

Das folgende Beispiel erstellt eine Überschrift, die die Haupt‑Latein‑Design‑Schrift verwendet, und eine Textzeile, die die Neben‑Latein‑Design‑Schrift verwendet. Anschließend werden die Design‑Schriften geändert und das Ergebnis gespeichert:

import jpype
import asposeslides

if not jpype.isJVMStarted():
    jpype.startJVM()

from asposeslides.api import FontData, Presentation, SaveFormat, ShapeType

presentation = Presentation()
try:
    slide = presentation.getSlides().get_Item(0)

    heading = slide.getShapes().addAutoShape(ShapeType.Rectangle, 40, 40, 500, 60)
    heading.getTextFrame().setText("Theme heading")
    font_data = FontData("+mj-lt")
    heading.getTextFrame().getParagraphs().get_Item(0).getPortions().get_Item(0).getPortionFormat().setLatinFont(font_data)

    body = slide.getShapes().addAutoShape(ShapeType.Rectangle, 40, 120, 500, 60)
    body.getTextFrame().setText("Theme body text")
    font_data = FontData("+mn-lt")
    body.getTextFrame().getParagraphs().get_Item(0).getPortions().get_Item(0).getPortionFormat().setLatinFont(font_data)

    font_data = FontData("Aptos Display")
    presentation.getMasterTheme().getFontScheme().getMajor().setLatinFont(font_data)
    font_data = FontData("Arial")
    presentation.getMasterTheme().getFontScheme().getMinor().setLatinFont(font_data)
    presentation.save("theme-fonts.pptx", SaveFormat.Pptx)
finally:
    presentation.dispose()

Die Überschrift folgt der Haupt‑Schrift und der Fließtext der Neben‑Schrift. Text, der explizit einen Schriftnamen anstelle einer Design‑Kennung enthält, wechselt nicht automatisch, wenn das Design‑Schriften‑Schema geändert wird.

Die Haupt‑ und Neben‑Schrift‑Sammlungen können außerdem Schriftzuordnungen für einzelne Schriftsysteme enthalten, z. B. Kyrillisch, Arabisch, Japanisch, Georgisch und Thaana. Zum Inspizieren, Hinzufügen, Ersetzen oder Entfernen dieser Zuordnungen siehe Script‑Specific Theme Fonts.

Ein Design kopieren oder anwenden

Die nachstehenden Workflows lösen verschiedene designbezogene Probleme.

Ein externes Design auf Folien eines Masters anwenden

Verwenden Sie MasterSlide.applyExternalThemeToDependingSlides, wenn Sie eine PowerPoint‑Design‑Datei (.thmx) besitzen und sämtliche Folien, die von einem bestimmten Master abhängen, neu stylen möchten. Wählen Sie den Master aus der Presentation.getMasters‑Sammlung, repräsentiert durch MasterSlideCollection, und übergeben Sie den Pfad zur Design‑Datei an die Methode.

Die Methode führt folgende Schritte aus:

  1. Erstellt eine neue Master‑Folien‑Instanz basierend auf dem gewählten Master.
  2. Wendet das externe Design auf den neuen Master an.
  3. Ordnet den neuen Master allen Folien zu, die zuvor vom gewählten Master abhingen.
  4. Gibt die neu erstellte MasterSlide zurück.

Das folgende Beispiel wendet ein externes Design auf die Folien an, die vom ersten Master abhängen, und speichert die Präsentation:

import jpype
import asposeslides

if not jpype.isJVMStarted():
    jpype.startJVM()

from asposeslides.api import Presentation, SaveFormat

presentation = Presentation("presentation.pptx")
try:
    selected_master = presentation.getMasters().get_Item(0)
    themed_master = selected_master.applyExternalThemeToDependingSlides("corporate-theme.thmx")

    print("Created master:", themed_master.getName())
    presentation.save("presentation-with-external-theme.pptx", SaveFormat.Pptx)
finally:
    presentation.dispose()

Ein ungültiges, beschädigtes oder nicht unterstütztes Design kann eine PptxReadException auslösen. Validieren Sie benutzereingebene Pfade, behandeln Sie Zugriffsfehler auf das Dateisystem und speichern Sie die Präsentation erst, wenn das Design erfolgreich angewendet wurde.

Nur die Folien, die vom ausgewählten Master abhingen, werden neu zugeordnet. Folien, die anderen Mastern zugeordnet sind, behalten ihre bestehenden Master und Designs. Design‑bewusste Farben, Schriften, Füllungen, Linien, Hintergründe und Effekte werden gegen das externe Design aufgelöst. Direkt zugewiesene Farben, Schriften, Füllungen und weitere explizite Formatierungen können unverändert bleiben. Layout‑ und Folien‑Überschreibungen können ebenfalls Vorrang vor den vom neuen Master geerbten Werten haben.

Das Design kann Schriften referenzieren, die in der Laufzeitumgebung nicht verfügbar sind. Für konsistentes Rendering und Export installieren Sie die erforderlichen Schriften, stellen sie über custom font sources bereit oder konfigurieren Sie font substitution.

Dies ist ein direkter Master‑Level‑Workflow: Die Methode akzeptiert einen Dateipfad zu einer .thmx‑Datei und erfordert keine manuelle Erstellung von Folien‑ oder Layout‑Überschreibungen.

Verschiedene externe Designs in einer Multi‑Master‑Präsentation anwenden

Wenn der relevante Master im Vorfeld nicht bekannt ist, ermitteln Sie ihn über eine repräsentative Folie mit Slide.getLayoutSlide und LayoutSlide.getMasterSlide. Speichern Sie die ursprünglichen Master‑Referenzen, bevor Sie Designs anwenden, da jeder Aufruf einen weiteren Master in der Präsentation erzeugt.

Das folgende Beispiel verwendet Folien aus zwei Abschnitten, ermittelt deren Master und wendet jeweils ein anderes externes Design auf jede Gruppe an:

import jpype
import asposeslides

if not jpype.isJVMStarted():
    jpype.startJVM()

from asposeslides.api import Presentation, SaveFormat

presentation = Presentation("multi-master-presentation.pptx")
try:
    if presentation.getSlides().size() < 5:
        print("The presentation does not contain the expected representative slides.")
    else:
        first_group_master = presentation.getSlides().get_Item(0).getLayoutSlide().getMasterSlide()
        second_group_master = presentation.getSlides().get_Item(4).getLayoutSlide().getMasterSlide()

        if first_group_master.getSlideId() == second_group_master.getSlideId():
            print("The representative slides use the same master.")
        else:
            first_themed_master = first_group_master.applyExternalThemeToDependingSlides("blue-theme.thmx")
            second_themed_master = second_group_master.applyExternalThemeToDependingSlides("green-theme.thmx")

            print("First themed master:", first_themed_master.getName())
            print("Second themed master:", second_themed_master.getName())
            presentation.save("multi-master-with-external-themes.pptx", SaveFormat.Pptx)
finally:
    presentation.dispose()

Der erste Aufruf betrifft nur Folien, die von first_group_master abhängen, der zweite Aufruf betrifft nur Folien, die von second_group_master abhängen. Folien, die zu einem anderen Master gehören, bleiben unverändert.

Ein Quell‑Design beim Verschieben von Folien beibehalten

Möchten Sie eine Folie in eine andere Präsentation verschieben und dabei ihr ursprüngliches Design beibehalten, klonen Sie den Quell‑Master in die Ziel‑Präsentation mit MasterSlideCollection.addClone und klonen anschließend die Folie zusammen mit dem geklonten Master über SlideCollection.addClone. Damit werden Master, dessen Layouts und das zugehörige Design gemeinsam übertragen.

import jpype
import asposeslides

if not jpype.isJVMStarted():
    jpype.startJVM()

from asposeslides.api import Presentation, SaveFormat

source = Presentation("source-theme.pptx")
try:
    target = Presentation("target.pptx")
    try:
        source_slide = source.getSlides().get_Item(0)
        source_master = source_slide.getLayoutSlide().getMasterSlide()
        cloned_master = target.getMasters().addClone(source_master)
        target.getSlides().addClone(source_slide, cloned_master, True)
        target.save("theme-preserved.pptx", SaveFormat.Pptx)
    finally:
        target.dispose()
finally:
    source.dispose()

Dies ist der bevorzugte Workflow, wenn die Quell‑Folien im Ziel‑Dokument gleich aussehen sollen. Das reine Kopieren von Inhalten auf einen nicht zugehörigen Ziel‑Master kann hingegen Farben, Schriften, Hintergründe und Effekte, die vom Design abhängen, ändern.

Design‑Werte auf einer bestehenden Folie anwenden

Muss die Ziel‑Folie ihren aktuellen Master und ihr Layout beibehalten, initialisieren Sie eine Folien‑Überschreibung aus dem Quell‑Design. Die Methoden OverrideTheme.initColorSchemeFrom, OverrideTheme.initFontSchemeFrom und OverrideTheme.initFormatSchemeFrom kopieren die drei Haupt‑Design‑Komponenten in die Überschreibung.

import jpype
import asposeslides

if not jpype.isJVMStarted():
    jpype.startJVM()

from asposeslides.api import Presentation, SaveFormat

source = Presentation("source-theme.pptx")
try:
    target = Presentation("target.pptx")
    try:
        target_slide = target.getSlides().get_Item(0)
        override_theme = target_slide.getThemeManager().getOverrideTheme()
        override_theme.initColorSchemeFrom(source.getMasterTheme().getColorScheme())
        override_theme.initFontSchemeFrom(source.getMasterTheme().getFontScheme())
        override_theme.initFormatSchemeFrom(source.getMasterTheme().getFormatScheme())
        target.save("theme-applied-to-slide.pptx", SaveFormat.Pptx)
    finally:
        target.dispose()
finally:
    source.dispose()

Damit wird das von dieser Folie genutzte Design geändert, ohne das von anderen Folien geerbte Design zu beeinflussen. Um die lokale Überschreibung zu entfernen und zu den geerbten Werten zurückzukehren, rufen Sie OverrideTheme.clear auf.

Ein Design‑Override auf ein Layout anwenden

Ein Layout‑Override gilt für alle Folien, die dieses Layout verwenden, sofern eine bestimmte Folie nicht ihr eigenes Override besitzt. Die gleichen Initialisierungsmethoden können über den LayoutSlideThemeManager verwendet werden:

import jpype
import asposeslides

if not jpype.isJVMStarted():
    jpype.startJVM()

from asposeslides.api import Presentation, SaveFormat

source = Presentation("source-theme.pptx")
try:
    target = Presentation("target.pptx")
    try:
        target_slide = target.getSlides().get_Item(0)
        target_layout = target_slide.getLayoutSlide()
        override_theme = target_layout.getThemeManager().getOverrideTheme()
        override_theme.initColorSchemeFrom(source.getMasterTheme().getColorScheme())
        override_theme.initFontSchemeFrom(source.getMasterTheme().getFontScheme())
        override_theme.initFormatSchemeFrom(source.getMasterTheme().getFormatScheme())
        target.save("theme-applied-to-layout.pptx", SaveFormat.Pptx)
    finally:
        target.dispose()
finally:
    source.dispose()

Verwenden Sie ein Master‑ oder Präsentations‑Design, wenn viele Layouts und Folien dasselbe Grunddesign teilen sollen, ein Layout‑Override, wenn eine Layout‑Familie ein abweichendes Styling benötigt, und ein Folien‑Override nur für echte Ausnahmen. Übermäßige Folien‑Overrides erschweren spätere globale Design‑Änderungen.

Design‑Hintergrundstile aktualisieren

Die Hintergrund‑Füllungen des Designs werden in FormatScheme.getBackgroundFillStyles gespeichert. PowerPoint kann im UI mehr Hintergrundoptionen anbieten, als physisch in dieser Sammlung gespeichert sind, weil das UI Design‑Füllungen mit Design‑Farben und anderen Stil‑Referenzen kombinieren kann.

PowerPoint‑Hintergrund‑Stilgallerie für ein Präsentations‑Design

Bevor Sie einen Hintergrundstil verwenden, inspizieren Sie die gespeicherte Sammlung und den aktuellen Wert von Background.getStyleIndex. Ein Stil‑Index von 0 bedeutet keine Design‑Füllung; positive Werte sind Referenzen auf Design‑Hintergrund‑Stile. Das ist anders als das direkte Indizieren der Sammlung, bei dem get_Item(0) das erste gespeicherte Element bedeutet. Gehen Sie nicht davon aus, dass jede Präsentation dieselbe Anzahl von Hintergrund‑Füllstilen enthält.

Das folgende Beispiel gibt die verfügbare Anzahl von Hintergrund‑Füllungen aus, weist dem ersten Master eine Design‑Hintergrund‑Referenz zu und speichert die Präsentation:

import jpype
import asposeslides

if not jpype.isJVMStarted():
    jpype.startJVM()

from asposeslides.api import BackgroundType, Presentation, SaveFormat

presentation = Presentation("input.pptx")
try:
    background_styles = presentation.getMasterTheme().getFormatScheme().getBackgroundFillStyles()
    print("Background fill styles:", background_styles.size())
    if background_styles.size() == 0:
        print("The presentation theme does not contain background fill styles.")
    else:
        master_slide = presentation.getMasters().get_Item(0)
        master_slide.getBackground().setType(BackgroundType.Themed)
        master_slide.getBackground().setStyleIndex(1)
        presentation.save("theme-background.pptx", SaveFormat.Pptx)
finally:
    presentation.dispose()

Das sichtbare Ergebnis hängt vom Design‑Eintrag ab, auf den der Master verweist, sowie von etwaigen Hintergrund‑Überschreibungen auf Layout‑ oder Folien‑Ebene. Nutzt eine Folie ihren eigenen Hintergrund, bewirkt eine rein Master‑Hintergrund‑Änderung möglicherweise keine Änderung dieser Folie. Verwenden Sie Background.getEffective, wenn Sie den endgültigen Hintergrund nach angewandter Vererbung kennen müssen.

Design‑Effekte aktualisieren

Ein Design‑Formatschema enthält separate Sammlungen für Füll‑, Linien‑ und Effekt‑Stile, die über FormatScheme.getFillStyles, FormatScheme.getLineStyles und FormatScheme.getEffectStyles bereitgestellt werden. Typische Office‑Designs enthalten oft drei Haupteinträge, die visuell subtile, moderate und intensive Formatierungen darstellen, jedoch sollte der Code jede Sammlung prüfen, anstatt von einer festen Anzahl auszugehen.

Subtile, moderate und intensive Design‑Effekte, die auf dieselbe Form angewendet wurden

Greift man in Python über Java auf diese Sammlungen zu, ist der Collection‑Index nullbasiert: get_Item(0) ist der erste gespeicherte Stil, get_Item(2) der dritte. Die Stil‑Referenz‑Indizes einer Form sind ein separates Konzept, das über ShapeStyle bereitgestellt wird. Das Ändern eines Design‑Stils wirkt sich auf Formen aus, die diesen Stil referenzieren; Formen mit direkter Formatierung bleiben unverändert.

Das folgende Beispiel prüft, ob die erforderlichen Stile vorhanden sind, ändert den ersten Linienstil, den dritten Füllstil, aktiviert einen äußeren Schatten im dritten Effektstil und speichert das Ergebnis:

import jpype
import asposeslides

if not jpype.isJVMStarted():
    jpype.startJVM()

from asposeslides.api import FillType, Presentation, SaveFormat
from java.awt import Color

presentation = Presentation("Subtle_Moderate_Intense.pptx")
try:
    format_scheme = presentation.getMasterTheme().getFormatScheme()
    if format_scheme.getLineStyles().size() < 1 or format_scheme.getFillStyles().size() < 3 or format_scheme.getEffectStyles().size() < 3:
        print("The theme does not contain the style entries required by this example.")
    else:
        format_scheme.getLineStyles().get_Item(0).getFillFormat().setFillType(FillType.Solid)
        format_scheme.getLineStyles().get_Item(0).getFillFormat().getSolidFillColor().setColor(Color.RED)
        format_scheme.getFillStyles().get_Item(2).setFillType(FillType.Solid)
        forest_green = Color(34, 139, 34)
        format_scheme.getFillStyles().get_Item(2).getSolidFillColor().setColor(forest_green)
        effect_format = format_scheme.getEffectStyles().get_Item(2).getEffectFormat()
        effect_format.enableOuterShadowEffect()
        effect_format.getOuterShadowEffect().setDistance(10)
        presentation.save("theme-effects.pptx", SaveFormat.Pptx)
finally:
    presentation.dispose()

Für Formen, die diese Slots referenzieren, wird der erste Design‑Linienstil rot, der dritte Design‑Füllstil zu einem satten Waldgrün und der dritte Effektstil erhält einen äußeren Schatten mit einem Abstand von 10 Punkten. Das tatsächliche visuelle Ergebnis hängt weiterhin davon ab, welche Stil‑Slots jede Form referenziert und ob direkte Formatierung das Design überschreibt.

Design‑Effekt‑Stile nach Änderung von Linie, Füllung und Schatten‑Einstellungen

Ermitteln, ob eine effektive einfarbige Füllung eine Design‑Farbe verwendet

Eine Füllung kann direkt auf einem Objekt gespeichert sein oder aus einem Absatz, Layout, Master, Design‑Stil oder einer anderen Formatierungsebene geerbt werden. Rufen Sie FillFormat.getEffective auf, um diese Hierarchie in unveränderliche effektive Fülldaten aufzulösen. Prüfen Sie zuerst getFillType am effektiven Datenobjekt. Nur wenn dieser FillType.Solid ist, sollten Sie die Eigenschaften einer einfarbigen Füllung auslesen.

Für eine einfarbige Füllung liefert getSolidFillColor den endgültigen gerenderten RGB‑Wert nach Vererbung, Design‑Lookup und Farbtransformationen. getSolidFillSchemeColor gibt den zugehörigen logischen SchemeColor-Slot zurück, z. B. Text1 oder Accent6. Ein Wert von SchemeColor.NotDefined bedeutet, dass die effektive einfarbige Füllung nicht auf einer Schema‑Farbe basiert. In einem Workflow, in dem Füllungen entweder Design‑Farben oder direkte RGB‑Farben sind, identifiziert dieser Wert eine direkte RGB‑Füllung.

Verwenden Sie nicht allein den lokalen Wert von ColorFormat.getSchemeColor zur Klassifizierung einer Füllung. Beispielsweise kann ein Textabschnitt keine lokal definierte Schema‑Farbe besitzen, sodass sein lokaler Wert NotDefined ist, während seine effektive Füllung ein Design‑Farb‑Slot wie Text1 oder Accent6 erbt. Umgekehrt sagt getSolidFillSchemeColor Ihnen, welcher logische Design‑Slot die effektive Farbe erzeugt hat, liefert jedoch keinen Hinweis darauf, ob dieser Slot vom Objekt, Absatz, Layout, Master oder einer anderen Ebene stammt.

Das folgende Beispiel lädt eine Präsentation, prüft sowohl Form‑Füllungen als auch Text‑Abschnitt‑Füllungen, gibt jeweils den finalen RGB‑Wert und die zugehörige Schema‑Farbe aus und markiert einfarbige Füllungen, die Design‑Farb‑Änderungen nicht folgen:

import jpype
import asposeslides

if not jpype.isJVMStarted():
    jpype.startJVM()

from asposeslides.api import AutoShape, FillType, Presentation, SchemeColor

def audit_fill(object_name, local_fill):
    effective_fill = local_fill.getEffective()
    if effective_fill.getFillType() != FillType.Solid:
        print(f"{object_name}: fill type = {effective_fill.getFillType()}; not a solid fill.")
        return

    rgb = effective_fill.getSolidFillColor()
    effective_scheme_color = effective_fill.getSolidFillSchemeColor()
    local_scheme_color = local_fill.getSolidFillColor().getSchemeColor()
    print(f"{object_name}: RGB = #{rgb.getRed():02X}{rgb.getGreen():02X}{rgb.getBlue():02X}")
    print(f"{object_name}: local scheme = {local_scheme_color}, effective scheme = {effective_scheme_color}")
    if effective_scheme_color == SchemeColor.NotDefined:
        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}.")


presentation = Presentation("input.pptx")
try:
    for slide_index, slide in enumerate(presentation.getSlides()):
        for shape_index, shape in enumerate(slide.getShapes()):
            shape_name = f"Slide {slide_index + 1}, shape {shape_index + 1}"
            audit_fill(shape_name, shape.getFillFormat())
            if isinstance(shape, AutoShape):
                for paragraph_index, paragraph in enumerate(shape.getTextFrame().getParagraphs()):
                    for portion_index, portion in enumerate(paragraph.getPortions()):
                        portion_name = f"{shape_name}, paragraph {paragraph_index + 1}, portion {portion_index + 1}"
                        audit_fill(portion_name, portion.getPortionFormat().getFillFormat())
finally:
    presentation.dispose()

Der NotDefined‑Zweig liefert eine Prüfliste einfarbiger Füllungen, die nicht auf Design‑Farb‑Slots reagieren. Überprüfen Sie diese Objekte, wenn eine Präsentation einem neuen Marken‑Palette folgen muss. Der gemeldete RGB‑Wert zeigt weiterhin das aktuelle Aussehen, während das Schema‑Tag erklärt, ob dieses Aussehen mit dem Design verknüpft ist.

Effektive Format‑Objekte sind Momentaufnahmen. Nach einer Änderung des Präsentations‑Designs, eines Design‑Overrides oder einer anderen geerbten Formatierung rufen Sie getEffective erneut auf und lesen ein neues effektives Fülldaten‑Objekt, bevor Sie Farben vergleichen oder melden.

Effektive Design‑Werte auslesen

Roh‑Design‑Objekte zeigen, was auf einer bestimmten Ebene definiert ist. Effektive Werte zeigen, was eine Folie oder Form nach Vererbung und lokalen Overrides tatsächlich verwendet. Für eine Folie rufen Sie BaseOverrideThemeManager.createThemeEffective auf. Für einen Hintergrund verwenden Sie Background.getEffective, und für eine Füllung FillFormat.getEffective.

Das folgende Beispiel liest das effektive Design, den Hintergrund und die erste Form‑Füllung einer Folie aus:

import jpype
import asposeslides

if not jpype.isJVMStarted():
    jpype.startJVM()

from asposeslides.api import FillType, Presentation

presentation = Presentation("input.pptx")
try:
    slide = presentation.getSlides().get_Item(0)
    effective_theme = slide.getThemeManager().createThemeEffective()
    effective_background = slide.getBackground().getEffective()
    print("Effective major Latin font:", effective_theme.getFontScheme().getMajor().getLatinFont().getFontName())
    print("Effective minor Latin font:", effective_theme.getFontScheme().getMinor().getLatinFont().getFontName())
    print("Effective background fill type:", effective_background.getFillFormat().getFillType())
    if slide.getShapes().size() > 0:
        effective_fill = slide.getShapes().get_Item(0).getFillFormat().getEffective()
        print("First shape effective fill type:", effective_fill.getFillType())
        if effective_fill.getFillType() == FillType.Solid:
            print("First shape effective fill color:", effective_fill.getSolidFillColor())
finally:
    presentation.dispose()

Verwenden Sie effektive Daten für Rendering‑Diagnosen, Validierung und Vergleiche. Wenn Sie nur Presentation.getMasterTheme inspizieren, können Sie einen Master-, Layout-, Folien‑ oder Form‑Override übersehen, der das endgültige Aussehen ändert.

FAQ

Wirkt das Anwenden eines externen Designs auf jede Folie der Präsentation?

Nein. MasterSlide.applyExternalThemeToDependingSlides weist nur die Folien neu zu, die vom ausgewählten Master abhängen. Folien, die andere Master verwenden, behalten ihre bestehenden Designs.

Kann ich ein Design auf eine einzelne Folie anwenden, ohne den Master zu ändern?

Ja. Verwenden Sie den SlideThemeManager der Folie und initialisieren Sie dessen Override‑Design. Die Änderung bleibt lokal auf dieser Folie; andere Folien erben weiterhin ihr bestehendes Design.

Wie übertrage ich ein Design sicher von einer Präsentation in eine andere?

Wenn Sie eine Folie verschieben und ihr ursprüngliches Aussehen bewahren möchten, klonen Sie den Quell‑Master in das Ziel und klonen Sie die Folie mit diesem Master über MasterSlideCollection.addClone und SlideCollection.addClone. Dadurch bleiben Master, Layouts und Design zusammen.

Wie kann ich die effektiven Werte nach Vererbung und Overrides sehen?

Verwenden Sie BaseOverrideThemeManager.createThemeEffective für das Design einer Folie oder eines Layouts und die entsprechenden Effective‑Data‑Methoden für Formatobjekte wie Background.getEffective und FillFormat.getEffective. Diese APIs geben die aufgelösten Werte nach Anwendung von Vererbung und Overrides zurück.