使用 Python 管理演示文稿中的 SmartArt 形状节点

添加 SmartArt 节点

Aspose.Slides for Python via .NET 提供了最简洁的 API,以最简便的方式管理 SmartArt 形状。以下示例代码演示如何在 SmartArt 形状中添加节点和子节点。

  • 创建 Presentation 类的实例并加载包含 SmartArt 形状的演示文稿。
  • 使用索引获取第一张幻灯片的引用。
  • 遍历第一张幻灯片中的所有形状。
  • 检查形状是否为 SmartArt 类型,如果是,则将选定的形状强制转换为 SmartArt。
  • 在 SmartArt 形状的 NodeCollection 中添加新节点并在 TextFrame 中设置文本。
  • 在新添加的 SmartArt 节点中添加子节点并在 TextFrame 中设置文本。
  • 保存演示文稿。
import aspose.pydrawing as draw
import aspose.slides as slides
import aspose.slides.smartart as art

# 加载所需的演示文稿
with slides.Presentation(path + "AddNodes.pptx") as pres:
    # 遍历第一张幻灯片中的所有形状
    for shape in pres.slides[0].shapes:

        # 检查形状是否为 SmartArt 类型
        if type(shape) is art.SmartArt:
            # 添加新的 SmartArt 节点
            node1 = shape.all_nodes.add_node()
            # 添加文本
            node1.text_frame.text = "Test"

            # 在父节点中添加新的子节点。它将被添加到集合的末尾
            new_node = node1.child_nodes.add_node()

            # 添加文本
            new_node.text_frame.text = "New Node Added"

    # 保存演示文稿
    pres.save("AddSmartArtNode_out.pptx", slides.export.SaveFormat.PPTX)

在特定位置添加 SmartArt 节点

以下示例代码说明如何在 SmartArt 形状的相应节点下的特定位置添加子节点。

  • 创建 Presentation 类的实例。
  • 使用索引获取第一张幻灯片的引用。
  • 在目标幻灯片中添加 StackedList 类型的 SmartArt 形状。
  • 访问已添加 SmartArt 形状的第一个节点。
  • 在位置 2 处为选定的节点添加子节点并设置其文本。
  • 保存演示文稿。
import aspose.pydrawing as draw
import aspose.slides as slides
import aspose.slides.smartart as art

# 创建演示文稿实例
with slides.Presentation() as pres:
    # 访问演示文稿幻灯片
    slide = pres.slides[0]

    # 添加 Smart Art IShape
    smart = slide.shapes.add_smart_art(0, 0, 400, 400, art.SmartArtLayoutType.STACKED_LIST)

    # 访问索引为 0 的 SmartArt 节点
    node = smart.all_nodes[0]

    # 在父节点中于位置 2 添加新的子节点
    chNode = node.child_nodes.add_node_by_position(2)

    # 添加文本
    chNode.text_frame.text = "Sample text Added"

    # 保存演示文稿
    pres.save("AddSmartArtNodeByPosition_out.pptx", slides.export.SaveFormat.PPTX)

访问 SmartArt 节点

以下示例代码帮助访问 SmartArt 形状中的节点。请注意,SmartArt 的 LayoutType 为只读,且仅在添加 SmartArt 形状时设置,无法更改。

  • 创建 Presentation 类的实例并加载包含 SmartArt 形状的演示文稿。
  • 使用索引获取第一张幻灯片的引用。
  • 遍历第一张幻灯片中的所有形状。
  • 检查形状是否为 SmartArt 类型,如果是,则将选定的形状强制转换为 SmartArt。
  • 遍历 SmartArt 形状中的所有节点。
  • 访问并显示节点的位置信息、层级和文本。
import aspose.pydrawing as draw
import aspose.slides as slides
import aspose.slides.smartart as art

# 加载所需的演示文稿
with slides.Presentation(path + "AccessSmartArt.pptx") as pres:
    # 遍历第一张幻灯片中的所有形状
    for shape in pres.slides[0].shapes:
        # 检查形状是否为 SmartArt 类型
        if type(shape) is art.SmartArt:
            # 遍历 SmartArt 中的所有节点
            for i in range(len(shape.all_nodes)):
                # 访问索引 i 处的 SmartArt 节点
                node = shape.all_nodes[i]

                # 打印 SmartArt 节点参数
                print("i = {0}, text = {1},  level = {2}, position = {3}".format(i, node.text_frame.text, node.level, node.position))

