Управление узлами фигур SmartArt в презентациях с помощью Python
Обзор
Графика SmartArt в презентациях PowerPoint организована с помощью узлов, содержащих текст и определяющих структуру диаграммы. Aspose.Slides позволяет программно работать с этими узлами SmartArt: добавлять новые узлы и дочерние узлы, вставлять дочерние узлы в определённую позицию, получать доступ к существующим узлам и считывать их текст, уровень и позицию.
В этой статье описывается, как управлять узлами фигур SmartArt. Показано, как удалять узлы, работать с дочерними узлами по индексу или позиции, преобразовывать вспомогательный узел в обычный, менять позицию, размер и вращение фигур узлов SmartArt, задавать форматы заливки узлов и генерировать изображение‑миниатюру для дочернего узла SmartArt.
Добавление узла SmartArt
Aspose.Slides for Python via Java предоставляет API для управления фигурами SmartArt. В следующем примере добавляется узел и дочерний узел к фигуре SmartArt.
- Создайте экземпляр класса Presentation и загрузите презентацию, содержащую фигуру SmartArt.
- Получите первый слайд по его индексу.
- Пройдите по всем фигурам на первом слайде.
- Проверьте, является ли фигура экземпляром SmartArt.
- Add a new node к node collection фигуры SmartArt и задайте её текст через TextFrame.
- Add child node к новому узлу и задайте его текст через TextFrame.
- Сохраните презентацию.
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.
- Создайте экземпляр класса Presentation.
- Получите первый слайд по его индексу.
- Добавьте фигуру SmartArt с макетом StackedList на слайд.
- Получите первый узел добавленной фигуры SmartArt.
- Добавьте дочерний узел к выбранному узлу на позицию 2 с помощью addNodeByPosition и задайте его текст.
- Сохраните презентацию.
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.
- Создайте экземпляр класса Presentation и загрузите презентацию, содержащую фигуру SmartArt.
- Получите первый слайд по его индексу.
- Пройдите по всем фигурам на первом слайде.
- Проверьте, является ли фигура экземпляром SmartArt.
- Пройдите по всем nodes в фигуре SmartArt.
- Считайте и отобразите позицию, уровень и текст каждого узла 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.
- Создайте экземпляр класса Presentation и загрузите презентацию, содержащую фигуру SmartArt.
- Получите первый слайд по его индексу.
- Пройдите по всем фигурам на первом слайде.
- Проверьте, является ли фигура экземпляром SmartArt.
- Пройдите по всем nodes в фигуре SmartArt.
- Для каждого узла пройдите по его child nodes.
- Считайте и отобразите позицию, уровень и текст 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 в определённой позиции
В следующем примере осуществляется доступ к дочернему узлу по определённому индексу в коллекции узлов его родителя.
- Создайте экземпляр класса Presentation.
- Получите первый слайд по его индексу.
- Добавьте фигуру SmartArt с макетом StackedList.
- Получите добавленную фигуру SmartArt.
- Получите узел с индексом 0 в фигуре SmartArt.
- Получите дочерний узел с индексом 1 с помощью get_Item.
- Считайте и отобразите позицию, уровень и текст 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.
- Создайте экземпляр класса Presentation и загрузите презентацию, содержащую фигуру SmartArt.
- Получите первый слайд по его индексу.
- Пройдите по всем фигурам на первом слайде.
- Проверьте, является ли фигура экземпляром SmartArt.
- Убедитесь, что фигура SmartArt содержит хотя бы один узел.
- Выберите узел SmartArt, подлежащий удалению.
- Удалите выбранный узел с помощью removeNode.
- Сохраните презентацию.
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.
- Создайте экземпляр класса Presentation и загрузите презентацию, содержащую фигуру SmartArt.
- Получите первый слайд по его индексу.
- Пройдите по всем фигурам на первом слайде.
- Проверьте, является ли фигура экземпляром SmartArt.
- При наличии доступа получите узел SmartArt с индексом 0.
- Убедитесь, что выбранный узел SmartArt имеет как минимум два дочерних узла.
- Удалите дочерний узел с индексом 1 с помощью removeNode.
- Сохраните презентацию.
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()
Проверка вспомогательного узла
Note
В этом разделе рассматриваются фигуры SmartArt, добавляемые в слайды презентации программно с помощью Aspose.Slides for Python via Java.В примере используется следующая исходная фигура SmartArt.
![]() |
|---|
| Рисунок: Исходная фигура SmartArt на слайде |
В следующем примере идентифицируются вспомогательные узлы в коллекции узлов SmartArt и преобразуются в обычные узлы.
- Создайте экземпляр класса Presentation и загрузите презентацию, содержащую фигуру SmartArt.
- Получите первый слайд по его индексу.
- Пройдите по всем фигурам на первом слайде.
- Проверьте, является ли фигура экземпляром SmartArt.
- Пройдите по всем узлам в фигуре SmartArt и проверьте, являются ли они Assistant Nodes.
- Преобразуйте каждый вспомогательный узел в обычный.
- Сохраните презентацию.
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 на слайде |
Задание формата заливки узла
Aspose.Slides for Python via Java позволяет добавлять пользовательские фигуры SmartArt и задавать их формат заливки. В этой статье объясняется, как создавать и получать доступ к фигурам SmartArt и задавать их формат заливки с помощью Aspose.Slides for Python via Java.
Выполните следующие шаги:
- Создайте экземпляр класса Presentation.
- Получите слайд по его индексу.
- Добавьте фигуру SmartArt с макетом ClosedChevronProcess.
- Задайте FillFormat для узлов фигуры SmartArt.
- Запишите изменённую презентацию в файл 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, выполните следующие действия:
- Создайте экземпляр класса Presentation.
- Add a SmartArt shape.
- Получите узел по его индексу.
- Получите изображение‑миниатюру.
- Сохраните изображение‑миниатюру в любом требуемом формате изображения.
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 для масштабируемого векторного вывода, что подходит для миниатюр, отчетов или веб‑использования.

