Gerenciar Temas de Apresentação no .NET
Introdução
Um tema de apresentação define um conjunto coordenado de cores, fontes, estilos de plano de fundo, preenchimentos, linhas e efeitos. Objetos compatíveis com temas referem‑se a essas definições compartilhadas em vez de armazenar cada propriedade visual como um valor fixo, de modo que uma mudança de tema pode atualizar muitos objetos de uma só vez.
Em Aspose.Slides, o tema em nível de apresentação está disponível através da propriedade Presentation.MasterTheme. Uma apresentação também pode conter substituições de tema em níveis inferiores. Um mestre pode substituir o tema da apresentação através de MasterThemeManager.OverrideTheme, um layout pode substituir seu tema herdado através de BaseOverrideThemeManager.OverrideTheme, e um slide individual pode fazer o mesmo. Na prática, o tema efetivo para um slide é resolvido através desta cadeia de herança: tema da apresentação, substituição no mestre, substituição no layout e substituição no slide.

As seções abaixo mostram os fluxos de trabalho de tema mais comuns: inspecionar um tema, alterar cores e fontes, copiar ou aplicar um tema, atualizar estilos de fundo e efeitos, e ler valores efetivos após a herança e as substituições terem sido resolvidas.
Inspecionar um Tema
O objeto MasterTheme expõe o ColorScheme, o FontScheme e o FormatScheme do tema. Inspecionar essas coleções antes de alterá‑las é especialmente útil quando uma apresentação provém de uma fonte externa porque o número e o conteúdo das entradas de estilo podem variar.
O exemplo a seguir lê as propriedades principais do tema e relata quantos estilos de fundo, preenchimento, linha e efeito estão armazenados no tema:
using System;
using Aspose.Slides;
using var presentation = new Presentation("input.pptx");
var theme = presentation.MasterTheme;
Console.WriteLine($"Theme name: {theme.Name}");
Console.WriteLine($"Accent 1: {theme.ColorScheme.Accent1.Color}");
Console.WriteLine($"Major Latin font: {theme.FontScheme.Major.LatinFont.FontName}");
Console.WriteLine($"Minor Latin font: {theme.FontScheme.Minor.LatinFont.FontName}");
Console.WriteLine($"Background fill styles: {theme.FormatScheme.BackgroundFillStyles.Count}");
Console.WriteLine($"Fill styles: {theme.FormatScheme.FillStyles.Count}");
Console.WriteLine($"Line styles: {theme.FormatScheme.LineStyles.Count}");
Console.WriteLine($"Effect styles: {theme.FormatScheme.EffectStyles.Count}");
Se um arquivo usa vários mestres, não presuma que cada slide tem o mesmo tema efetivo. Inspecione o mestre associado ao slide e use o fluxo de trabalho de tema efetivo apresentado mais adiante neste artigo quando substituições de layout ou slide puderem estar presentes.
Alterar Cores do Tema
Preenchimentos, linhas e texto sensíveis ao tema podem referir‑se a uma cor lógica da enumeração SchemeColor. Quando você altera a entrada correspondente no IColorScheme do tema, todos os objetos que ainda referenciam aquela cor do tema são resolvidos contra o novo valor. Objetos que usam uma cor RGB direta não são alterados por uma atualização de cor de tema.
O exemplo completo a seguir cria uma forma que usa Accent4, altera a cor Accent4 do tema para vermelho, salva a apresentação, reabre‑a e imprime a cor de preenchimento efetiva:
using System;
using System.Drawing;
using Aspose.Slides;
using Aspose.Slides.Export;
using var presentation = new Presentation();
var slide = presentation.Slides[0];
var shape = slide.Shapes.AddAutoShape(ShapeType.Rectangle, 10, 10, 100, 100);
shape.FillFormat.FillType = FillType.Solid;
shape.FillFormat.SolidFillColor.SchemeColor = SchemeColor.Accent4;
presentation.MasterTheme.ColorScheme.Accent4.Color = Color.Red;
presentation.Save("theme-color.pptx", SaveFormat.Pptx);
using var savedPresentation = new Presentation("theme-color.pptx");
var savedSlide = savedPresentation.Slides[0];
var savedShape = savedSlide.Shapes[0];
var effectiveFill = savedShape.FillFormat.GetEffective();
Console.WriteLine($"Effective fill color: {effectiveFill.SolidFillColor}");
Como o retângulo permanece vinculado a Accent4, sua cor visível torna‑se vermelha após a mudança do tema. Se você substituir a cor do esquema por uma cor direta na forma, mudanças posteriores em Accent4 não afetarão mais esse preenchimento.
Usar Cores da Paleta Adicional
PowerPoint deriva variantes mais claras e mais escuras a partir de uma cor de tema aplicando transformações de cor. Aspose.Slides expõe essas transformações através de ColorTransformOperation.

