Gestionar temas de presentación en Android
Introducción
Un tema de presentación define un conjunto coordinado de colores, fuentes, estilos de fondo, rellenos, líneas y efectos. Los objetos con conocimiento de tema hacen referencia a estas definiciones compartidas en lugar de almacenar cada propiedad visual como un valor fijo, por lo que un cambio de tema puede actualizar muchos objetos a la vez.
En Aspose.Slides, el tema a nivel de presentación está disponible a través de Presentation.getMasterTheme. Una presentación también puede contener anulaciones de tema en niveles inferiores. Un maestro puede anular el tema de la presentación mediante MasterThemeManager.getOverrideTheme, mientras que un diseño o una diapositiva individual pueden anular su tema heredado mediante BaseOverrideThemeManager.getOverrideTheme. En la práctica, el tema efectivo para una diapositiva se resuelve a través de esta cadena de herencia: tema de la presentación, anulación del maestro, anulación del diseño y anulación de la diapositiva.

Las secciones a continuación muestran los flujos de trabajo más habituales relacionados con temas: inspeccionar un tema, cambiar colores y fuentes, copiar o aplicar un tema, actualizar estilos de fondo y de efectos, y leer los valores efectivos después de que la herencia y las anulaciones se hayan resuelto.
Inspeccionar un tema
El objeto MasterTheme expone el esquema de colores, el esquema de fuentes y el esquema de formato del tema mediante MasterTheme.getColorScheme, MasterTheme.getFontScheme y MasterTheme.getFormatScheme. Inspeccionar estas colecciones antes de modificarlas resulta especialmente útil cuando una presentación proviene de una fuente externa, ya que el número y el contenido de las entradas de estilo pueden variar.
El siguiente ejemplo lee las propiedades principales del tema e informa cuántos estilos de fondo, relleno, línea y efecto están almacenados en el tema:
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();
}
Si un archivo utiliza varios maestros, no asuma que cada diapositiva tiene el mismo tema efectivo. Inspeccione el maestro asociado a la diapositiva y utilice el flujo de trabajo de tema efectivo que se muestra más adelante en este artículo cuando puedan existir anulaciones de diseño o de diapositiva.
Cambiar colores del tema
Los rellenos, líneas y textos con conocimiento de tema pueden referirse a un color lógico del enumerado SchemeColor. Cuando cambia la entrada correspondiente en el IColorScheme, todos los objetos que aún referencian ese color de tema se resuelven contra el nuevo valor. Los objetos que usan un color RGB directo no se modifican mediante una actualización de color de tema.
El siguiente ejemplo de extremo a extremo crea una forma que usa Accent4, cambia el color Accent4 del tema a rojo, guarda la presentación, la vuelve a abrir y muestra el color de relleno efectivo:
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();
}
Como el rectángulo sigue vinculado a Accent4, su color visible se vuelve rojo después de cambiar el tema. Si sustituye el color del esquema por un color directo en la forma, los cambios posteriores de Accent4 ya no afectarán a ese relleno.
Usar colores de la paleta adicional
PowerPoint genera variantes más claras y más oscuras a partir de un color de tema aplicando transformaciones de color. Aspose.Slides expone estas transformaciones mediante el enumerado ColorTransformOperation.