访问 SmartArt 子节点

以下示例代码帮助访问 SmartArt 形状中各节点的子节点。

  • 创建 PresentationEx 类的实例并加载包含 SmartArt 形状的演示文稿。
  • 使用索引获取第一张幻灯片的引用。
  • 遍历第一张幻灯片中的所有形状。
  • 检查形状是否为 SmartArt 类型,如果是,则将选定的形状强制转换为 SmartArtEx。
  • 遍历 SmartArt 形状中的所有节点。
  • 对于每个选定的 SmartArt 节点,遍历其内部的所有子节点。
  • 访问并显示子节点的位置信息、层级和文本。
import aspose.pydrawing as draw
import aspose.slides as slides
import aspose.slides.smartart as art

# 加载所需的演示文稿
with slides.Presentation(path + "AccessChildNodes.pptx") as pres:
    # 遍历第一张幻灯片中的所有形状
    for shape in pres.slides[0].shapes:
        # 检查形状是否为 SmartArt 类型
        if type(shape) is art.SmartArt:
            # 遍历 SmartArt 中的所有节点
            for node0 in shape.all_nodes:
                # 遍历子节点
                for j in range(len(node0.child_nodes)):
                    # 访问 SmartArt 节点中的子节点
                    node = node0.child_nodes[j]

                    # 打印 SmartArt 子节点参数
                    print("j = {0}, text = {1},  level = {2}, position = {3}".format(j, node.text_frame.text, node.level, node.position))

在特定位置访问 SmartArt 子节点

本示例演示如何在特定位置访问 SmartArt 形状各节点的子节点。

  • 创建 Presentation 类的实例。
  • 使用索引获取第一张幻灯片的引用。
  • 添加 StackedList 类型的 SmartArt 形状。
  • 访问已添加的 SmartArt 形状。
  • 获取索引为 0 的节点。
  • 使用 GetNodeByPosition() 方法在该节点中访问位置 1 的子节点。
  • 访问并显示子节点的位置信息、层级和文本。
import aspose.pydrawing as draw
import aspose.slides as slides
import aspose.slides.smartart as art

# 实例化演示文稿
with slides.Presentation() as pres:
    # 访问第一张幻灯片
    slide = pres.slides[0]
    # 在第一张幻灯片中添加 SmartArt 形状
    smart = slide.shapes.add_smart_art(0, 0, 400, 400, art.SmartArtLayoutType.STACKED_LIST)
    # 访问索引为 0 的 SmartArt 节点
    node = smart.all_nodes[0]
    # 在父节点中访问位置为 1 的子节点
    position = 1
    chNode = node.child_nodes[position] 
    # 打印 SmartArt 子节点参数
    print("j = {0}, text = {1},  level = {2}, position = {3}".format(position, chNode.text_frame.text, chNode.level, chNode.position))

删除 SmartArt 节点

本示例演示如何删除 SmartArt 形状中的节点。

  • 创建 Presentation 类的实例并加载包含 SmartArt 形状的演示文稿。
  • 使用索引获取第一张幻灯片的引用。
  • 遍历第一张幻灯片中的所有形状。
  • 检查形状是否为 SmartArt 类型,如果是,则将选定的形状强制转换为 SmartArt。
  • 检查 SmartArt 是否包含超过 0 个节点。
  • 选择要删除的 SmartArt 节点。
  • 使用 RemoveNode() 方法删除选定的节点并保存演示文稿。
import aspose.pydrawing as draw
import aspose.slides as slides
import aspose.slides.smartart as art