1 - Cores principais do tema.
2 - Variantes mais claras e mais escuras produzidas a partir das cores principais do tema.
O exemplo a seguir cria seis retângulos baseados em Accent4, aplica transformações de luminância a cinco deles e salva o resultado:
using Aspose.Slides;
using Aspose.Slides.Export;
using var presentation = new Presentation();
var slide = presentation.Slides[0];
var shape1 = slide.Shapes.AddAutoShape(ShapeType.Rectangle, 10, 10, 50, 50);
shape1.FillFormat.FillType = FillType.Solid;
shape1.FillFormat.SolidFillColor.SchemeColor = SchemeColor.Accent4;
var shape2 = slide.Shapes.AddAutoShape(ShapeType.Rectangle, 10, 70, 50, 50);
shape2.FillFormat.FillType = FillType.Solid;
shape2.FillFormat.SolidFillColor.SchemeColor = SchemeColor.Accent4;
shape2.FillFormat.SolidFillColor.ColorTransform.Add(ColorTransformOperation.MultiplyLuminance, 0.2f);
shape2.FillFormat.SolidFillColor.ColorTransform.Add(ColorTransformOperation.AddLuminance, 0.8f);
var shape3 = slide.Shapes.AddAutoShape(ShapeType.Rectangle, 10, 130, 50, 50);
shape3.FillFormat.FillType = FillType.Solid;
shape3.FillFormat.SolidFillColor.SchemeColor = SchemeColor.Accent4;
shape3.FillFormat.SolidFillColor.ColorTransform.Add(ColorTransformOperation.MultiplyLuminance, 0.4f);
shape3.FillFormat.SolidFillColor.ColorTransform.Add(ColorTransformOperation.AddLuminance, 0.6f);
var shape4 = slide.Shapes.AddAutoShape(ShapeType.Rectangle, 10, 190, 50, 50);
shape4.FillFormat.FillType = FillType.Solid;
shape4.FillFormat.SolidFillColor.SchemeColor = SchemeColor.Accent4;
shape4.FillFormat.SolidFillColor.ColorTransform.Add(ColorTransformOperation.MultiplyLuminance, 0.6f);
shape4.FillFormat.SolidFillColor.ColorTransform.Add(ColorTransformOperation.AddLuminance, 0.4f);
var shape5 = slide.Shapes.AddAutoShape(ShapeType.Rectangle, 10, 250, 50, 50);
shape5.FillFormat.FillType = FillType.Solid;
shape5.FillFormat.SolidFillColor.SchemeColor = SchemeColor.Accent4;
shape5.FillFormat.SolidFillColor.ColorTransform.Add(ColorTransformOperation.MultiplyLuminance, 0.75f);
var shape6 = slide.Shapes.AddAutoShape(ShapeType.Rectangle, 10, 310, 50, 50);
shape6.FillFormat.FillType = FillType.Solid;
shape6.FillFormat.SolidFillColor.SchemeColor = SchemeColor.Accent4;
shape6.FillFormat.SolidFillColor.ColorTransform.Add(ColorTransformOperation.MultiplyLuminance, 0.5f);
presentation.Save("theme-color-palette.pptx", SaveFormat.Pptx);
Essas variantes permanecem baseadas na cor do tema. Se Accent4 mudar depois, as cores transformadas são recalculadas a partir do novo valor de Accent4.
Mapear Valores SchemeColor para Slots IColorScheme
A enumeração SchemeColor usa Text1, Background1, Text2 e Background2, enquanto IColorScheme expõe os mesmos slots do tema como Dark1, Light1, Dark2 e Light2. O mapeamento é fixo:
Text1=Dark1Background1=Light1Text2=Dark2Background2=Light2
Esses são nomes alternativos para os mesmos slots de tema; não são valores convertidos dinamicamente de uma forma para outra.
Alterar Fontes do Tema
Um esquema de fontes de tema contém um conjunto de fontes principal para cabeçalhos e um conjunto de fontes secundário para o corpo do texto. As propriedades FontScheme.Major e FontScheme.Minor expõem esses conjuntos.
Identificadores de fontes de tema compatíveis com PowerPoint podem ser usados na formatação de texto:
+mn‑lt- Fonte Corporal Latina (Fonte Latina Menor)+mj‑lt- Fonte de Cabeçalho Latina (Fonte Latina Maior)+mn‑ea- Fonte Corporal East Asian (Fonte East Asian Menor)+mj‑ea- Fonte de Cabeçalho East Asian (Fonte East Asian Maior)
O exemplo a seguir cria um cabeçalho que usa a fonte latina principal do tema e uma linha de corpo que usa a fonte latina secundária do tema. Em seguida altera as fontes do tema e salva o resultado:
using Aspose.Slides;
using Aspose.Slides.Export;
using var presentation = new Presentation();
var slide = presentation.Slides[0];
var heading = slide.Shapes.AddAutoShape(ShapeType.Rectangle, 40, 40, 500, 60);
heading.TextFrame.Text = "Theme heading";
heading.TextFrame.Paragraphs[0].Portions[0].PortionFormat.LatinFont = new FontData("+mj-lt");
var body = slide.Shapes.AddAutoShape(ShapeType.Rectangle, 40, 120, 500, 60);
body.TextFrame.Text = "Theme body text";
body.TextFrame.Paragraphs[0].Portions[0].PortionFormat.LatinFont = new FontData("+mn-lt");
presentation.MasterTheme.FontScheme.Major.LatinFont = new FontData("Aptos Display");
presentation.MasterTheme.FontScheme.Minor.LatinFont = new FontData("Arial");
presentation.Save("theme-fonts.pptx", SaveFormat.Pptx);
O cabeçalho segue a fonte principal e o texto do corpo segue a fonte secundária. Texto que possui um nome de fonte explícito em vez de um identificador de tema não mudará automaticamente quando o esquema de fontes do tema mudar.
As coleções de fontes principal e secundária também podem conter mapeamentos de fontes para sistemas de escrita individuais, como cirílico, árabe, japonês, georgiano e thaana. Para inspecionar, adicionar, substituir ou remover esses mapeamentos, veja Script-Specific Theme Fonts.
Tip
Para mais informações sobre fontes de apresentação, veja PowerPoint Fonts.Copiar ou Aplicar um Tema
Os fluxos de trabalho abaixo resolvem diferentes problemas relacionados a temas.
Aplicar um Tema Externo aos Slides Dependentes de um Mestre
Use IMasterSlide.ApplyExternalThemeToDependingSlides quando você tem um arquivo de tema do PowerPoint (.thmx) e deseja restilizar todos os slides que dependem de um mestre específico. Selecione o mestre da coleção Presentation.Masters, que implementa IMasterSlideCollection, e passe o caminho do arquivo de tema para o método.
O método realiza as seguintes operações:
- Cria um novo slide mestre baseado no mestre selecionado.
- Aplica o tema externo ao novo mestre.
- Atribui o novo mestre a todos os slides que anteriormente dependiam do mestre selecionado.
- Retorna o recém‑criado IMasterSlide.
O exemplo a seguir aplica um tema externo aos slides que dependem do primeiro mestre, salva a apresentação e reabre o resultado:
using System;
using Aspose.Slides;
using Aspose.Slides.Export;
using var presentation = new Presentation("presentation.pptx");
var selectedMaster = presentation.Masters[0];
var themedMaster = selectedMaster.ApplyExternalThemeToDependingSlides("corporate-theme.thmx");
Console.WriteLine($"Created master: {themedMaster.Name}");
presentation.Save("presentation-with-external-theme.pptx", SaveFormat.Pptx);
Um tema inválido, corrompido ou não‑suportado pode causar PptxException ou uma de suas subclasses relacionadas a formato. Valide os caminhos fornecidos pelos usuários, trate falhas de acesso ao sistema de arquivos e salve a apresentação somente depois que o tema tiver sido aplicado com sucesso.
Somente os slides que dependiam do mestre selecionado são reatribuídos. Slides associados a outros mestres mantêm seus mestres e temas existentes. Cores, fontes, preenchimentos, linhas, planos de fundo e efeitos sensíveis a temas são resolvidos em relação ao tema externo. Cores, fontes, preenchimentos e outras formatações atribuídas diretamente podem permanecer inalterados. Substituições em nível de layout e de slide também podem ter precedência sobre valores herdados do novo mestre.
O tema pode referenciar fontes que não estão disponíveis no ambiente de tempo de execução. Para renderização e exportação consistentes, instale as fontes necessárias, forneça‑as através de custom font sources, ou configure font substitution.
Este é um fluxo de trabalho direto em nível de mestre: o método aceita um caminho de arquivo .thmx e não requer a criação manual de substituições de tema em nível de slide ou layout.
Aplicar Temas Externos Diferentes em uma Apresentação Multi‑Mestre
Quando o mestre relevante não é conhecido antecipadamente, obtenha‑o a partir de um slide representativo através de ISlide.LayoutSlide e ILayoutSlide.MasterSlide. Armazene as referências dos mestres originais antes de aplicar quaisquer temas, pois cada chamada cria outro mestre na apresentação.
O exemplo a seguir usa slides de duas seções para localizar seus mestres e aplica um tema externo diferente a cada grupo:
using System;
using Aspose.Slides;
using Aspose.Slides.Export;
using var presentation = new Presentation("multi-master-presentation.pptx");
if (presentation.Slides.Count < 5)
{
Console.WriteLine("The presentation does not contain the expected representative slides.");
}
else
{
var firstGroupMaster = presentation.Slides[0].LayoutSlide.MasterSlide;
var secondGroupMaster = presentation.Slides[4].LayoutSlide.MasterSlide;
if (ReferenceEquals(firstGroupMaster, secondGroupMaster))
{
Console.WriteLine("The representative slides use the same master.");
}
else
{
var firstThemedMaster = firstGroupMaster.ApplyExternalThemeToDependingSlides("blue-theme.thmx");
var secondThemedMaster = secondGroupMaster.ApplyExternalThemeToDependingSlides("green-theme.thmx");
Console.WriteLine($"First themed master: {firstThemedMaster.Name}");
Console.WriteLine($"Second themed master: {secondThemedMaster.Name}");
presentation.Save("multi-master-with-external-themes.pptx", SaveFormat.Pptx);
}
}
A primeira chamada afeta somente os slides que dependiam de firstGroupMaster, e a segunda chamada afeta somente os slides que dependiam de secondGroupMaster. Slides pertencentes a qualquer outro mestre não são restilizados.
Preservar um Tema de Origem ao Mover Slides
Se você deseja mover um slide para outra apresentação e preservar seu design original, clone o mestre de origem na apresentação de destino com IMasterSlideCollection.AddClone, depois clone o slide com ISlideCollection.AddClone e o mestre clonado. Isso transporta o mestre, seus layouts e o tema associado em conjunto.
using Aspose.Slides;
using Aspose.Slides.Export;
using var source = new Presentation("source-theme.pptx");
using var target = new Presentation("target.pptx");
var sourceSlide = source.Slides[0];
var sourceMaster = sourceSlide.LayoutSlide.MasterSlide;
var clonedMaster = target.Masters.AddClone(sourceMaster);
target.Slides.AddClone(sourceSlide, clonedMaster, true);
target.Save("theme-preserved.pptx", SaveFormat.Pptx);
Este é o fluxo de trabalho preferido quando o slide de origem deve ter a mesma aparência no destino. Simplesmente clonar conteúdo sobre um mestre de destino não relacionado pode alterar cores, fontes, planos de fundo e efeitos acionados por tema.
Aplicar Valores do Tema a um Slide Existente
Se o slide de destino deve permanecer no seu mestre e layout atuais, inicialize uma substituição em nível de slide a partir do tema de origem. Os métodos OverrideTheme.InitColorSchemeFrom, OverrideTheme.InitFontSchemeFrom e OverrideTheme.InitFormatSchemeFrom copiam os três principais componentes do tema para a substituição.
using Aspose.Slides;
using Aspose.Slides.Export;
using var source = new Presentation("source-theme.pptx");
using var target = new Presentation("target.pptx");
var targetSlide = target.Slides[0];
var overrideTheme = targetSlide.ThemeManager.OverrideTheme;
overrideTheme.InitColorSchemeFrom(source.MasterTheme.ColorScheme);
overrideTheme.InitFontSchemeFrom(source.MasterTheme.FontScheme);
overrideTheme.InitFormatSchemeFrom(source.MasterTheme.FormatScheme);
target.Save("theme-applied-to-slide.pptx", SaveFormat.Pptx);
Isso altera o tema usado por esse slide sem mudar o tema herdado pelos demais slides. Para remover a substituição local e retornar aos valores herdados, chame OverrideTheme.Clear.
Aplicar uma Substituição de Tema a um Layout
Uma substituição em nível de layout se aplica aos slides que usam esse layout, a menos que um slide específico tenha sua própria substituição. Os mesmos métodos de inicialização podem ser usados através do LayoutSlideThemeManager do layout:
using Aspose.Slides;
using Aspose.Slides.Export;
using var source = new Presentation("source-theme.pptx");
using var target = new Presentation("target.pptx");
var targetLayout = target.Slides[0].LayoutSlide;
var overrideTheme = targetLayout.ThemeManager.OverrideTheme;
overrideTheme.InitColorSchemeFrom(source.MasterTheme.ColorScheme);
overrideTheme.InitFontSchemeFrom(source.MasterTheme.FontScheme);
overrideTheme.InitFormatSchemeFrom(source.MasterTheme.FormatScheme);
target.Save("theme-applied-to-layout.pptx", SaveFormat.Pptx);
Use um tema de mestre ou de apresentação quando muitos layouts e slides devem compartilhar o mesmo design base, uma substituição de layout quando uma família de layouts precisa de estilização diferente, e uma substituição de slide apenas para exceções reais. Substituições excessivas em nível de slide dificultam a previsão de mudanças globais posteriores no tema.
Atualizar Estilos de Fundo do Tema
Os preenchimentos de fundo do tema são armazenados em FormatScheme.BackgroundFillStyles. PowerPoint pode apresentar mais opções de fundo em sua interface do que o número de definições de preenchimento fisicamente armazenadas nesta coleção, pois a UI pode combinar preenchimentos de tema com cores de tema e outras referências de estilo.

