Správa témat prezentace na Androidu

Úvod

Prezentace má téma, které definuje koordinovaný soubor barev, typů písma, stylů pozadí, výplní, čar a efektů. Objektům, které jsou si vědomy tématu, jsou přiřazeny tyto sdílené definice místo uložení každé vizuální vlastnosti jako pevné hodnoty, takže změna tématu může aktualizovat mnoho objektů najednou.

V Aspose.Slides je téma na úrovni prezentace dostupné přes Presentation.getMasterTheme. Prezentace může také obsahovat přepsání tématu na nižších úrovních. Master může přepsat téma prezentace pomocí MasterThemeManager.getOverrideTheme, zatímco rozložení nebo jednotlivý snímek mohou přepsat své zděděné téma pomocí BaseOverrideThemeManager.getOverrideTheme. V praxi je efektivní téma pro snímek řešeno touto dědičnou řadou: téma prezentace, přepsání masteru, přepsání rozložení a přepsání snímku.

Komponenty tématu: barvy, písma, styly pozadí a efekty

Níže uvedené sekce ukazují nejčastější pracovní postupy s tématem: prohlížení tématu, změna barev a písem, kopírování nebo použití tématu, aktualizace stylů pozadí a efektů a čtení efektivních hodnot po vyřešení dědičnosti a přepisů.

Prohlédnutí tématu

Objekt MasterTheme vystavuje schéma barev, schéma písem a schéma formátů prostřednictvím MasterTheme.getColorScheme, MasterTheme.getFontScheme a MasterTheme.getFormatScheme. Prohlížení těchto kolekcí před jejich změnou je zvláště užitečné, když prezentace pochází z externího zdroje, protože počet a obsah položek stylů se může lišit.

Následující příklad načte hlavní vlastnosti tématu a vypíše, kolik stylů pozadí, výplní, čar a efektů je v tématu uloženo:

import com.aspose.slides.*;
import android.graphics.Color;

Presentation presentation = new Presentation("input.pptx");
try {
    IMasterTheme theme = presentation.getMasterTheme();
    int accent1 = theme.getColorScheme().getAccent1().getColor();
    System.out.println("Theme name: " + theme.getName());
    System.out.println(String.format("Accent 1: Color [A=%d, R=%d, G=%d, B=%d]", Color.alpha(accent1), Color.red(accent1), Color.green(accent1), Color.blue(accent1)));
    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();
}

Pokud soubor používá více masterů, nepředpokládejte, že každý snímek má stejné efektivní téma. Prohlédněte master přiřazený ke snímku a použijte workflow pro efektivní téma, které je ukázáno níže, když mohou být přítomna přepsání rozložení nebo snímku.

Změna barev tématu

Výplně, čáry a text si mohou odkazovat na logickou barvu ze základny SchemeColor. Když změníte odpovídající položku v IColorScheme, všechny objekty, které stále odkazují na tuto barvu tématu, jsou rozřešeny vůči nové hodnotě. Objektům, které používají přímou barvu RGB, změna barvy tématu neovlivní.

Následující end‑to‑end příklad vytvoří tvar používající Accent4, změní barvu Accent4 v tématu na červenou, uloží prezentaci, znovu ji otevře a vypíše efektivní barvu výplně:

import com.aspose.slides.*;
import android.graphics.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();
    int effectiveColor = effectiveFill.getSolidFillColor();
    System.out.println(String.format("Effective fill color: Color [A=%d, R=%d, G=%d, B=%d]", Color.alpha(effectiveColor), Color.red(effectiveColor), Color.green(effectiveColor), Color.blue(effectiveColor)));
} finally {
    savedPresentation.dispose();
}

Protože obdélník zůstává propojen s Accent4, jeho viditelná barva se po změně tématu stane červenou. Pokud na tvaru nahradíte schématickou barvu přímou barvou, pozdější změny Accent4 již tento výplň neovlivní.

Použití barev z doplňkové palety

