Управление узлами фигур SmartArt в презентациях с помощью Python

Обзор

Графика SmartArt в презентациях PowerPoint организована с помощью узлов, содержащих текст и определяющих структуру диаграммы. Aspose.Slides позволяет программно работать с этими узлами SmartArt: добавлять новые узлы и дочерние узлы, вставлять дочерние узлы в определённую позицию, получать доступ к существующим узлам и считывать их текст, уровень и позицию.

В этой статье описывается, как управлять узлами фигур SmartArt. Показано, как удалять узлы, работать с дочерними узлами по индексу или позиции, преобразовывать вспомогательный узел в обычный, менять позицию, размер и вращение фигур узлов SmartArt, задавать форматы заливки узлов и генерировать изображение‑миниатюру для дочернего узла SmartArt.

Добавление узла SmartArt

Aspose.Slides for Python via Java предоставляет API для управления фигурами SmartArt. В следующем примере добавляется узел и дочерний узел к фигуре SmartArt.

  1. Создайте экземпляр класса Presentation и загрузите презентацию, содержащую фигуру SmartArt.
  2. Получите первый слайд по его индексу.
  3. Пройдите по всем фигурам на первом слайде.
  4. Проверьте, является ли фигура экземпляром SmartArt.
  5. Add a new node к node collection фигуры SmartArt и задайте её текст через TextFrame.
  6. Add child node к новому узлу и задайте его текст через TextFrame.
  7. Сохраните презентацию.
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()

Добавление узла SmartArt в определённой позиции

В следующем примере добавляется дочерний узел в определённую позицию узла SmartArt.

  1. Создайте экземпляр класса Presentation.
  2. Получите первый слайд по его индексу.
  3. Добавьте фигуру SmartArt с макетом StackedList на слайд.
  4. Получите первый узел добавленной фигуры SmartArt.
  5. Добавьте дочерний узел к выбранному узлу на позицию 2 с помощью addNodeByPosition и задайте его текст.
  6. Сохраните презентацию.
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()

Доступ к узлу SmartArt

В следующем примере осуществляется доступ к узлам фигуры SmartArt. Макет, возвращаемый getLayout, только для чтения и задаётся при добавлении фигуры SmartArt.

  1. Создайте экземпляр класса Presentation и загрузите презентацию, содержащую фигуру SmartArt.
  2. Получите первый слайд по его индексу.
  3. Пройдите по всем фигурам на первом слайде.
  4. Проверьте, является ли фигура экземпляром SmartArt.
  5. Пройдите по всем nodes в фигуре SmartArt.
  6. Считайте и отобразите позицию, уровень и текст каждого узла 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()

Доступ к дочернему узлу SmartArt

В следующем примере осуществляется доступ к дочерним узлам каждого узла в фигуре SmartArt.

  1. Создайте экземпляр класса Presentation и загрузите презентацию, содержащую фигуру SmartArt.
  2. Получите первый слайд по его индексу.
  3. Пройдите по всем фигурам на первом слайде.
  4. Проверьте, является ли фигура экземпляром SmartArt.
  5. Пройдите по всем nodes в фигуре SmartArt.
  6. Для каждого узла пройдите по его child nodes.
  7. Считайте и отобразите позицию, уровень и текст child node.
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()

Доступ к дочернему узлу SmartArt в определённой позиции

В следующем примере осуществляется доступ к дочернему узлу по определённому индексу в коллекции узлов его родителя.

  1. Создайте экземпляр класса Presentation.
  2. Получите первый слайд по его индексу.
  3. Добавьте фигуру SmartArt с макетом StackedList.
  4. Получите добавленную фигуру SmartArt.
  5. Получите узел с индексом 0 в фигуре SmartArt.
  6. Получите дочерний узел с индексом 1 с помощью get_Item.
  7. Считайте и отобразите позицию, уровень и текст child node.
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()

Удаление узла SmartArt

В следующем примере удаляется узел из фигуры SmartArt.

  1. Создайте экземпляр класса Presentation и загрузите презентацию, содержащую фигуру SmartArt.
  2. Получите первый слайд по его индексу.
  3. Пройдите по всем фигурам на первом слайде.
  4. Проверьте, является ли фигура экземпляром SmartArt.
  5. Убедитесь, что фигура SmartArt содержит хотя бы один узел.
  6. Выберите узел SmartArt, подлежащий удалению.
  7. Удалите выбранный узел с помощью removeNode.
  8. Сохраните презентацию.
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()