1 - Colores principales del tema.
2 - Variantes más claras y más oscuras producidas a partir de los colores principales del tema.
El siguiente ejemplo crea seis rectángulos basados en Accent4, aplica transformaciones de luminancia a cinco de ellos y guarda el resultado:
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();
}
Estas variantes siguen basadas en el color del tema. Si Accent4 cambia más tarde, los colores transformados se recalculan a partir del nuevo valor de Accent4.
Mapear valores de SchemeColor a ranuras de IColorScheme
El enumerado SchemeColor utiliza Text1, Background1, Text2 y Background2, mientras que el IColorScheme expone las mismas ranuras del tema como Dark1, Light1, Dark2 y Light2. La asignación es fija:
Text1=Dark1Background1=Light1Text2=Dark2Background2=Light2
Estos son nombres alternativos para las mismas ranuras del tema; no son valores que se conviertan dinámicamente de una forma a otra.
Cambiar fuentes del tema
Un esquema de fuentes del tema contiene un conjunto de fuentes mayor para encabezados y un conjunto de fuentes menor para el cuerpo del texto. Los métodos IFontScheme.getMajor y IFontScheme.getMinor exponen esos conjuntos.
Los identificadores de fuentes de tema compatibles con PowerPoint pueden usarse en el formato de texto:
+mn-lt- Fuente del cuerpo Latin (Fuente Latin menor)+mj-lt- Fuente del encabezado Latin (Fuente Latin mayor)+mn-ea- Fuente del cuerpo East Asian (Fuente East Asian menor)+mj-ea- Fuente del encabezado East Asian (Fuente East Asian mayor)
El siguiente ejemplo crea un encabezado que usa la fuente Latin mayor del tema y una línea de cuerpo que usa la fuente Latin menor del tema. Luego cambia las fuentes del tema y guarda el resultado:
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();
}
El encabezado sigue la fuente mayor y el texto del cuerpo sigue la fuente menor. Un texto que tiene un nombre de fuente explícito en lugar de un identificador de tema no cambiará automáticamente cuando el esquema de fuentes del tema cambie.
Las colecciones mayor y menor también pueden contener asignaciones de fuentes para sistemas de escritura individuales, como cirílico, árabe, japonés, georgiano y thaana. Para inspeccionar, añadir, reemplazar o eliminar estas asignaciones, consulte Script-Specific Theme Fonts.
Consejo
Para obtener más información sobre fuentes de presentación, consulte PowerPoint Fonts.Copiar o aplicar un tema
Los flujos de trabajo a continuación resuelven diferentes problemas relacionados con los temas.
Aplicar un tema externo a las diapositivas dependientes de un maestro
Utilice IMasterSlide.applyExternalThemeToDependingSlides cuando dispona de un archivo de tema de PowerPoint (.thmx) y desee restilar cada diapositiva que depende de un maestro concreto. Seleccione el maestro de la colección Presentation.getMasters, que implementa IMasterSlideCollection, y pase la ruta del archivo de tema al método.
El método realiza las siguientes operaciones:
- Crea una nueva diapositiva maestra basada en el maestro seleccionado.
- Aplica el tema externo a la nueva maestra.
- Asigna la nueva maestra a todas las diapositivas que previamente dependían del maestro seleccionado.
- Devuelve el nuevo IMasterSlide.
El siguiente ejemplo aplica un tema externo a las diapositivas que dependen del primer maestro y guarda la presentación:
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();
}
Un tema no válido, dañado o no compatible puede provocar PptxReadException. Valide las rutas proporcionadas por los usuarios, gestione los fallos de acceso al sistema de archivos y guarde la presentación solo después de que el tema se haya aplicado correctamente.
Solo las diapositivas que dependían del maestro seleccionado se reasignan. Las diapositivas asociadas a otros maestros conservan sus maestros y temas actuales. Los colores, fuentes, rellenos, líneas, fondos y efectos con conocimiento de tema se resuelven contra el tema externo. Los colores, fuentes, rellenos y demás formatos asignados directamente pueden permanecer sin cambios. Las anulaciones a nivel de diseño y de diapositiva también pueden tener prioridad sobre los valores heredados del nuevo maestro.
El tema puede referenciar fuentes que no estén disponibles en el entorno de ejecución. Para conseguir una renderización y exportación consistentes, instale las fuentes necesarias, proporciónelas mediante fuentes personalizadas o configure la sustitución de fuentes.
Este es un flujo de trabajo directo a nivel de maestro: el método acepta la ruta a un archivo .thmx y no requiere crear manualmente anulaciones de tema a nivel de diapositiva o de diseño.
Aplicar diferentes temas externos en una presentación con varios maestros
Cuando el maestro relevante no se conoce de antemano, obténgalo a partir de una diapositiva representativa mediante ISlide.getLayoutSlide y ILayoutSlide.getMasterSlide. Guarde las referencias de los maestros originales antes de aplicar cualquier tema, ya que cada llamada crea otro maestro en la presentación.
El siguiente ejemplo usa diapositivas de dos secciones para localizar sus maestros y aplica un tema externo diferente a cada grupo:
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();
}
La primera llamada afecta solo a las diapositivas que dependían de firstGroupMaster, y la segunda llamada afecta solo a las diapositivas que dependían de secondGroupMaster. Las diapositivas pertenecientes a cualquier otro maestro no se restilizan.
Preservar un tema de origen al mover diapositivas
Si desea mover una diapositiva a otra presentación y conservar su diseño original, clone el maestro de origen en la presentación de destino con IMasterSlideCollection.addClone, luego clone la diapositiva con ISlideCollection.addClone y el maestro clonado. Esto transporta el maestro, sus diseños y el tema asociado juntos.
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();
}
Este es el flujo de trabajo preferido cuando la diapositiva de origen debe verse idéntica en el destino. Clonar simplemente el contenido sobre un maestro de destino no relacionado puede modificar los colores, fuentes, fondos y efectos controlados por el tema.
Aplicar valores de tema a una diapositiva existente
Si la diapositiva de destino debe permanecer en su maestro y diseño actuales, inicialice una anulación a nivel de diapositiva a partir del tema de origen. Los métodos OverrideTheme.initColorSchemeFrom, OverrideTheme.initFontSchemeFrom y OverrideTheme.initFormatSchemeFrom copian los tres componentes principales del tema en la anulació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();
}
Esto modifica el tema usado por esa diapositiva sin cambiar el tema heredado por las demás diapositivas. Para eliminar la anulación local y volver a los valores heredados, invoque OverrideTheme.clear.
Aplicar una anulación de tema a un diseño
Una anulación a nivel de diseño se aplica a las diapositivas que usan ese diseño, a menos que una diapositiva concreta tenga su propia anulación. Los mismos métodos de inicialización pueden usarse a través del 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();
}
Utilice un tema a nivel de maestro o de presentación cuando muchos diseños y diapositivas deben compartir el mismo diseño base, una anulación de diseño cuando una familia de diseños necesita un estilo diferente, y una anulación de diapositiva solo para excepciones reales. Un exceso de anulaciones a nivel de diapositiva dificulta predecir los cambios globales de tema posteriores.
Actualizar estilos de fondo del tema
Los rellenos de fondo del tema se almacenan en IFormatScheme.getBackgroundFillStyles. PowerPoint puede presentar más opciones de fondo en su interfaz que el número de definiciones de relleno almacenadas físicamente en esta colección, ya que la UI puede combinar rellenos del tema con colores del tema y otras referencias de estilo.

