Spravovat SmartArt v prezentacích PowerPoint pomocí Pythonu

Přehled

SmartArt je diagram PowerPointu vytvořený z uzlů, tvarů uzlů a rozvržení. S Aspose.Slides pro Python přes Java můžete vytvářet SmartArt, číst text z jeho uzlů, měnit jeho rozvržení, kontrolovat skryté uzly, konfigurovat rozvržení organizačních diagramů a vytvářet obrázkové organizační diagramy.

Získání textu z objektu SmartArt

Uzlu SmartArt může obsahovat jeden nebo více tvarů. Chcete‑li přečíst text z tvarů uzlu, projděte SmartArt.getAllNodes, poté přečtěte TextFrame vrácený metodou SmartArtShape.getTextFrame.

Příklad vyžaduje prezentaci s alespoň jedním snímkem a objektem SmartArt jako prvním tvarem na tomto snímku. Vypíše každý dostupný textový rámec do konzole.

import jpype
import asposeslides

if not jpype.isJVMStarted():
    jpype.startJVM()

from asposeslides.api import Presentation, SmartArt

presentation = Presentation("sample.pptx")
try:
    slide = presentation.getSlides().get_Item(0)
    shape = slide.getShapes().get_Item(0)

    if isinstance(shape, SmartArt):
        smart_art = shape
        for node in smart_art.getAllNodes():
            for node_shape in node.getShapes():
                if node_shape.getTextFrame() is not None:
                    print(node_shape.getTextFrame().getText())
finally:
    presentation.dispose()

Změna typu rozvržení objektu SmartArt

Rozvržení SmartArt určuje, jak jsou uzly uspořádány a propojeny. Následující příklad vytvoří objekt SmartArt s hodnotou SmartArtLayoutType BasicBlockList, změní jej na hodnotu BasicProcess a uloží prezentaci. Pozice a velikost předávané metodě ShapeCollection.addSmartArt jsou měřeny v bodech. K změně rozvržení použijte SmartArt.setLayout.

import jpade
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(10, 10, 400, 300, SmartArtLayoutType.BasicBlockList)
    smart_art.setLayout(SmartArtLayoutType.BasicProcess)

    presentation.save("ChangeSmartArtLayout.pptx", SaveFormat.Pptx)
finally:
    presentation.dispose()

Kontrola, zda je uzel SmartArt skrytý

SmartArtNode.isHidden udává, zda je uzel skrytý v datovém modelu SmartArt. Skryté uzly mohou ve struktuře existovat i tehdy, když vybrané rozvržení nezobrazuje je jako viditelné prvky diagramu.

Následující příklad přidá uzel do objektu SmartArt, který používá hodnotu SmartArtLayoutType RadialCycle, a zkontroluje stav skrytí přidaného uzlu. Vytiskne zprávu, pokud je uzel skrytý, a uloží diagram.

import jpype
import asposeslides

if not jpade.isJVMStarted():
    jpade.startJVM()

from asposeslides.api import Presentation, SaveFormat, SmartArtLayoutType

presentation = Presentation()
try:
    slide = presentation.getSlides().get_Item(0)

    smart_art = slide.getShapes().addSmartArt(10, 10, 400, 300, SmartArtLayoutType.RadialCycle)
    node = smart_art.getAllNodes().addNode()
    is_hidden = node.isHidden()

    if is_hidden:
        print("The node is hidden in the SmartArt data model.")

    presentation.save("CheckSmartArtHiddenProperty.pptx", SaveFormat.Pptx)
finally:
    presentation.dispose()

Získání nebo nastavení rozvržení organizačního diagramu

Pro diagramy SmartArt, které používají rozvržení organizačního diagramu, SmartArtNode.getOrganizationChartLayout a SmartArtNode.setOrganizationChartLayout určují, jak jsou podřízené uzly uspořádány pod nadřazeným uzlem. Například můžete nastavit podřízené uzly tak, aby visely zleva, zprava nebo z obou stran, v závislosti na vybraném OrganizationChartLayoutType.

Následující příklad vytvoří organizační diagram a nastaví rozvržení pro první uzel na hodnotu OrganizationChartLayoutType LeftHanging. Index 0 (nulová báze) vybírá první uzel nejvyšší úrovně; jeho podřízené uzly použijí vybranou úpravu. Upravená prezentace je pak uložena.

import jpype
import asposeslides

if not jpype.isJVMStarted():
    jpype.startJVM()

