Gerenciar nós de forma SmartArt em apresentações usando Python

Visão geral

Os gráficos SmartArt nas apresentações do PowerPoint são organizados por meio de nós que contêm texto e definem a estrutura do diagrama. Aspose.Slides permite que você trabalhe com esses nós SmartArt programaticamente: adicionar novos nós e nós filhos, inserir nós filhos em uma posição específica, acessar nós existentes e ler seu texto, nível e posição.

Este artigo explica como gerenciar nós de formas SmartArt. Ele mostra como remover nós, trabalhar com nós filhos por índice ou posição, alterar um nó assistente para um nó normal, ajustar a posição, tamanho e rotação das formas dos nós SmartArt, definir formatos de preenchimento dos nós e gerar uma imagem em miniatura para um nó filho SmartArt.

Adicionar um nó SmartArt

Aspose.Slides for Python via Java fornece uma API para gerenciar formas SmartArt. O exemplo a seguir adiciona um nó e um nó filho a uma forma SmartArt.

  1. Crie uma instância da classe Presentation e carregue a apresentação que contém uma forma SmartArt.
  2. Obtenha o primeiro slide pelo seu índice.
  3. Itere por todas as formas no primeiro slide.
  4. Verifique se a forma é uma instância de SmartArt.
  5. Adicione um novo nó à coleção de nós da forma SmartArt e defina seu texto através de TextFrame.
  6. Adicione um nó filho ao novo nó e defina seu texto através de TextFrame.
  7. Salve a apresentação.
import jpype
import asposeslides

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

from asposeslides.api import Presentation, SaveFormat, SmartArt

presentation = Presentation("SimpleSmartArt.pptx")
try:
    for shape in presentation.getSlides().get_Item(0).getShapes():
        if isinstance(shape, SmartArt):
            smart_art = shape
            node = smart_art.getAllNodes().addNode()
            node.getTextFrame().setText("Test")
            child_node = node.getChildNodes().addNode()
            child_node.getTextFrame().setText("New Node Added")
    presentation.save("AddSmartArtNode.pptx", SaveFormat.Pptx)
finally:
    presentation.dispose()

Adicionar um nó SmartArt em uma posição específica

O exemplo a seguir adiciona um nó filho em uma posição específica em um nó SmartArt.

  1. Crie uma instância da classe Presentation.
  2. Obtenha o primeiro slide pelo seu índice.
  3. Adicione uma forma SmartArt com o layout StackedList ao slide.
  4. Acesse o primeiro nó na forma SmartArt adicionada.
  5. Adicione um nó filho ao nó selecionado na posição 2 usando addNodeByPosition e defina seu texto.
  6. Salve a apresentação.
import jpype
import asposeslides

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

from asposeslides.api import Presentation, SaveFormat, SmartArtLayoutType

presentation = Presentation()
try:
    slide = presentation.getSlides().get_Item(0)
    smart_art = slide.getShapes().addSmartArt(0, 0, 400, 400, SmartArtLayoutType.StackedList)
    node = smart_art.getAllNodes().get_Item(0)
    child_node = node.getChildNodes().addNodeByPosition(2)
    child_node.getTextFrame().setText("Sample Text Added")
    presentation.save("AddSmartArtNodeByPosition.pptx", SaveFormat.Pptx)
finally:
    presentation.dispose()

Acessar um nó SmartArt

O exemplo a seguir acessa nós em uma forma SmartArt. O layout retornado por getLayout é somente leitura e é definido quando a forma SmartArt é adicionada.

  1. Crie uma instância da classe Presentation e carregue a apresentação que contém uma forma SmartArt.
  2. Obtenha o primeiro slide pelo seu índice.
  3. Itere por todas as formas no primeiro slide.
  4. Verifique se a forma é uma instância de SmartArt.
  5. Itere por todos os nós na forma SmartArt.
  6. Leia e exiba a posição, nível e texto de cada nó SmartArt.
import jpype
import asposeslides

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