PowerPoint odvozuje světlejší a tmavší varianty z barvy tématu aplikací transformací barev. Aspose.Slides tyto transformace vystavuje pomocí výčtu ColorTransformOperation.

Hlavní barvy tématu a světlejší a tmavší barvy generované z doplňkové palety

1 – Hlavní barvy tématu.
2 – Světlejší a tmavší varianty vytvořené z hlavních barev tématu.

Následující příklad vytvoří šest obdélníků založených na Accent4, na pět z nich aplikuje luminanční transformace a výsledek uloží:

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();
}

Tyto varianty zůstávají založeny na barvě tématu. Pokud se Accent4 později změní, transformované barvy se přepočítají z nové hodnoty Accent4.

Mapování hodnot SchemeColor na sloty IColorScheme

Výčet SchemeColor používá Text1, Background1, Text2 a Background2, zatímco IColorScheme vystavuje stejné sloty tématu jako Dark1, Light1, Dark2 a Light2. Mapování je pevně dané:

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

Jedná se o alternativní názvy pro stejné sloty tématu; nejedná se o hodnoty, které jsou dynamicky převáděny z jednoho tvaru do druhého.

Změna písem tématu

Schéma písem tématu obsahuje hlavní sadu písem pro nadpisy a vedlejší sadu pro tělo textu. Metody IFontScheme.getMajor a IFontScheme.getMinor vystavují tyto sady.

Identifikátory písem kompatibilních s PowerPointem lze použít při formátování textu:

  • +mn-lt – tělo písma Latin (Minor Latin Font)
  • +mj-lt – nadpis písma Latin (Major Latin Font)
  • +mn-ea – tělo písma East Asian (Minor East Asian Font)
  • +mj-ea – nadpis písma East Asian (Major East Asian Font)

Následující příklad vytvoří jeden nadpis používající hlavní latinské písmo tématu a jeden řádek těla textu používající vedlejší latinské písmo. Poté změní písma tématu a výsledek uloží:

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();
}

Nadpis používá hlavní písmo a tělo textu používat vedlejší písmo. Text, který má explicitně nastavený název písma místo identifikátoru tématu, se automaticky nepřepne, když se změní schéma písem tématu.

Hlavní a vedlejší kolekce písem mohou také obsahovat mapování písem pro jednotlivé psací systémy, jako jsou cyrilice, arabština, japonština, gruzínština a thaana. Pro prohlížení, přidání, nahrazení nebo odebrání těchto mapování viz Script‑Specific Theme Fonts.

Kopírování nebo použití tématu

Níže uvedené pracovní postupy řeší různé problémy související s tématy.

Použití externího tématu na snímky závislé na masteru

Použijte IMasterSlide.applyExternalThemeToDependingSlides, když máte soubor tématu PowerPoint (.thmx) a chcete přestylovat každý snímek, který závisí na konkrétním masteru. Vyberte master ze sbírky Presentation.getMasters, která implementuje IMasterSlideCollection, a předáte cestu k souboru tématu metodě.

Metoda provádí následující operace:

  1. Vytvoří nový master slide na základě vybraného masteru.
  2. Použije externí téma na nový master.
  3. Přiřadí nový master všem snímkům, které dříve závisely na vybraném masteru.
  4. Vrátí nově vytvořený IMasterSlide.

Následující příklad použije externí téma na snímky, které závisí na prvním masteru, a prezentaci uloží:

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();
}

Neplatné, poškozené nebo nepodporované téma může vyvolat PptxReadException. Ověřujte cesty dodané uživateli, ošetřete selhání přístupu k souborovému systému a prezentaci uložte až po úspěšném použití tématu.

Přesunuty jsou jen snímky, které závisely na vybraném masteru. Snímky spojené s jinými mastery zachovají své stávající mastery a témata. Barvy, písma, výplně, čáry, pozadí a efekty citlivé na téma jsou rozřešeny vůči externímu tématu. Přímě přiřazené barvy, písma, výplně a další explicitní formátování mohou zůstat nezměněny. Přepsání na úrovni rozložení i snímku může také mít přednost před hodnotami zděděnými z nového masteru.

