使用 Python 在簡報中管理 SmartArt 形狀節點

概述

PowerPoint 簡報中的 SmartArt 圖形透過包含文字的節點組織,並定義圖表的結構。Aspose.Slides 允許您以程式方式操作這些 SmartArt 節點:新增節點與子節點、在特定位置插入子節點、存取現有節點,並讀取它們的文字、層級與位置。

本文說明如何管理 SmartArt 形狀節點。內容包括移除節點、透過索引或位置操作子節點、將助理節點變更為普通節點、調整 SmartArt 節點形狀的位置、大小與旋轉、設定節點填充格式,以及為 SmartArt 子節點產生縮圖。

新增 SmartArt 節點

Aspose.Slides for Python via Java 提供管理 SmartArt 形狀的 API。以下範例將節點與子節點新增至 SmartArt 形狀。

  1. 建立 Presentation 類別實例,並載入包含 SmartArt 形狀的簡報。
  2. 依索引取得第一張投影片。
  3. 逐一巡訪第一張投影片上的每個形狀。
  4. 檢查該形狀是否為 SmartArt 例項。
  5. 使用 Add a new node 新增節點至 SmartArt 形狀的 node collection,並透過 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. 在投影片上加入具有 StackedList 版面的 SmartArt 形狀。
  4. 取得已加入 SmartArt 形狀的第一個節點。
  5. 使用 addNodeByPosition 在位置 2 新增子節點,並設定其文字。
  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. 逐一巡訪 SmartArt 形狀中所有 nodes
  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. 逐一巡訪 SmartArt 形狀中所有 nodes
  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. 加入具有 StackedList 版面的 SmartArt 形狀。
  4. 取得已加入的 SmartArt 形狀。
  5. 取得 SmartArt 形狀中索引為 0 的節點。
  6. 使用 get_Item 取得索引為 1 的子節點。
  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. 取得索引為 0 的 SmartArt 節點(若存在)。
  6. 確認選取的 SmartArt 節點至少有兩個子節點。
  7. 使用 removeNode 移除索引為 1 的子節點。
  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 支援使用 setXsetY 設定 SmartArtShape 的位置。以下範例為 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. 新增具有 ClosedChevronProcess 版面的 SmartArt 形狀。
  4. 為 SmartArt 形狀的節點設定 FillFormat
  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()

常見問題

支援 SmartArt 動畫嗎?

是的。SmartArt 被視為一般形狀,您可以套用標準動畫(進入、退出、強調、移動路徑)並調整時間。必要時也可為 SmartArt 節點內的形狀加入動畫。

如果不知道內部 ID,如何可靠地在投影片上定位特定 SmartArt?

請使用替代文字進行設定與搜尋。為 SmartArt 設定唯一的替代文字,即可在程式中找尋,而不必依賴內部識別碼。

將簡報轉換為 PDF 時,SmartArt 的外觀會被保留嗎?

會。Aspose.Slides 在PDF 匯出時,以高視覺忠實度呈現 SmartArt,保留其版面、顏色與效果。

我可以擷取整個 SmartArt 的圖像嗎(用於預覽或報告)?

可以。您可以將 SmartArt 形狀渲染為點陣格式SVG以取得可縮放的向量輸出,適用於縮圖、報告或網頁使用。