Antes de usar um estilo de fundo, inspecione a coleção armazenada e o atual Background.StyleIndex. StyleIndex usa 0 para nenhum preenchimento temático; valores positivos são referências a estilos de fundo temáticos. Isso difere da indexação direta da coleção .NET, onde [0] significa o primeiro item armazenado. Não presuma que cada apresentação contém o mesmo número de estilos de preenchimento de fundo.
O exemplo a seguir relata a contagem de preenchimentos de fundo disponíveis, atribui uma referência de fundo temático ao primeiro mestre e salva a apresentação:
using System;
using Aspose.Slides;
using Aspose.Slides.Export;
using var presentation = new Presentation("input.pptx");
var backgroundStyles = presentation.MasterTheme.FormatScheme.BackgroundFillStyles;
Console.WriteLine($"Background fill styles: {backgroundStyles.Count}");
if (backgroundStyles.Count == 0)
{
throw new InvalidOperationException("The presentation theme does not contain background fill styles.");
}
presentation.Masters[0].Background.Type = BackgroundType.Themed;
presentation.Masters[0].Background.StyleIndex = 1;
presentation.Save("theme-background.pptx", SaveFormat.Pptx);
O resultado visível depende da entrada de tema referenciada pelo mestre e de quaisquer substituições de fundo em nível de layout ou slide. Se um slide usa seu próprio fundo, mudar somente o fundo do mestre pode não alterar esse slide. Use Background.GetEffective quando precisar conhecer o fundo final após a aplicação da herança.
Warning
Não trateStyleIndex como um índice de coleção baseado em zero. Também evite codificar um número de estilo de um arquivo e presumir que ele terá a mesma aparência em outro arquivo; definições de estilo de tema são específicas da apresentação.
Tip
Para formatação direta de fundo e herança de fundo, veja Presentation Background.Atualizar Efeitos do Tema
Um esquema de formato de tema contém coleções separadas de FillStyles, LineStyles e EffectStyles. Temas típicos do Office frequentemente contêm três entradas principais que correspondem visualmente a formatação sutil, moderada e intensa, mas o código deve inspecionar cada coleção em vez de presumir uma contagem fixa.