from asposeslides.api import Presentation, SmartArt

presentation = Presentation("SmartArtShape.pptx")
try:
    slide = presentation.getSlides().get_Item(0)
    for shape in slide.getShapes():
        if isinstance(shape, SmartArt):
            smart_art = shape
            for i in range(smart_art.getAllNodes().size()):
                node = smart_art.getAllNodes().get_Item(i)
                print(node.getTextFrame().getText(), " ", node.getLevel(), " ", node.getPosition())
finally:
    presentation.dispose()

Acessar um nó filho SmartArt

O exemplo a seguir acessa os nós filhos de cada nó em uma forma SmartArt.

  1. Crie uma instância da classe Presentation e carregue a apresentação que contém uma forma SmartArt.
  2. Obtenha o primeiro slide pelo seu índice.
  3. Itere por todas as formas no primeiro slide.
  4. Verifique se a forma é uma instância de SmartArt.
  5. Itere por todos os nós na forma SmartArt.
  6. Para cada nó, itere pelos seus nós filhos.
  7. Leia e exiba a posição, nível e texto do nó filho.
import jpype
import asposeslides

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

from asposeslides.api import Presentation, SmartArt

presentation = Presentation("AccessChildNodes.pptx")
try:
    slide = presentation.getSlides().get_Item(0)
    for shape in slide.getShapes():
        if isinstance(shape, SmartArt):
            smart_art = shape
            for i in range(smart_art.getAllNodes().size()):
                parent_node = smart_art.getAllNodes().get_Item(i)
                for j in range(parent_node.getChildNodes().size()):
                    node = parent_node.getChildNodes().get_Item(j)
                    print("j = ", j, ", Text = ", node.getTextFrame().getText(), ",  Level = ", node.getLevel(), ", Position = ", node.getPosition())
finally:
    presentation.dispose()

Acessar um nó filho SmartArt em uma posição específica

O exemplo a seguir acessa um nó filho em um índice específico na coleção de seu nó pai.

  1. Crie uma instância da classe Presentation.
  2. Obtenha o primeiro slide pelo seu índice.
  3. Adicione uma forma SmartArt com o layout StackedList.
  4. Acesse a forma SmartArt adicionada.
  5. Acesse o nó no índice 0 na forma SmartArt.
  6. Acesse o nó filho no índice 1 usando get_Item.
  7. Leia e exiba a posição, nível e texto do nó filho.
import jpype
import asposeslides

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

from asposeslides.api import Presentation, SmartArtLayoutType

presentation = Presentation()
try:
    slide = presentation.getSlides().get_Item(0)
    smart_art = slide.getShapes().addSmartArt(0, 0, 400, 400, SmartArtLayoutType.StackedList)
    node = smart_art.getAllNodes().get_Item(0)
    position = 1
    child_node = node.getChildNodes().get_Item(position)
    print("Text = ", child_node.getTextFrame().getText(), ",  Level = ", child_node.getLevel(), ", Position = ", child_node.getPosition())
finally:
    presentation.dispose()

Remover um nó SmartArt

O exemplo a seguir remove um nó de uma forma SmartArt.

  1. Crie uma instância da classe Presentation e carregue a apresentação que contém uma forma SmartArt.
  2. Obtenha o primeiro slide pelo seu índice.
  3. Itere por todas as formas no primeiro slide.
  4. Verifique se a forma é uma instância de SmartArt.
  5. Verifique se a forma SmartArt contém pelo menos um nó.
  6. Selecione o nó SmartArt a ser excluído.
  7. Remova o nó selecionado usando removeNode.
  8. Salve a apresentação.
import jpype
import asposeslides

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

from asposeslides.api import Presentation, SaveFormat, SmartArt

