使用 Python 管理簡報中的 SmartArt 形狀節點
概述
PowerPoint 簡報中的 SmartArt 圖形是透過包含文字的節點來組織,並定義圖表的結構。Aspose.Slides 允許您以程式方式操作這些 SmartArt 節點:新增節點與子節點、在特定位置插入子節點、存取現有節點,並讀取它們的文字、層級和位置。
本文說明如何管理 SmartArt 形狀節點。內容包括如何移除節點、依索引或位置操作子節點、將助理節點變更為普通節點、調整 SmartArt 節點形狀的位置、大小與旋轉、設定節點的填充格式,以及為 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 形狀內的所有節點。
- 存取並顯示 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 形狀。
- 取得該 SmartArt 形狀索引 0 的節點。
- 現在,使用 GetNodeByPosition() 方法取得該 SmartArt 節點位置 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 是否至少有一個節點。
- 選取欲刪除的 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 子節點的縮圖:
- 實例化代表 PPTX 檔案的
Presentation類別。 - 新增 SmartArt。
- 使用索引取得節點的參照。
- 取得縮圖影像。
- 將縮圖影像儲存為任意想要的圖像格式。
以下範例產生 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 的影像(用於預覽或報告)嗎?