Téma může odkazovat na písma, která nejsou v runtime prostředí dostupná. Pro konzistentní vykreslování a export nainstalujte požadovaná písma, poskytujte je pomocí custom font sources, nebo nastavte font substitution.

Jedná se o přímý workflow na úrovni masteru: metoda přijímá cestu k souboru .thmx a nevyžaduje ruční vytváření přepsání tématu na úrovni snímku nebo rozložení.

Použití různých externích témat v prezentaci s více mastery

Když není předem známý relevantní master, získejte jej z reprezentativního snímku pomocí ISlide.getLayoutSlide a ILayoutSlide.getMasterSlide. Uchovejte původní odkazy na mastery před aplikací jakýchkoli témat, protože každé volání vytvoří další master v prezentaci.

Následující příklad použije snímky ze dvou sekcí k nalezení jejich masterů a aplikuje odlišné externí téma na každou skupinu:

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();
}

První volání ovlivní jen snímky, které závisí na firstGroupMaster, a druhé volání jen snímky, které závisí na secondGroupMaster. Snímky patřící k jakémukoli jinému masteru nejsou přestylovány.

Zachování zdrojového tématu při přesunu snímků

Pokud chcete přesunout snímek do jiné prezentace a zachovat jeho původní design, naklonujte zdrojový master do cílové prezentace pomocí IMasterSlideCollection.addClone, poté naklonujte snímek pomocí ISlideCollection.addClone a naklonovaného masteru. Tím se přenese master, jeho rozložení i související téma.

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();
}

Toto je preferovaný workflow, když musí zdrojový snímek v cíli vypadat identicky. Jednoduché naklonování obsahu na nesouvisející cílový master může změnit barvy, písma, pozadí a efekty řízené tématem.

Použití hodnot tématu na existujícím snímku

Pokud musí cílový snímek zůstat na svém aktuálním masteru a rozložení, inicializujte přepsání na úrovni snímku ze zdrojového tématu. Metody OverrideTheme.initColorSchemeFrom, OverrideTheme.initFontSchemeFrom a OverrideTheme.initFormatSchemeFrom kopírují tři hlavní komponenty tématu do přepsání.

import com.aspose.slides.*;