Antes de usar un estilo de fondo, inspeccione la colección almacenada y el índice de estilo actual mediante Background.getStyleIndex. Un índice de estilo de 0 significa que no hay relleno tematizado; los valores positivos son referencias a estilos de fondo del tema. Esto difiere de indexar directamente la colección Java, donde get_Item(0) representa el primer elemento almacenado. No asuma que cada presentación contiene el mismo número de estilos de relleno de fondo.
El siguiente ejemplo informa del recuento de rellenos de fondo disponibles, asigna una referencia de fondo tematizado al primer maestro y guarda la presentación:
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();
}
El resultado visible depende de la entrada del tema referenciada por el maestro y de cualquier anulación de fondo a nivel de diseño o de diapositiva. Si una diapositiva usa su propio fondo, cambiar solo el fondo del maestro puede no afectar a esa diapositiva. Utilice Background.getEffective cuando necesite conocer el fondo final tras aplicar la herencia.
Advertencia
No trate el índice de estilo como un índice de colección basado en cero. Además, evite codificar un número de estilo de un archivo y suponer que tiene la misma apariencia en otro archivo; las definiciones de estilo del tema son específicas de cada presentación.Consejo
Para formateo directo de fondo y herencia de fondo, consulte Presentation Background.Actualizar efectos del tema
Un esquema de formato del tema contiene colecciones independientes de estilos de relleno, línea y efecto, expuestas mediante IFormatScheme.getFillStyles, IFormatScheme.getLineStyles y IFormatScheme.getEffectStyles. Los temas típicos de Office suelen contener tres entradas principales que corresponden visualmente a formato sutil, moderado e intenso, pero el código debe inspeccionar cada colección en vez de asumir un recuento fijo.

Al acceder a estas colecciones en Java, el índice de la colección es cero basado: get_Item(0) es el primer estilo almacenado y get_Item(2) es el tercero. Los índices de referencia de estilo de una forma son un concepto separado, expuesto mediante IShapeStyle. Modificar un estilo del tema afecta a las formas que referencian ese estilo; las formas con formato directo pueden permanecer sin cambios.
El siguiente ejemplo verifica que existan las entradas de estilo requeridas, cambia el primer estilo de línea, cambia el tercer estilo de relleno, habilita una sombra externa en el tercer estilo de efecto y guarda el resultado:
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();
}
Para las formas que referencian estas ranuras, el primer estilo de línea del tema se vuelve rojo, el tercer estilo de relleno del tema pasa a verde bosque sólido y el tercer estilo de efecto adquiere una sombra externa con una distancia de 10 puntos. El aspecto exacto sigue dependiendo de qué ranuras de estilo referencia cada forma y si el formato directo anula al tema.