# 加载所需的演示文稿
with slides.Presentation(path + "RemoveNode.pptx") as pres:
    # 遍历第一张幻灯片中的所有形状
    for shape in pres.slides[0].shapes:
        # 检查形状是否为 SmartArt 类型
        if type(shape) is art.SmartArt:
            # 将形状强制转换为 SmartArtEx
            if len(shape.all_nodes) > 0:
                # 访问索引为 0 的 SmartArt 节点
                node = shape.all_nodes[0]

                # 删除选中的节点
                shape.all_nodes.remove_node(node)

    # 保存演示文稿
    pres.save("RemoveSmartArtNode_out.pptx", slides.export.SaveFormat.PPTX)

在特定位置删除 SmartArt 节点

本示例演示如何在特定位置删除 SmartArt 形状中的节点。

  • 创建 Presentation 类的实例并加载包含 SmartArt 形状的演示文稿。
  • 使用索引获取第一张幻灯片的引用。
  • 遍历第一张幻灯片中的所有形状。
  • 检查形状是否为 SmartArt 类型,如果是,则将选定的形状强制转换为 SmartArt。
  • 选择索引为 0 的 SmartArt 节点。
  • 检查选定的 SmartArt 节点是否拥有超过 2 个子节点。
  • 使用 RemoveNodeByPosition() 方法删除位置为 1 的子节点。
  • 保存演示文稿。
import aspose.pydrawing as draw
import aspose.slides as slides
import aspose.slides.smartart as art

# 加载所需的演示文稿
with slides.Presentation(path + "RemoveNodeSpecificPosition.pptx") as pres:             
    # 遍历第一张幻灯片中的所有形状
    for shape in pres.slides[0].shapes:
        # 检查形状是否为 SmartArt 类型
        if type(shape) is art.SmartArt:
            # 将形状强制转换为 SmartArt
            if len(shape.all_nodes) > 0:
                # 访问索引为 0 的 SmartArt 节点
                node = shape.all_nodes[0]
                if len(node.child_nodes) >= 2:
                    # 删除位置为 1 的子节点
                    node.child_nodes.remove_node(1)

    # 保存演示文稿
    pres.save("RemoveSmartArtNodeByPosition_out.pptx", slides.export.SaveFormat.PPTX)

为 SmartArt 子节点设置自定义位置

现在 Aspose.Slides for Python via .NET 支持设置 SmartArtShape 的 X 和 Y 属性。下面的代码片段展示了如何设置自定义的 SmartArtShape 位置、大小和旋转,请注意添加新节点会重新计算所有节点的位置和大小。

import aspose.pydrawing as draw
import aspose.slides as slides
import aspose.slides.smartart as art

# 加载所需的演示文稿
with slides.Presentation(path + "AccessChildNodes.pptx") as pres: 
	smart = pres.slides[0].shapes.add_smart_art(20, 20, 600, 500, art.SmartArtLayoutType.ORGANIZATION_CHART)

	# 将 SmartArt 形状移动到新位置
	node = smart.all_nodes[1]
	shape = node.shapes[1]
	shape.x += (shape.width * 2)
	shape.y -= (shape.height / 2)

	# 更改 SmartArt 形状的宽度
	node = smart.all_nodes[2]
	shape = node.shapes[1]
	shape.width += (shape.width / 2)

	# 更改 SmartArt 形状的高度
	node = smart.all_nodes[3]
	shape = node.shapes[1]
	shape.height += (shape.height / 2)

	# 更改 SmartArt 形状的旋转
	node = smart.all_nodes[4]
	shape = node.shapes[1]
	shape.rotation = 90

	pres.save("SmartArt.pptx", slides.export.SaveFormat.PPTX)

检查助理节点

以下示例代码将探讨如何识别 SmartArt 节点集合中的助理节点并对其进行修改。

  • 创建 PresentationEx 类的实例并加载包含 SmartArt 形状的演示文稿。
  • 使用索引获取第二张幻灯片的引用。
  • 遍历第一张幻灯片中的所有形状。
  • 检查形状是否为 SmartArt 类型,如果是,则将选定的形状强制转换为 SmartArtEx。
  • 遍历 SmartArt 形状中的所有节点并检查它们是否为助理节点。
  • 将助理节点的状态更改为普通节点。
  • 保存演示文稿。
import aspose.pydrawing as draw
import aspose.slides as slides
import aspose.slides.smartart as art