Ao acessar essas coleções em C#, o índice da coleção é baseado em zero: [0] é o primeiro estilo armazenado e [2] é o terceiro. Os índices de referência de estilo de uma forma são um conceito separado, expostos através de IShapeStyle. Modificar um estilo de tema afeta as formas que referenciam esse estilo; formas com formatação direta podem permanecer inalteradas.
O exemplo a seguir verifica se as entradas de estilo necessárias existem, altera o primeiro estilo de linha, altera o terceiro estilo de preenchimento, habilita uma sombra externa no terceiro estilo de efeito e salva o resultado:
using System;
using System.Drawing;
using Aspose.Slides;
using Aspose.Slides.Export;
using var presentation = new Presentation("Subtle_Moderate_Intense.pptx");
var formatScheme = presentation.MasterTheme.FormatScheme;
if (formatScheme.LineStyles.Count < 1 || formatScheme.FillStyles.Count < 3 || formatScheme.EffectStyles.Count < 3)
{
throw new InvalidOperationException("The theme does not contain the style entries required by this example.");
}
formatScheme.LineStyles[0].FillFormat.FillType = FillType.Solid;
formatScheme.LineStyles[0].FillFormat.SolidFillColor.Color = Color.Red;
formatScheme.FillStyles[2].FillType = FillType.Solid;
formatScheme.FillStyles[2].SolidFillColor.Color = Color.ForestGreen;
formatScheme.EffectStyles[2].EffectFormat.EnableOuterShadowEffect();
formatScheme.EffectStyles[2].EffectFormat.OuterShadowEffect.Distance = 10f;
presentation.Save("theme-effects.pptx", SaveFormat.Pptx);
Para as formas que referenciam esses slots, o primeiro estilo de linha do tema torna‑se vermelho, o terceiro estilo de preenchimento do tema torna‑se verde floresta sólido, e o terceiro estilo de efeito ganha uma sombra externa com distância de 10 pontos. O resultado visual exato ainda depende de quais slots de estilo cada forma referencia e se a formatação direta sobrescreve o tema.