Determinar si un relleno sólido efectivo utiliza un color de tema
Un relleno puede almacenarse directamente en un objeto o heredarse de un párrafo, diseño, maestro, estilo de tema u otro nivel de formato. Llame a IFillFormat.getEffective para resolver esa jerarquía en un objeto inmutable IFillFormatEffectiveData. Primero compruebe IFillFormatEffectiveData.getFillType. Solo cuando sea FillType.Solid debe leer las propiedades del relleno sólido.
Para un relleno sólido, IFillFormatEffectiveData.getSolidFillColor devuelve el valor RGB final renderizado tras aplicar herencia, búsqueda en el tema y transformaciones de color. IFillFormatEffectiveData.getSolidFillSchemeColor devuelve la ranura lógica correspondiente del SchemeColor, como Text1 o Accent6. Un valor SchemeColor.NotDefined indica que el relleno sólido efectivo no se basa en un color de esquema. En un flujo donde los rellenos son colores de tema o colores RGB directos, este valor identifica un relleno RGB directo.
No utilice solo el valor local de IColorFormat.getSchemeColor para clasificar un relleno. Por ejemplo, una porción de texto puede no tener un color de esquema definido localmente, por lo que su valor local es NotDefined, mientras que su relleno efectivo hereda un color de tema y se resuelve a Text1 o Accent6. Por el contrario, getSolidFillSchemeColor indica qué ranura lógica del tema produjo el color efectivo, pero no dice si esa ranura provino del objeto, párrafo, diseño, maestro u otro nivel de la jerarquía de formato.
El siguiente ejemplo carga una presentación, audita tanto los rellenos de formas como los rellenos de porciones de texto, muestra cada valor RGB final y el color de esquema asociado, y marca los rellenos sólidos que no seguirán los cambios de color del tema:
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();
}
La rama NotDefined proporciona una lista de auditoría de rellenos sólidos que no responderán a los cambios en las ranuras de color del tema. Revise esos objetos cuando una presentación deba seguir una nueva paleta de marca. El valor RGB informado sigue mostrando la apariencia actual, mientras que el valor de esquema explica si esa apariencia está vinculada al tema.
Los objetos de formato efectivo son instantáneas. Después de cambiar el tema de la presentación, una anulación de tema o cualquier formato heredado, vuelva a llamar a getEffective y lea un nuevo objeto IFillFormatEffectiveData antes de comparar o informar colores.
Leer valores de tema efectivos
Los objetos de tema sin procesar le indican qué está definido en un nivel concreto. Los valores efectivos le indican qué usa realmente una diapositiva o forma después de que se resuelvan la herencia y las anulaciones locales. Para una diapositiva, llame a BaseOverrideThemeManager.createThemeEffective. Para un fondo, utilice Background.getEffective, y para un relleno, use FillFormat.getEffective.
El siguiente ejemplo lee el tema efectivo, el fondo y el primer relleno de forma de una diapositiva:
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();
}
Utilice los datos efectivos para diagnósticos de renderizado, validación y comparaciones. Si solo inspecciona Presentation.getMasterTheme, puede pasarse por alto una anulación de maestro, diseño, diapositiva o forma que modifique la apariencia final.
FAQ
¿Aplicar un tema externo afecta a todas las diapositivas de la presentación?
No. IMasterSlide.applyExternalThemeToDependingSlides reasigna solo las diapositivas que dependen del maestro seleccionado. Las diapositivas que usan otros maestros conservan sus temas actuales.
¿Puedo aplicar un tema a una única diapositiva sin cambiar el maestro?
Sí. Utilice el SlideThemeManager de la diapositiva e inicialice su tema de anulación. El cambio permanece local a esa diapositiva; las demás continúan heredando sus temas actuales.
¿Cuál es la forma más segura de trasladar un tema de una presentación a otra?
Al mover una diapositiva y preservar su apariencia original, clone el maestro de origen en el destino y clone la diapositiva con ese maestro mediante IMasterSlideCollection.addClone y ISlideCollection.addClone. Así se mantiene el maestro, los diseños y el tema juntos.
¿Cómo puedo ver los valores efectivos después de la herencia y las anulaciones?
Utilice BaseOverrideThemeManager.createThemeEffective para una diapositiva o tema de diseño y los métodos de datos efectivos correspondientes para objetos de formato, como Background.getEffective y FillFormat.getEffective. Estas API devuelven los valores resueltos tras aplicar la herencia y las anulaciones.