# 创建演示文稿实例
with slides.Presentation(path + "AssistantNode.pptx") as pres: 
    # 遍历第一张幻灯片中的所有形状
    for shape in pres.slides[0].shapes:
        # 检查形状是否为 SmartArt 类型
        if type(shape) is art.SmartArt:
            # 遍历 SmartArt 形状的所有节点
            for node in shape.all_nodes:
                tc = node.text_frame.text
                # 检查节点是否为助理节点
                if node.is_assistant:
                    # 将助理节点设为 false 并使其成为普通节点
                    node.is_assistant = False
    # 保存演示文稿
    pres.save("ChangeAssitantNode_out.pptx", slides.export.SaveFormat.PPTX)

设置节点的填充格式

Aspose.Slides for Python via .NET 使得添加自定义 SmartArt 形状并设置其填充格式成为可能。本文说明如何创建和访问 SmartArt 形状以及使用 Aspose.Slides for Python via .NET 设置其填充格式。

请按以下步骤操作:

  • 创建 Presentation 类的实例。
  • 使用索引获取幻灯片的引用。
  • 通过设置 LayoutType 添加 SmartArt 形状。
  • 为 SmartArt 形状的节点设置 FillFormat。
  • 将修改后的演示文稿写入 PPTX 文件。
import aspose.pydrawing as draw
import aspose.slides as slides
import aspose.slides.smartart as art

with slides.Presentation() as presentation: 
    # 访问幻灯片
    slide = presentation.slides[0]

    # 添加 SmartArt 形状和节点
    chevron = slide.shapes.add_smart_art(10, 10, 800, 60, art.SmartArtLayoutType.CLOSED_CHEVRON_PROCESS)
    node = chevron.all_nodes.add_node()
    node.text_frame.text = "Some text"

    # 设置节点填充颜色
    for item in node.shapes:
        item.fill_format.fill_type = slides.FillType.SOLID
        item.fill_format.solid_fill_color.color = draw.Color.red

    # 保存演示文稿
    presentation.save("FillFormat_SmartArt_ShapeNode_out.pptx", slides.export.SaveFormat.PPTX)

生成 SmartArt 子节点的缩略图

开发者可以按以下步骤生成 SmartArt 子节点的缩略图:

  1. 实例化表示 PPTX 文件的 Presentation 类。
  2. 添加 SmartArt。
  3. 使用索引获取节点的引用。
  4. 获取缩略图图像。
  5. 将缩略图保存为任意所需的图像格式。

下面的示例演示如何生成 SmartArt 子节点的缩略图

import aspose.slides as slides
import aspose.slides.smartart as art

# 实例化表示 PPTX 文件的 Presentation 类
with slides.Presentation() as presentation: 
    # 添加 SmartArt
    smart = pres.slides[0].shapes.add_smart_art(10, 10, 400, 300, art.SmartArtLayoutType.BASIC_CYCLE)

    # 通过索引获取节点的引用
    node = smart.nodes[1]

    # 获取缩略图
    with node.shapes[0].get_image() as bmp:
        # 保存缩略图
        bmp.save("SmartArt_ChildNote_Thumbnail_out.jpeg", slides.ImageFormat.JPEG)

常见问题

是否支持 SmartArt 动画?

是的。SmartArt 被视为普通形状,您可以应用标准动画(进入、退出、强调、运动路径)并调整时间。如果需要,还可以为 SmartArt 节点内部的形状单独设置动画。

如果不知道内部 ID,如何可靠地定位幻灯片上的特定 SmartArt?

使用替代文本进行标识。为 SmartArt 设置唯一的 AltText,即可在代码中通过该文本查找,而无需依赖内部标识符。

将演示文稿转换为 PDF 时,SmartArt 的外观会被保留吗?

会。Aspose.Slides 在PDF 导出过程中高保真渲染 SmartArt,保持布局、颜色和效果。

我能提取整个 SmartArt 的图像用于预览或报告吗?

可以。您可以将 SmartArt 形状渲染为光栅格式SVG以获得可伸缩的矢量输出,适用于缩略图、报告或 Web 使用。