Determinar se um Preenchimento Sólido Efetivo Usa uma Cor de Tema
Um preenchimento pode ser armazenado diretamente em um objeto ou herdado de um parágrafo, layout, mestre, estilo de tema ou outro nível de formatação. Chame IFillFormat.GetEffective para resolver essa hierarquia em um IFillFormatEffectiveData imutável. Primeiro verifique IFillFormatEffectiveData.FillType. Só quando for FillType.Solid você deve ler as propriedades do preenchimento sólido.
Para um preenchimento sólido, IFillFormatEffectiveData.SolidFillColor devolve o valor RGB final renderizado após herança, busca no tema e aplicação de transformações de cor. IFillFormatEffectiveData.SolidFillSchemeColor devolve o slot lógico correspondente de SchemeColor, como Text1 ou Accent6. Um valor SchemeColor.NotDefined indica que o preenchimento sólido efetivo não se baseia em uma cor de esquema. Em um fluxo de trabalho onde os preenchimentos são cores de tema ou cores RGB diretas, esse valor identifica um preenchimento RGB direto.
Não use apenas o valor local de IColorFormat.SchemeColor para classificar um preenchimento. Por exemplo, uma porção de texto pode não ter cor de esquema definida localmente, portanto seu valor local é NotDefined, enquanto seu preenchimento efetivo herda uma cor de tema e resolve para Text1 ou Accent6. Por outro lado, SolidFillSchemeColor indica qual slot lógico do tema gerou a cor efetiva, mas não indica se esse slot veio do objeto, parágrafo, layout, mestre ou outro nível da hierarquia de formatação.
using System;
using Aspose.Slides;
using var presentation = new Presentation("input.pptx");
var slideCount = presentation.Slides.Count;
for (var slideIndex = 0; slideIndex < slideCount; slideIndex++)
{
var slide = presentation.Slides[slideIndex];
var shapeCount = slide.Shapes.Count;
for (var shapeIndex = 0; shapeIndex < shapeCount; shapeIndex++)
{
var shape = slide.Shapes[shapeIndex];
var shapeName = $"Slide {slideIndex + 1}, shape {shapeIndex + 1}";
AuditFill(shapeName, shape.FillFormat);
if (shape is IAutoShape autoShape)
{
var paragraphCount = autoShape.TextFrame.Paragraphs.Count;
for (var paragraphIndex = 0; paragraphIndex < paragraphCount; paragraphIndex++)
{
var paragraph = autoShape.TextFrame.Paragraphs[paragraphIndex];
var portionCount = paragraph.Portions.Count;
for (var portionIndex = 0; portionIndex < portionCount; portionIndex++)
{
var portion = paragraph.Portions[portionIndex];
var portionName = $"{shapeName}, paragraph {paragraphIndex + 1}, portion {portionIndex + 1}";
AuditFill(portionName, portion.PortionFormat.FillFormat);
}
}
}
}
}
static void AuditFill(string objectName, IFillFormat localFill)
{
var effectiveFill = localFill.GetEffective();
if (effectiveFill.FillType != FillType.Solid)
{
Console.WriteLine($"{objectName}: fill type = {effectiveFill.FillType}; not a solid fill.");
return;
}
var rgb = effectiveFill.SolidFillColor;
var effectiveSchemeColor = effectiveFill.SolidFillSchemeColor;
var localSchemeColor = localFill.SolidFillColor.SchemeColor;
Console.WriteLine($"{objectName}: RGB = #{rgb.R:X2}{rgb.G:X2}{rgb.B:X2}");
Console.WriteLine($"{objectName}: local scheme = {localSchemeColor}, effective scheme = {effectiveSchemeColor}");
if (effectiveSchemeColor == SchemeColor.NotDefined)
{
Console.WriteLine($"{objectName}: direct RGB or another non-scheme fill; audit as theme-independent.");
}
else
{
Console.WriteLine($"{objectName}: theme-dependent through {effectiveSchemeColor}.");
}
}
O ramo NotDefined fornece uma lista de auditoria de preenchimentos sólidos que não responderão a alterações nos slots de cor do tema. Revise esses objetos quando uma apresentação precisar seguir uma nova paleta de marca. O valor RGB reportado ainda mostra a aparência atual, enquanto o valor do esquema explica se essa aparência está conectada ao tema.
Objetos de formato efetivo são instantâneos. Depois de alterar o tema da apresentação, uma substituição de tema ou qualquer formatação herdada, chame GetEffective novamente e leia um novo objeto IFillFormatEffectiveData antes de comparar ou relatar cores.
Ler Valores de Tema Efetivos
Objetos de tema brutos informam o que está definido em um nível específico. Valores efetivos informam o que um slide ou forma realmente usa após herança e substituições locais serem resolvidas. Para um slide, chame BaseOverrideThemeManager.CreateThemeEffective. Para um plano de fundo, use Background.GetEffective, e para um preenchimento, use FillFormat.GetEffective.
O exemplo a seguir lê o tema efetivo, o plano de fundo e o primeiro preenchimento de forma de um slide:
using System;
using Aspose.Slides;
using var presentation = new Presentation("input.pptx");
var slide = presentation.Slides[0];
var effectiveTheme = slide.ThemeManager.CreateThemeEffective();
var effectiveBackground = slide.Background.GetEffective();
Console.WriteLine($"Effective major Latin font: {effectiveTheme.FontScheme.Major.LatinFont.FontName}");
Console.WriteLine($"Effective minor Latin font: {effectiveTheme.FontScheme.Minor.LatinFont.FontName}");
Console.WriteLine($"Effective background fill type: {effectiveBackground.FillFormat.FillType}");
if (slide.Shapes.Count > 0)
{
var effectiveFill = slide.Shapes[0].FillFormat.GetEffective();
Console.WriteLine($"First shape effective fill type: {effectiveFill.FillType}");
if (effectiveFill.FillType == FillType.Solid)
{
Console.WriteLine($"First shape effective fill color: {effectiveFill.SolidFillColor}");
}
}
Use os dados efetivos para diagnóstico de renderização, validação e comparações. Se você inspecionar apenas Presentation.MasterTheme, pode perder um mestre, layout, slide ou substituição de forma que altere a aparência final.
Perguntas Frequentes
Aplicar um tema externo afeta todos os slides da apresentação?
Não. IMasterSlide.ApplyExternalThemeToDependingSlides reatribui somente os slides que dependem do mestre selecionado. Slides que usam outros mestres mantêm seus temas existentes.
Posso aplicar um tema a um único slide sem mudar o mestre?
Sim. Use o SlideThemeManager do slide e inicialize sua substituição de tema. A mudança permanece local a esse slide; os demais slides continuam a herdar seus temas atuais.
Qual é a maneira mais segura de transportar um tema de uma apresentação para outra?
Ao mover um slide e preservar sua aparência original, clone o mestre de origem na apresentação de destino e clone o slide com esse mestre usando IMasterSlideCollection.AddClone e ISlideCollection.AddClone. Isso mantém o mestre, os layouts e o tema juntos.
Como posso ver os valores efetivos após herança e substituições?
Use BaseOverrideThemeManager.CreateThemeEffective para um slide ou tema de layout e os métodos de dados efetivos correspondentes para objetos de formato, como Background.GetEffective e FillFormat.GetEffective. Essas APIs retornam os valores resolvidos após a aplicação de herança e substituições.