Gerenciar Formas de Apresentação no Android
Visão geral
Este artigo explica como trabalhar com formas em apresentações usando Aspose.Slides. Ele mostra como encontrar uma forma em um slide, cloná‑la, removê‑la, ocultá‑la, alterar sua ordem, obter seu ID de forma Interop e definir texto alternativo para identificação e processamento posterior.
Ele também aborda como acessar formatos de layout para formas, renderizar uma forma como SVG, alinhar formas em um slide e usar propriedades de inversão para espelhamento horizontal e vertical. Além disso, o artigo inclui um FAQ curto sobre combinação de formas, ordem de empilhamento e bloqueio de formas.
Encontrar uma Forma em um Slide
Este tópico descreve uma técnica simples para facilitar aos desenvolvedores a localização de uma forma específica em um slide sem usar seu Id interno. É importante saber que arquivos de Apresentação do PowerPoint não têm nenhuma forma de identificar formas em um slide, exceto por um Id interno exclusivo. Parece ser difícil para os desenvolvedores encontrar uma forma usando seu Id interno exclusivo. Todas as formas adicionadas aos slides possuem algum Texto Alternativo. Sugerimos que os desenvolvedores usem texto alternativo para encontrar uma forma específica. Você pode usar o MS PowerPoint para definir o texto alternativo para objetos que planeja alterar no futuro.
Depois de definir o texto alternativo de qualquer forma desejada, você pode abrir essa apresentação usando Aspose.Slides para Android via Java e iterar por todas as formas adicionadas a um slide. Em cada iteração, você pode verificar o texto alternativo da forma e a forma com o texto alternativo correspondente será a forma requerida por você. Para demonstrar essa técnica de forma melhor, criamos um método, findShape que faz a busca de uma forma específica em um slide e simplesmente retorna essa forma.
// Instanciar uma classe Presentation que representa o arquivo de apresentação
Presentation pres = new Presentation("FindingShapeInSlide.pptx");
try {
ISlide slide = pres.getSlides().get_Item(0);
// Texto alternativo da forma a ser encontrada
IShape shape = findShape(slide, "Shape1");
if (shape != null)
{
System.out.println("Shape Name: " + shape.getName());
}
} finally {
if (pres != null) pres.dispose();
}
// Implementação do método para encontrar uma forma em um slide usando seu texto alternativo
public static IShape findShape(ISlide slide, String alttext)
{
// Iterando por todas as formas dentro do slide
for (int i = 0; i < slide.getShapes().size(); i++)
{
// Se o texto alternativo do slide corresponder ao requerido então
// Retornar a forma
if (slide.getShapes().get_Item(i).getAlternativeText().compareTo(alttext) == 0)
return slide.getShapes().get_Item(i);
}
return null;
}
Clonar uma Forma
Para clonar uma forma para um slide usando Aspose.Slides para Android via Java:
- Crie uma instância da classe Presentation.
- Obtenha a referência de um slide usando seu índice.
- Acesse a coleção de formas do slide de origem.
- Adicione um novo slide à apresentação.
- Clone as formas da coleção de formas do slide de origem para o novo slide.
- Salve a apresentação modificada como um arquivo PPTX.
O exemplo abaixo adiciona uma forma de grupo a um slide.
// Instanciar classe Presentation
Presentation pres = new Presentation("Source Frame.pptx");
try {
IShapeCollection sourceShapes = pres.getSlides().get_Item(0).getShapes();
ILayoutSlide blankLayout = pres.getMasters().get_Item(0).getLayoutSlides().getByType(SlideLayoutType.Blank);
ISlide destSlide = pres.getSlides().addEmptySlide(blankLayout);
IShapeCollection destShapes = destSlide.getShapes();
destShapes.addClone(sourceShapes.get_Item(1), 50, 150 + sourceShapes.get_Item(0).getHeight());
destShapes.addClone(sourceShapes.get_Item(2));
destShapes.insertClone(0, sourceShapes.get_Item(0), 50, 150);
// Gravar o arquivo PPTX no disco
pres.save("CloneShape_out.pptx", SaveFormat.Pptx);
} finally {
if (pres != null) pres.dispose();
}
Remover uma Forma
Aspose.Slides para Android via Java permite que os desenvolvedores removam qualquer forma. Para remover a forma de qualquer slide, siga os passos abaixo:
- Crie uma instância da classe Presentation.
- Acesse o primeiro slide.
- Encontre a forma com um TextoAlternativo específico.
- Remova a forma.
- Salve o arquivo no disco.
// Instanciar objeto Presentation
Presentation pres = new Presentation();
try {
// Obter o primeiro slide
ISlide sld = pres.getSlides().get_Item(0);
// Adicionar autoforma do tipo retângulo
sld.getShapes().addAutoShape(ShapeType.Rectangle, 50, 40, 150, 50);
sld.getShapes().addAutoShape(ShapeType.Moon, 160, 40, 150, 50);
String altText = "User Defined";
int iCount = sld.getShapes().size();
for (int i = 0; i < iCount; i++)
{
AutoShape ashp = (AutoShape)sld.getShapes().get_Item(0);
if (alttext.equals(ashp.getAlternativeText()))
{
sld.getShapes().remove(ashp);
}
}
// Salvar apresentação no disco
pres.save("RemoveShape_out.pptx", SaveFormat.Pptx);
} finally {
if (pres != null) pres.dispose();
}
Ocultar uma Forma
Aspose.Slides para Android via Java permite que os desenvolvedores ocultem qualquer forma. Para ocultar a forma de qualquer slide, siga os passos abaixo:
- Crie uma instância da classe Presentation.
- Acesse o primeiro slide.
- Encontre a forma com um TextoAlternativo específico.
- Oculte a forma.
- Salve o arquivo no disco.
// Instanciar classe Presentation que representa o PPTX
Presentation pres = new Presentation();
try {
// Obter o primeiro slide
ISlide sld = pres.getSlides().get_Item(0);
// Adicionar autoforma do tipo retângulo
sld.getShapes().addAutoShape(ShapeType.Rectangle, 50, 40, 150, 50);
sld.getShapes().addAutoShape(ShapeType.Moon, 160, 40, 150, 50);
String alttext = "User Defined";
int iCount = sld.getShapes().size();
for (int i = 0; i < iCount; i++)
{
AutoShape ashp = (AutoShape)sld.getShapes().get_Item(i);
if (alttext.equals(ashp.getAlternativeText()))
{
ashp.setHidden(true);
}
}
// Salvar apresentação no disco
pres.save("Hiding_Shapes_out.pptx", SaveFormat.Pptx);
} finally {
if (pres != null) pres.dispose();
}
Alterar a Ordem da Forma
Aspose.Slides para Android via Java permite que os desenvolvedores reordenem as formas. Reordenar a forma especifica qual forma está na frente ou qual está atrás. Para reordenar a forma de qualquer slide, siga os passos abaixo:
- Crie uma instância da classe Presentation.
- Acesse o primeiro slide.
- Adicione uma forma.
- Adicione algum texto na caixa de texto da forma.
- Adicione outra forma com as mesmas coordenadas.
- Reordene as formas.
- Salve o arquivo no disco.
Presentation pres = new Presentation("ChangeShapeOrder.pptx");
try {
ISlide slide = pres.getSlides().get_Item(0);
IAutoShape shp3 = slide.getShapes().addAutoShape(ShapeType.Rectangle, 200, 365, 400, 150);
shp3.getFillFormat().setFillType(FillType.NoFill);
shp3.addTextFrame(" ");
IParagraph para = shp3.getTextFrame().getParagraphs().get_Item(0);
IPortion portion = para.getPortions().get_Item(0);
portion.setText("Watermark Text Watermark Text Watermark Text");
shp3 = slide.getShapes().addAutoShape(ShapeType.Triangle, 200, 365, 400, 150);
slide.getShapes().reorder(2, shp3);
pres.save("Reshape_out.pptx", SaveFormat.Pptx);
} finally {
if (pres != null) pres.dispose();
}
Obter o ID da Forma Interop
Aspose.Slides para Android via Java permite que os desenvolvedores obtenham um identificador de forma exclusivo no escopo do slide, em contraste com o método getUniqueId que permite obter um identificador exclusivo no escopo da apresentação. O método getOfficeInteropShapeId foi adicionado às interfaces IShape e à classe Shape respectivamente. O valor retornado pelo método getOfficeInteropShapeId corresponde ao valor do Id do objeto Microsoft.Office.Interop.PowerPoint.Shape. Abaixo é apresentado um exemplo de código.
Presentation pres = new Presentation("Presentation.pptx");
try {
// Obtendo identificador de forma exclusivo no escopo do slide
long officeInteropShapeId = pres.getSlides().get_Item(0).getShapes().get_Item(0).getOfficeInteropShapeId();
} finally {
if (pres != null) pres.dispose();
}
Definir Texto Alternativo para uma Forma
Aspose.Slides para Android via Java permite que os desenvolvedores definam AlternateText de qualquer forma. Formas em uma apresentação podem ser distinguidas pelo método AlternativeText ou Shape Name. Os métodos setAlternativeText e getAlternativeText podem ser lidos ou definidos usando Aspose.Slides assim como o Microsoft PowerPoint. Usando este método, você pode marcar uma forma e executar diferentes operações como Remover uma forma, Ocultar uma forma ou Reordenar formas em um slide. Para definir o AlternateText de uma forma, siga os passos abaixo:
- Crie uma instância da classe Presentation.
- Acesse o primeiro slide.
- Adicione qualquer forma ao slide.
- Execute alguma operação com a forma recém‑adicionada.
- Percorra as formas para encontrar uma forma.
- Defina o AlternativeText.
- Salve o arquivo no disco.
// Instanciar classe Presentation que representa o PPTX
Presentation pres = new Presentation();
try {
// Obter o primeiro slide
ISlide sld = pres.getSlides().get_Item(0);
// Adicionar autoforma do tipo retângulo
IShape shp1 = sld.getShapes().addAutoShape(ShapeType.Rectangle, 50, 40, 150, 50);
IShape shp2 = sld.getShapes().addAutoShape(ShapeType.Moon, 160, 40, 150, 50);
shp2.getFillFormat().setFillType(FillType.Solid);
shp2.getFillFormat().getSolidFillColor().setColor(Color.GRAY);
for (int i = 0; i < sld.getShapes().size(); i++)
{
AutoShape shape = (AutoShape) sld.getShapes().get_Item(i);
if (shape != null)
{
shape.setAlternativeText("User Defined");
}
}
// Salvar apresentação no disco
pres.save("Set_AlternativeText_out.pptx", SaveFormat.Pptx);
} finally {
if (pres != null) pres.dispose();
}
Acessar Formatos de Layout para uma Forma
Aspose.Slides para Android via Java fornece uma API simples para acessar formatos de layout para uma forma. Este artigo demonstra como você pode acessar formatos de layout.
Abaixo é apresentado um exemplo de código.
Presentation pres = new Presentation("pres.pptx");
try {
for (ILayoutSlide layoutSlide : pres.getLayoutSlides())
{
for (IShape shape : layoutSlide.getShapes())
{
IFillFormat fillFormats = shape.getFillFormat();
ILineFormat lineFormats = shape.getLineFormat();
}
}
} finally {
if (pres != null) pres.dispose();
}
Renderizar uma Forma como SVG
Agora o Aspose.Slides para Android via Java oferece suporte para renderizar uma forma como SVG. O método writeAsSvg (e sua sobrecarga) foi adicionado à classe Shape e à interface IShape. Este método permite salvar o conteúdo da forma como um arquivo SVG. O trecho de código abaixo mostra como exportar a forma do slide para um arquivo SVG.
Presentation pres = new Presentation("TestExportShapeToSvg.pptx");
try {
FileOutputStream stream = new FileOutputStream("SingleShape.svg");
try {
pres.getSlides().get_Item(0).getShapes().get_Item(0).writeAsSvg(stream);
} finally {
if (stream != null) stream.close();
}
} catch (IOException e) {
} finally {
if (pres != null) pres.dispose();
}
Alinhar uma Forma
Aspose.Slides permite alinhar formas tanto em relação às margens do slide quanto em relação umas às outras. Para isso, o método sobrecarregado SlidesUtil.alignShape() foi adicionado. A enumeração ShapesAlignmentType define as possíveis opções de alinhamento.
Exemplo 1
O código‑fonte abaixo alinha as formas com índices 1,2 e 4 ao longo da borda superior do slide.
Presentation pres = new Presentation("example.pptx");
try {
ISlide slide = pres.getSlides().get_Item(0);
IShape shape1 = slide.getShapes().get_Item(1);
IShape shape2 = slide.getShapes().get_Item(2);
IShape shape3 = slide.getShapes().get_Item(4);
SlideUtil.alignShapes(ShapesAlignmentType.AlignTop, true, pres.getSlides().get_Item(0), new int[]
{
slide.getShapes().indexOf(shape1),
slide.getShapes().indexOf(shape2),
slide.getShapes().indexOf(shape3)
});
} finally {
if (pres != null) pres.dispose();
}
}
Exemplo 2
O exemplo abaixo mostra como alinhar toda a coleção de formas em relação à forma mais inferior da coleção.
Presentation pres = new Presentation("example.pptx");
try {
SlideUtil.alignShapes(ShapesAlignmentType.AlignBottom, false, pres.getSlides().get_Item(0));
} finally {
if (pres != null) pres.dispose();
}
Propriedades de Inversão
No Aspose.Slides, a classe ShapeFrame fornece controle sobre o espelhamento horizontal e vertical das formas através de suas propriedades flipH e flipV. Ambas as propriedades são do tipo byte, permitindo valores 1 para indicar inversão, 0 para nenhuma inversão, ou -1 para usar o comportamento padrão. Esses valores são acessíveis a partir do Frame de uma forma.
Para modificar as configurações de inversão, uma nova instância de ShapeFrame é construído com a posição e tamanho atuais da forma, os valores desejados para flipH e flipV e o ângulo de rotação. Atribuir essa instância ao Frame da forma e salvar a apresentação aplica as transformações de espelhamento e as grava no arquivo de saída.
Suponha que temos um arquivo sample.pptx no qual o primeiro slide contém uma única forma com configurações de inversão padrão, como mostrado abaixo.