Presentation source = new Presentation("source-theme.pptx");
try {
    Presentation target = new Presentation("target.pptx");
    try {
        ISlide targetSlide = target.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();
}

Tím se změní téma použité tímto snímkem, aniž by se změnilo téma zděděné ostatními snímky. Pro odebrání lokálního přepsání a návrat k zděděným hodnotám zavolejte OverrideTheme.clear.

Použití přepsání tématu na rozložení

Přepsání na úrovni rozložení se aplikuje na snímky, které používají toto rozložení, pokud konkrétní snímek nemá vlastní přepsání. Stejné inicializační metody lze použít přes LayoutSlideThemeManager:

import com.aspose.slides.*;

Presentation source = new Presentation("source-theme.pptx");
try {
    Presentation target = new Presentation("target.pptx");
    try {
        ISlide targetSlide = target.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();
}

Použijte téma na úrovni masteru nebo prezentace, když mají mnoho rozložení a snímků sdílet stejný základní design; použijte přepsání rozložení, když jedna skupina rozložení potřebuje odlišné stylování; a použijte přepsání snímku jen pro skutečné výjimky. Nadměrná přepsání na úrovni snímku ztěžují předvídat pozdější globální změny tématu.

Aktualizace stylů pozadí tématu

Výplně pozadí tématu jsou uloženy v IFormatScheme.getBackgroundFillStyles. PowerPoint může v uživatelském rozhraní nabídnout více možností pozadí, než je fyzicky uloženo v této kolekci, protože UI může kombinovat výplně tématu s barvami tématu a dalšími odkazy na styly.

Galerie stylů pozadí PowerPointu pro téma prezentace

Před použitím stylu pozadí prohlédněte uloženou kolekci a aktuální Background.getStyleIndex. Index stylu 0 znamená žádnou tématickou výplň; kladné hodnoty jsou odkazy na styl pozadí tématu. To se liší od indexování samotné Java kolekce, kde get_Item(0) označuje první uloženou položku. Nepředpokládejte, že každá prezentace obsahuje stejný počet stylů výplní pozadí.

Následující příklad vypíše počet dostupných výplní pozadí, přiřadí tematický odkaz na pozadí prvnímu masteru a prezentaci uloží:

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();
}

Viditelný výsledek závisí na tématické položce, na kterou master odkazuje, a na případných přepsáních pozadí na úrovni rozložení nebo snímku. Pokud snímek používá vlastní pozadí, změna pouze pozadí masteru nemusí tento snímek změnit. Použijte Background.getEffective když potřebujete znát finální pozadí po aplikaci dědičnosti.

Aktualizace efektů tématu

Schéma formátů tématu obsahuje samostatné kolekce výplní, čar a efektů, které jsou vystaveny přes IFormatScheme.getFillStyles, IFormatScheme.getLineStyles a IFormatScheme.getEffectStyles. Typické Office témata často obsahují tři hlavní položky stylu, které vizuálně odpovídají jemnému, střednímu a intenzivnímu formátování, ale kód by měl každou kolekci prozkoumat místo předpokladu pevného počtu.

Jemné, střední a intenzivní efekty tématu aplikované na stejný tvar

Při přístupu k těmto kolekcím v Javě je index kolekce nulový: get_Item(0) je první uložený styl a get_Item(2) je třetí. Indexy odkazů stylů tvaru jsou samostatným pojmem, vystaveným přes IShapeStyle. Úprava stylu tématu ovlivní tvary, které na tento styl odkazují; tvary s přímým formátováním mohou zůstat nezměněny.

Následující příklad zkontroluje, že požadované položky stylu existují, změní první čárový styl, změní třetí výplňový styl, povolí vnější stín ve třetím efektovém stylu a výsledek uloží:

import com.aspose.slides.*;
import android.graphics.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(Color.rgb(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();
}

Pro tvary, které odkazují na tyto sloty, se první čárový styl tématu změní na červený, třetí výplňový styl tématu se změní na plnou lesní zelenou a třetí efektový styl získá vnější stín s vzdáleností 10 bodů. Přesný vizuální výsledek stále závisí na tom, které sloty stylu jednotlivé tvary používají a zda přímé formátování nepřepíše téma.

Styly efektů tématu po změně čáry, výplně a nastavení stínu

Zjištění, zda efektivní pevná výplň používá barvu tématu

Výplň může být uložena přímo na objektu nebo zděděna z odstavce, rozložení, masteru, stylu tématu či jiné úrovně formátování. Zavolejte IFillFormat.getEffective, aby se tato hierarchie rozřešila do neměnného IFillFormatEffectiveData. Nejprve zkontrolujte IFillFormatEffectiveData.getFillType. Pouze když je to FillType.Solid, byste měli číst vlastnosti pevné výplně.

Pro pevnou výplň IFillFormatEffectiveData.getSolidFillColor vrací finální renderovanou hodnotu RGB po aplikaci dědičnosti, vyhledání v tématu a transformací barev. IFillFormatEffectiveData.getSolidFillSchemeColor vrací odpovídající logický slot SchemeColor, např. Text1 nebo Accent6. Hodnota SchemeColor.NotDefined znamená, že efektivní pevná výplň není založena na schématické barvě. V pracovním postupu, kde jsou výplně buď barvy tématu nebo přímé barvy RGB, tato hodnota identifikuje přímou RGB výplň.

Nepoužívejte jen lokální hodnotu IColorFormat.getSchemeColor k zařazení výplně. Například část textu může mít lokálně nedefinovanou barvu schématu, takže její lokální hodnota je NotDefined, zatímco její efektivní výplň zdědí barvu tématu a rozřeší se na Text1 nebo Accent6. Naopak getSolidFillSchemeColor vám říká, který logický slot tématu vytvořil efektivní barvu, avšak neříká, zda tento slot pochází z objektu, odstavce, rozložení, masteru nebo jiné úrovně hierarchie formátování.

Následující příklad načte prezentaci, prověří výplně tvarů i výplně textových částí, vypíše každou finální RGB hodnotu a související barvu schématu a označí pevné výplně, které nebudou sledovat změny barev tématu:

import com.aspose.slides.*;
import android.graphics.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;
    }

    int rgb = effectiveFill.getSolidFillColor();
    int effectiveSchemeColor = effectiveFill.getSolidFillSchemeColor();
    int localSchemeColor = localFill.getSolidFillColor().getSchemeColor();

    System.out.printf("%s: RGB = #%02X%02X%02X%n", objectName, Color.red(rgb), Color.green(rgb), Color.blue(rgb));
    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();
}