presentation = Presentation("AddSmartArtNode.pptx")
try:
    for shape in presentation.getSlides().get_Item(0).getShapes():
        if isinstance(shape, SmartArt):
            smart_art = shape
            if smart_art.getAllNodes().size() > 0:
                node = smart_art.getAllNodes().get_Item(0)
                smart_art.getAllNodes().removeNode(node)
    presentation.save("RemoveSmartArtNode.pptx", SaveFormat.Pptx)
finally:
    presentation.dispose()

Remover um nó SmartArt de uma posição específica

O exemplo a seguir remove um nó filho em um índice específico na coleção de nós de um SmartArt.

  1. Crie uma instância da classe Presentation.
  2. Obtenha o primeiro slide pelo seu índice.
  3. Itere por todas as formas no primeiro slide.
  4. Verifique se a forma é uma instância de SmartArt.
  5. Acesse o nó SmartArt no índice 0 se existir.
  6. Verifique se o nó SmartArt selecionado tem pelo menos dois nós filhos.
  7. Remova o nó filho no índice 1 usando removeNode.
  8. Salve a apresentação.
import jpype
import asposeslides

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

from asposeslides.api import Presentation, SaveFormat, SmartArt

presentation = Presentation("AddSmartArtNode.pptx")
try:
    for shape in presentation.getSlides().get_Item(0).getShapes():
        if isinstance(shape, SmartArt):
            smart_art = shape
            if smart_art.getAllNodes().size() > 0:
                node = smart_art.getAllNodes().get_Item(0)
                if node.getChildNodes().size() >= 2:
                    node.getChildNodes().removeNode(1)
    presentation.save("RemoveSmartArtNodeByPosition.pptx", SaveFormat.Pptx)
finally:
    presentation.dispose()

Definir uma posição personalizada para um nó filho em um objeto SmartArt

Aspose.Slides for Python via Java oferece suporte à definição da posição de um SmartArtShape usando setX e setY. O exemplo a seguir define uma posição personalizada, tamanho e rotação para as formas dos nós SmartArt. A adição de novos nós recalcula as posições e tamanhos de todos os nós. O posicionamento personalizado permite organizar os nós conforme necessário.

import jpype
import asposeslides

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

from asposeslides.api import Presentation, SaveFormat, SmartArtLayoutType

presentation = Presentation("SimpleSmartArt.pptx")
try:
    smart_art = presentation.getSlides().get_Item(0).getShapes().addSmartArt(20, 20, 600, 500, SmartArtLayoutType.OrganizationChart)
    node = smart_art.getAllNodes().get_Item(1)
    shape = node.getShapes().get_Item(1)
    shape.setX(shape.getX() + shape.getWidth() * 2)
    shape.setY(shape.getY() - shape.getHeight() * 2)
    node = smart_art.getAllNodes().get_Item(2)
    shape = node.getShapes().get_Item(1)
    shape.setWidth(shape.getWidth() + shape.getWidth() * 2)
    node = smart_art.getAllNodes().get_Item(3)
    shape = node.getShapes().get_Item(1)
    shape.setHeight(shape.getHeight() + shape.getHeight() * 2)
    node = smart_art.getAllNodes().get_Item(4)
    shape = node.getShapes().get_Item(1)
    shape.setRotation(90)
    presentation.save("SmartArt.pptx", SaveFormat.Pptx)
finally:
    presentation.dispose()

Verificar um nó assistente

A forma SmartArt de origem a seguir é usada neste exemplo.

SmartArt shape
Figura: Forma SmartArt de origem em um slide

O exemplo a seguir identifica nós assistentes em uma coleção de nós SmartArt e os altera para nós normais.

  1. Crie uma instância da classe Presentation e carregue a apresentação que contém uma forma SmartArt.
  2. Obtenha o primeiro slide pelo seu índice.
  3. Itere por todas as formas no primeiro slide.
  4. Verifique se a forma é uma instância de SmartArt.
  5. Itere por todos os nós na forma SmartArt e verifique se são Assistant Nodes.
  6. Altere cada nó assistente para um nó normal.
  7. Salve a apresentação.
import jpype
import asposeslides

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