O exemplo de código a seguir recupera as propriedades de inversão atuais da forma e a inverte horizontal e verticalmente.
Presentation presentation = new Presentation("sample.pptx");
try {
ISlide slide = presentation.getSlides().get_Item(0);
IShape shape = slide.getShapes().get_Item(0);
// Recuperar a propriedade de inversão horizontal da forma.
byte horizontalFlip = shape.getFrame().getFlipH();
System.out.println("Horizontal flip: " + horizontalFlip);
// Recuperar a propriedade de inversão vertical da forma.
byte verticalFlip = shape.getFrame().getFlipV();
System.out.println("Vertical flip: " + verticalFlip);
float x = shape.getFrame().getX();
float y = shape.getFrame().getY();
float width = shape.getFrame().getWidth();
float height = shape.getFrame().getHeight();
byte flipH = NullableBool.True; // Inverter horizontalmente.
byte flipV = NullableBool.True; // Inverter horizontalmente.
float rotation = shape.getFrame().getRotation();
shape.setFrame(new ShapeFrame(x, y, width, height, flipH, flipV, rotation));
presentation.save("output.pptx", SaveFormat.Pptx);
} finally {
presentation.dispose();
}
O resultado:

FAQ
Posso combinar formas (união/intersecção/subtração) em um slide como em um editor de desktop?
Não existe uma API de operação Booleana incorporada. Você pode aproximar isso construindo o contorno desejado você mesmo — por exemplo, calcular a geometria resultante (via GeometryPath) e criar uma nova forma com esse contorno, opcionalmente removendo as originais.
Como posso controlar a ordem de empilhamento (z-order) para que uma forma permaneça sempre “no topo”?
Altere a ordem de inserção/movimento dentro da coleção de shapes do slide. Para resultados previsíveis, finalize o z-order após todas as outras modificações do slide.
Posso “travar” uma forma para impedir que usuários a editem no PowerPoint?
Sim. Defina flags de proteção ao nível da forma (por exemplo, bloquear seleção, movimento, redimensionamento, edição de texto). Se necessário, espelhe restrições no mestre ou layout. Observe que isso é proteção ao nível da UI, não um recurso de segurança; para proteção mais forte, combine com restrições ao nível do arquivo como recomendações de somente leitura ou senhas.