Удаление узла SmartArt из определённой позиции

В следующем примере удаляется дочерний узел по определённому индексу в коллекции узлов фигуры SmartArt.

  1. Создайте экземпляр класса Presentation и загрузите презентацию, содержащую фигуру SmartArt.
  2. Получите первый слайд по его индексу.
  3. Пройдите по всем фигурам на первом слайде.
  4. Проверьте, является ли фигура экземпляром SmartArt.
  5. При наличии доступа получите узел SmartArt с индексом 0.
  6. Убедитесь, что выбранный узел SmartArt имеет как минимум два дочерних узла.
  7. Удалите дочерний узел с индексом 1 с помощью removeNode.
  8. Сохраните презентацию.
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()

Установка пользовательской позиции для дочернего узла в объекте SmartArt

Aspose.Slides for Python via Java поддерживает задание позиции SmartArtShape с помощью setX и setY. В следующем примере задаются пользовательская позиция, размер и вращение фигур узлов SmartArt. Добавление новых узлов пересчитывает позиции и размеры всех узлов. Пользовательское позиционирование позволяет размещать узлы согласно требованиям.

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

Проверка вспомогательного узла

В примере используется следующая исходная фигура SmartArt.

SmartArt shape
Рисунок: Исходная фигура SmartArt на слайде

В следующем примере идентифицируются вспомогательные узлы в коллекции узлов SmartArt и преобразуются в обычные узлы.

  1. Создайте экземпляр класса Presentation и загрузите презентацию, содержащую фигуру SmartArt.
  2. Получите первый слайд по его индексу.
  3. Пройдите по всем фигурам на первом слайде.
  4. Проверьте, является ли фигура экземпляром SmartArt.
  5. Пройдите по всем узлам в фигуре SmartArt и проверьте, являются ли они Assistant Nodes.
  6. Преобразуйте каждый вспомогательный узел в обычный.
  7. Сохраните презентацию.
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
Рисунок: Вспомогательные узлы, преобразованные в обычные, в фигуре SmartArt на слайде

Задание формата заливки узла

Aspose.Slides for Python via Java позволяет добавлять пользовательские фигуры SmartArt и задавать их формат заливки. В этой статье объясняется, как создавать и получать доступ к фигурам SmartArt и задавать их формат заливки с помощью Aspose.Slides for Python via Java.

Выполните следующие шаги:

  1. Создайте экземпляр класса Presentation.
  2. Получите слайд по его индексу.
  3. Добавьте фигуру SmartArt с макетом ClosedChevronProcess.
  4. Задайте FillFormat для узлов фигуры SmartArt.
  5. Запишите изменённую презентацию в файл 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()

Создание миниатюры дочернего узла SmartArt

Чтобы создать миниатюру дочернего узла SmartArt, выполните следующие действия:

  1. Создайте экземпляр класса Presentation.
  2. Add a SmartArt shape.
  3. Получите узел по его индексу.
  4. Получите изображение‑миниатюру.
  5. Сохраните изображение‑миниатюру в любом требуемом формате изображения.
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

Поддерживается ли анимация SmartArt?

Да. SmartArt рассматривается как обычная фигура, поэтому вы можете применять стандартные анимации (вход, выход, акцент, траектории движения) и настраивать время. При необходимости можно анимировать фигуры внутри узлов SmartArt.

Как надёжно найти конкретный SmartArt на слайде, если его внутренний идентификатор неизвестен?

Назначьте и ищите по alternative text. Установка отличающегося альтернативного текста для SmartArt позволяет находить её программно без использования внутренних идентификаторов.

Сохранится ли внешний вид SmartArt при конвертации презентации в PDF?

Да. Aspose.Slides рендерит SmartArt с высокой визуальной точностью во время PDF export, сохраняя макет, цвета и эффекты.

Можно ли извлечь изображение всего SmartArt (для превью или отчётов)?

Да. Вы можете экспортировать фигуру SmartArt в растровые форматы или в SVG для масштабируемого векторного вывода, что подходит для миниатюр, отчетов или веб‑использования.