from asposeslides.api import OrganizationChartLayoutType, Presentation, SaveFormat, SmartArtLayoutType

presentation = Presentation()
try:
    slide = presentation.getSlides().get_Item(0)

    smart_art = slide.getShapes().addSmartArt(10, 10, 400, 300, SmartArtLayoutType.OrganizationChart)
    root_node = smart_art.getNodes().get_Item(0)
    root_node.setOrganizationChartLayout(OrganizationChartLayoutType.LeftHanging)

    presentation.save("OrganizationChartLayout.pptx", SaveFormat.Pptx)
finally:
    presentation.dispose()

Vytvoření obrázkového organizačního diagramu

Obrázkový organizační diagram je rozvržení SmartArt navržené pro hierarchické diagramy, které obsahují zástupné obrázky. Při přidávání objektu SmartArt na snímek použijte hodnotu SmartArtLayoutType PictureOrganizationChart. Tento příklad uloží diagram se zástupnými obrázky; nezaplní však zástupce obrázky.

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.PictureOrganizationChart)

    presentation.save("PictureOrganizationChart.pptx", SaveFormat.Pptx)
finally:
    presentation.dispose()

Převod starých diagramů na skupiny tvarů

Při modernizaci existující prezentace může být nutné aktualizovat organizační diagram původně vytvořený v PowerPointu 97-2003. Aspose.Slides představuje tyto staré diagramy jako objekty LegacyDiagram. Použijte LegacyDiagram.convertToGroupShape k převodu diagramu na skupinu tvarů, abyste mohli upravovat jednotlivé vizuální prvky. Viz LegacyDiagram API Reference pro podrobnosti.

Převod přidá novou skupinu do kolekce tvarů, aniž by odstranil původní diagram. Po úspěšném převodu odstraňte původní diagram pomocí ShapeCollection.remove, abyste předešli duplicitnímu obsahu. Shromážděte staré diagramy do seznamu před jejich převodem, aby přidávání a odebírání tvarů nerušilo iteraci.

Následující příklad otevře prezentaci, prohledá každý snímek, převádí diagramy na skupiny tvarů a uloží aktualizovanou prezentaci jako PPTX.

import jpype
import asposeslides

if not jpype.isJVMStarted():
    jpype.startJVM()

from asposeslides.api import LegacyDiagram, Presentation, SaveFormat

presentation = Presentation("legacy-diagrams.ppt")
try:
    for slide in presentation.getSlides():
        legacy_diagrams = []
        for shape in slide.getShapes():
            if isinstance(shape, LegacyDiagram):
                legacy_diagrams.append(shape)

        for legacy_diagram in legacy_diagrams:
            group_shape = legacy_diagram.convertToGroupShape()

            if group_shape is not None:
                slide.getShapes().remove(legacy_diagram)

    presentation.save("modernized.pptx", SaveFormat.Pptx)
finally:
    presentation.dispose()

Uložená prezentace obsahuje editovatelné skupiny tvarů místo převedených starých diagramů, bez původních diagramů zůstávajících vedle nich. Otevřete PPTX v PowerPointu a upravte jednotlivé prvky v každé skupině, například jejich text, výplň nebo pozici.

Časté dotazy

Podporuje SmartArt zrcadlení nebo obrácení pro RTL jazyky?

Ano. Metoda SmartArt.setReversed přepíná směr diagramu z zleva‑doprava na zprava‑doleva, nebo zpět, pokud vybrané rozvržení SmartArt podporuje obrácení.

Jak mohu zkopírovat SmartArt na stejný snímek nebo do jiné prezentace při zachování formátování?

Můžete klonovat tvar SmartArt pomocí ShapeCollection.addClone nebo klonovat celý snímek obsahující SmartArt. Oba přístupy zachovávají velikost, pozici a formátování.

Jak mohu vykreslit SmartArt do rastrového obrázku pro náhled nebo webový export?

Vykreslete snímek nebo celou prezentaci do PNG nebo JPEG. SmartArt je vykreslen jako součást snímku.

Jak mohu najít konkrétní objekt SmartArt na snímku, pokud jich je několik?

Použijte Shape.setAlternativeText nebo Shape.setName k přiřazení jedinečného alternativního textu nebo názvu tvaru SmartArt, vyhledejte tuto hodnotu v BaseSlide.getShapes a poté ověřte, že odpovídající tvar je SmartArt.