Větve NotDefined poskytují auditní seznam pevných výplní, které nebudou reagovat na změny v barevných slotech tématu. Přezkoumejte tyto objekty, když musí prezentace odpovídat nové paletě značky. Reportovaná RGB hodnota stále ukazuje aktuální vzhled, zatímco hodnota schématu vysvětluje, zda je tento vzhled spojen s tématem.

Objekty efektivního formátu jsou snímky. Po změně tématu prezentace, přepsání tématu nebo jakéhokoli zděděného formátování znovu zavolejte getEffective a přečtěte novou IFillFormatEffectiveData, než budete porovnávat nebo reportovat barvy.

Čtení efektivních hodnot tématu

Surová témata vám říkají, co je definováno na konkrétní úrovni. Efektivní hodnoty říkají, co snímek nebo tvar skutečně používá po vyřešení dědičnosti a lokálních přepisů. Pro snímek zavolejte BaseOverrideThemeManager.createThemeEffective. Pro pozadí použijte Background.getEffective, pro výplň FillFormat.getEffective.

Následující příklad načte efektivní téma, pozadí a výplň prvního tvaru ze snímku:

import com.aspose.slides.*;
import android.graphics.Color;

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) {
            int effectiveColor = effectiveFill.getSolidFillColor();
            System.out.println(String.format("First shape effective fill color: Color [A=%d, R=%d, G=%d, B=%d]", Color.alpha(effectiveColor), Color.red(effectiveColor), Color.green(effectiveColor), Color.blue(effectiveColor)));
        }
    }
} finally {
    presentation.dispose();
}

Používejte efektivní data pro diagnostiku renderování, validaci a porovnání. Pokud kontrolujete jen Presentation.getMasterTheme, můžete přehlédnout přepsání na úrovni masteru, rozložení, snímku nebo tvaru, které mění finální vzhled.

Často kladené otázky

Ovlivňuje použití externího tématu všechny snímky v prezentaci?

Ne. IMasterSlide.applyExternalThemeToDependingSlides přiřadí pouze snímky, které závisí na vybraném masteru. Snímky používající jiné mastery si zachovají své stávající témata.

Mohu použít téma jen na jeden snímek bez změny masteru?

Ano. Použijte SlideThemeManager snímku a inicializujte jeho přepsání tématu. Změna zůstane lokální pro tento snímek; ostatní snímky budou pokračovat v dědit své stávající témata.

Jaký je nejbezpečnější způsob, jak přenést téma z jedné prezentace do druhé?

Při přesunu snímku a zachování jeho původního vzhledu naklonujte zdrojový master do cíle a naklonujte snímek s tímto masterem pomocí IMasterSlideCollection.addClone a ISlideCollection.addClone. Tím se zachová master, rozložení i téma společně.

Jak mohu zobrazit efektivní hodnoty po dědičnosti a přepsání?

Použijte BaseOverrideThemeManager.createThemeEffective pro snímek nebo rozložení tématu a odpovídající metody efektivních dat pro formátovací objekty, jako je Background.getEffective a FillFormat.getEffective. Tyto API vrací rozřešené hodnoty po aplikaci dědičnosti a přepisů.