from asposeslides.api import Presentation, SaveFormat, SmartArt

presentation = Presentation("AddNodes.pptx")
try:
    for shape in presentation.getSlides().get_Item(0).getShapes():
        if isinstance(shape, SmartArt):
            smart_art = shape
            for i in range(smart_art.getAllNodes().size()):
                node = smart_art.getAllNodes().get_Item(i)
                if node.isAssistant():
                    node.setAssistant(False)
    presentation.save("ChangeAssistantNode.pptx", SaveFormat.Pptx)
finally:
    presentation.dispose()
SmartArt shape
Figura: Nós assistentes alterados em uma forma SmartArt em um slide

Definir o formato de preenchimento de um nó

Aspose.Slides for Python via Java permite adicionar formas SmartArt personalizadas e definir seu formato de preenchimento. Este artigo explica como criar e acessar formas SmartArt e definir seu formato de preenchimento usando Aspose.Slides for Python via Java.

Por favor, siga os passos abaixo:

  1. Crie uma instância da classe Presentation.
  2. Obtenha um slide pelo seu índice.
  3. Adicione uma forma SmartArt com o layout ClosedChevronProcess.
  4. Defina o FillFormat para os nós da forma SmartArt.
  5. Grave a apresentação modificada como um arquivo PPTX.
import jpype
import asposeslides

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

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

presentation = Presentation()
try:
    slide = presentation.getSlides().get_Item(0)
    chevron = slide.getShapes().addSmartArt(10, 10, 800, 60, SmartArtLayoutType.ClosedChevronProcess)
    node = chevron.getAllNodes().addNode()
    node.getTextFrame().setText("Some text")
    for item in node.getShapes():
        item.getFillFormat().setFillType(FillType.Solid)
        item.getFillFormat().getSolidFillColor().setColor(Color.RED)
    presentation.save("TestSmart.pptx", SaveFormat.Pptx)
finally:
    presentation.dispose()

Gerar uma miniatura de um nó filho SmartArt

Para gerar uma miniatura de um nó filho SmartArt, siga estas etapas:

  1. Crie uma instância da classe Presentation.
  2. Adicione uma forma SmartArt.
  3. Obtenha um nó pelo seu índice.
  4. Obtenha a imagem da miniatura.
  5. Salve a imagem da miniatura em qualquer formato de imagem desejado.
import jpype
import asposeslides

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

from asposeslides.api import Presentation, SmartArtLayoutType, ImageFormat

presentation = Presentation()
try:
    smart_art = presentation.getSlides().get_Item(0).getShapes().addSmartArt(10, 10, 400, 300, SmartArtLayoutType.BasicCycle)
    node = smart_art.getNodes().get_Item(1)
    image = node.getShapes().get_Item(0).getImage()
    try:
        image.save("SmartArt_ChildNode_Thumbnail.png", ImageFormat.Png)
    finally:
        image.dispose()
finally:
    presentation.dispose()

FAQ

A animação SmartArt é suportada?

Sim. SmartArt é tratada como uma forma comum, portanto você pode aplicar animações padrão (entrada, saída, ênfase, caminhos de movimento) e ajustar o tempo. Você também pode animar formas dentro dos nós SmartArt quando necessário.

Como posso localizar de forma confiável um SmartArt específico em um slide se seu ID interno for desconhecido?

Atribua e procure por texto alternativo. Definir um texto alternativo distintivo no SmartArt permite encontrá-lo programaticamente sem depender de identificadores internos.

A aparência do SmartArt será preservada ao converter a apresentação para PDF?

Sim. Aspose.Slides renderiza SmartArt com alta fidelidade visual durante a exportação para PDF, preservando layout, cores e efeitos.

Posso extrair uma imagem de todo o SmartArt (para pré-visualizações ou relatórios)?

Sim. Você pode renderizar uma forma SmartArt para formatos raster ou para SVG para saída vetorial escalável, tornando-a adequada para miniaturas, relatórios ou uso na web.