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

添加 SmartArt 节点

Aspose.Slides for PHP via Java 提供了最简洁的 API,以最容易的方式管理 SmartArt 形状。下面的示例代码将帮助在 SmartArt 形状中添加节点和子节点。

  1. 创建 Presentation 类的实例并加载包含 SmartArt 形状的演示文稿。
  2. 通过索引获取第一张幻灯片的引用。
  3. 遍历第一张幻灯片中的所有形状。
  4. 检查形状是否为 SmartArt 类型,如果是 SmartArt,则将选定的形状强制转换为 SmartArt
  5. 在 SmartArt 形状的 NodeCollection添加新节点 并在 TextFrame 中设置文本。
  6. 现在,在新添加的 SmartArt 节点中 添加 一个 Child Node 并在 TextFrame 中设置文本。
  7. 保存演示文稿。
  # 加载所需的演示文稿
  $pres = new Presentation("SimpleSmartArt.pptx");
  try {
    # 遍历第一张幻灯片中的所有形状
    foreach($pres->getSlides()->get_Item(0)->getShapes() as $shape) {
      # 检查形状是否为 SmartArt 类型
      if (java_instanceof($shape, new JavaClass("com.aspose.slides.SmartArt"))) {
        # 将形状强制转换为 SmartArt
        $smart = $shape;
        # 添加新的 SmartArt 节点
        $TemNode = $smart->getAllNodes()->addNode();
        # 添加文本
        $TemNode->getTextFrame()->setText("Test");
        # 在父节点中添加新的子节点。它将添加到集合的末尾
        $newNode = $TemNode->getChildNodes()->addNode();
        # 添加文本
        $newNode->getTextFrame()->setText("New Node Added");
      }
    }
    # 保存演示文稿
    $pres->save("AddSmartArtNode.pptx", SaveFormat::Pptx);
  } finally {
    if (!java_is_null($pres)) {
      $pres->dispose();
    }
  }

在特定位置添加 SmartArt 节点

在下面的示例代码中,我们说明了如何在特定位置向 SmartArt 形状的相应节点添加子节点。

  1. 创建 Presentation 类的实例。
  2. 通过索引获取第一张幻灯片的引用。
  3. 在访问的幻灯片中添加一种 StackedList 类型的 SmartArt 形状。
  4. 访问已添加 SmartArt 形状中的第一个节点。
  5. 现在,在位置 2 为选定的 Node 添加 Child Node 并设置其文本。
  6. 保存演示文稿。
  # 创建演示文稿实例
  $pres = new Presentation();
  try {
    # 访问演示文稿幻灯片
    $slide = $pres->getSlides()->get_Item(0);
    # 添加 Smart Art IShape
    $smart = $slide->getShapes()->addSmartArt(0, 0, 400, 400, SmartArtLayoutType::StackedList);
    # 访问索引为 0 的 SmartArt 节点
    $node = $smart->getAllNodes()->get_Item(0);
    # 在父节点的第 2 位置添加新的子节点
    $chNode = $node->getChildNodes()->addNodeByPosition(2);
    # 添加文本
    $chNode->getTextFrame()->setText("Sample Text Added");
    # 保存演示文稿
    $pres->save("AddSmartArtNodeByPosition.pptx", SaveFormat::Pptx);
  } finally {
    if (!java_is_null($pres)) {
      $pres->dispose();
    }
  }

访问 SmartArt 节点

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

  1. 创建 Presentation 类的实例并加载包含 SmartArt 形状的演示文稿。
  2. 通过索引获取第一张幻灯片的引用。
  3. 遍历第一张幻灯片中的所有形状。
  4. 检查形状是否为 SmartArt 类型,如果是 SmartArt,则将选定的形状强制转换为 SmartArt
  5. 遍历 SmartArt 形状中的所有 Nodes
  6. 访问并显示信息,如 SmartArt 节点的位置、级别和文本。
  # 实例化 Presentation 类
  $pres = new Presentation("SmartArtShape.pptx");
  try {
    # 获取第一张幻灯片
    $slide = $pres->getSlides()->get_Item(0);
    # 遍历第一张幻灯片中的所有形状
    foreach($slide->getShapes() as $shape) {
      # 检查形状是否为 SmartArt 类型
      if (java_instanceof($shape, new JavaClass("com.aspose.slides.SmartArt"))) {
        # 将形状强制转换为 SmartArt
        $smart = $shape;
        # 遍历 SmartArt 中的所有节点
        for($i = 0; $i < java_values($smart->getAllNodes()->size()) ; $i++) {
          # 访问索引 i 的 SmartArt 节点
          $node = $smart->getAllNodes()->get_Item($i);
          # 打印 SmartArt 节点参数
          System->out->print($node->getTextFrame()->getText() . " " . $node->getLevel() . " " . $node->getPosition());
        }
      }
    }
  } finally {
    if (!java_is_null($pres)) {
      $pres->dispose();
    }
  }

访问 SmartArt 子节点

下面的示例代码将帮助访问 SmartArt 形状中相应节点的子节点。

  1. 创建 Presentation 类的实例并加载包含 SmartArt 形状的演示文稿。
  2. 通过索引获取第一张幻灯片的引用。
  3. 遍历第一张幻灯片中的所有形状。
  4. 检查形状是否为 SmartArt 类型,如果是 SmartArt,则将选定的形状强制转换为 SmartArt
  5. 遍历 SmartArt 形状中的所有 Nodes
  6. 对每个选定的 SmartArt Node,遍历该节点内所有 Child Nodes
  7. 访问并显示信息,如 Child Node 的位置、级别和文本。
  # 实例化 Presentation 类
  $pres = new Presentation("AccessChildNodes.pptx");
  try {
    # 获取第一张幻灯片
    $slide = $pres->getSlides()->get_Item(0);
    # 遍历第一张幻灯片中的所有形状
    foreach($slide->getShapes() as $shape) {
      # 检查形状是否为 SmartArt 类型
      if (java_instanceof($shape, new JavaClass("com.aspose.slides.SmartArt"))) {
        # 将形状强制转换为 SmartArt
        $smart = $shape;
        # 遍历 SmartArt 中的所有节点
        for($i = 0; $i < java_values($smart->getAllNodes()->size()) ; $i++) {
          # 访问索引 i 的 SmartArt 节点
          $node0 = $smart->getAllNodes()->get_Item($i);
          # 遍历索引 i 的 SmartArt 节点中的子节点
          for($j = 0; $j < java_values($node0->getChildNodes()->size()) ; $j++) {
            # 访问 SmartArt 节点中的子节点
            $node = $node0->getChildNodes()->get_Item($j);
            # 打印 SmartArt 子节点参数
            System->out->print("j = " . $j . ", Text = " . $node->getTextFrame()->getText() . ",  Level = " . $node->getLevel() . ", Position = " . $node->getPosition());
          }
        }
      }
    }
  } finally {
    if (!java_is_null($pres)) {
      $pres->dispose();
    }
  }

在特定位置访问 SmartArt 子节点

在本示例中,我们将学习如何在特定位置访问 SmartArt 形状中相应节点的子节点。

  1. 创建 Presentation 类的实例。
  2. 通过索引获取第一张幻灯片的引用。
  3. 添加一种 StackedList 类型的 SmartArt 形状。
  4. 访问已添加的 SmartArt 形状。
  5. 访问已访问 SmartArt 形状中索引为 0 的节点。
  6. 现在,使用 get_Item() 方法访问该 SmartArt 节点位置 1 的 Child Node
  7. 访问并显示信息,如 Child Node 的位置、级别和文本。
  # 实例化演示文稿
  $pres = new Presentation();
  try {
    # 访问第一张幻灯片
    $slide = $pres->getSlides()->get_Item(0);
    # 在第一张幻灯片中添加 SmartArt 形状
    $smart = $slide->getShapes()->addSmartArt(0, 0, 400, 400, SmartArtLayoutType::StackedList);
    # 访问索引为 0 的 SmartArt 节点
    $node = $smart->getAllNodes()->get_Item(0);
    # 访问父节点中位置为 1 的子节点
    $position = 1;
    $chNode = $node->getChildNodes()->get_Item($position);
    # 打印 SmartArt 子节点参数
    System->out->print("Text = " . $chNode->getTextFrame()->getText() . ",  Level = " . $chNode->getLevel() . ", Position = " . $chNode->getPosition());
  } finally {
    if (!java_is_null($pres)) {
      $pres->dispose();
    }
  }

删除 SmartArt 节点

在本示例中,我们将学习如何删除 SmartArt 形状中的节点。

  1. 创建 Presentation 类的实例并加载包含 SmartArt 形状的演示文稿。
  2. 通过索引获取第一张幻灯片的引用。
  3. 遍历第一张幻灯片中的所有形状。
  4. 检查形状是否为 SmartArt 类型,如果是 SmartArt,则将选定的形状强制转换为 SmartArt
  5. 检查 SmartArt 是否拥有大于 0 的节点。
  6. 选择要删除的 SmartArt 节点。
  7. 现在,使用 removeNode 方法删除所选节点。
  8. 保存演示文稿。
  # 加载所需的演示文稿
  $pres = new Presentation("AddSmartArtNode.pptx");
  try {
    # 遍历第一张幻灯片中的所有形状
    foreach($pres->getSlides()->get_Item(0)->getShapes() as $shape) {)
      # 检查形状是否为 SmartArt 类型
      if (java_instanceof($shape, new JavaClass("com.aspose.slides.SmartArt"))) {
        # 将形状强制转换为 SmartArt
        $smart = $shape;
        if (java_values($smart->getAllNodes()->size()) > 0) {
          # 访问索引为 0 的 SmartArt 节点
          $node = $smart->getAllNodes()->get_Item(0);
          # 删除选中的节点
          $smart->getAllNodes()->removeNode($node);
        }
      }
    }
    # 保存演示文稿
    $pres->save("RemoveSmartArtNode.pptx", SaveFormat::Pptx);
  } finally {
    if (!java_is_null($pres)) {
      $pres->dispose();
    }
  }

从特定位置删除 SmartArt 节点

在本示例中,我们将学习如何从特定位置删除 SmartArt 形状中的节点。

  1. 创建 Presentation 类的实例并加载包含 SmartArt 形状的演示文稿。
  2. 通过索引获取第一张幻灯片的引用。
  3. 遍历第一张幻灯片中的所有形状。
  4. 检查形状是否为 SmartArt 类型,如果是 SmartArt,则将选定的形状强制转换为 SmartArt
  5. 选择索引为 0 的 SmartArt 形状节点。
  6. 现在,检查所选 SmartArt 节点是否拥有超过 2 个子节点。
  7. 现在,使用 removeNode 方法删除 Position 1 的节点。
  8. 保存演示文稿。
  # 加载所需的演示文稿
  $pres = new Presentation("AddSmartArtNode.pptx");
  try {
    # 遍历第一张幻灯片中的所有形状
    foreach($pres->getSlides()->get_Item(0)->getShapes() as $shape) {)
      # 检查形状是否为 SmartArt 类型
      if (java_instanceof($shape, new JavaClass("com.aspose.slides.SmartArt"))) {
        # 将形状强制转换为 SmartArt
        $smart = $shape;
        if (java_values($smart->getAllNodes()->size()) > 0) {
          # 访问索引为 0 的 SmartArt 节点
          $node = $smart->getAllNodes()->get_Item(0);
          if (java_values($node->getChildNodes()->size()) >= 2) {
            # 删除位置为 1 的子节点
            $node->getChildNodes()->removeNode(1);
          }
        }
      }
    }
    # 保存演示文稿
    $pres->save("RemoveSmartArtNodeByPosition.pptx", SaveFormat::Pptx);
  } finally {
    if (!java_is_null($pres)) {
      $pres->dispose();
    }
  }

为 SmartArt 对象的子节点设置自定义位置

Aspose.Slides for PHP via Java 支持设置 SmartArtShapeXY 属性。下面的代码片段展示了如何设置自定义的 SmartArtShape 位置、大小和旋转,请注意,添加新节点会导致所有节点的位置和大小重新计算。通过自定义位置设置,用户可以根据需求设置节点。

  # 实例化 Presentation 类
  $pres = new Presentation("SimpleSmartArt.pptx");
  try {
    $smart = $pres->getSlides()->get_Item(0)->getShapes()->addSmartArt(20, 20, 600, 500, SmartArtLayoutType::OrganizationChart);
    # 将 SmartArt 形状移动到新位置
    $node = $smart->getAllNodes()->get_Item(1);
    $shape = $node->getShapes()->get_Item(1);
    $shape->setX($shape->getX() . $shape->getWidth() * 2);
    $shape->setY($shape->getY() - $shape->getHeight() * 2);
    # 更改 SmartArt 形状的宽度
    $node = $smart->getAllNodes()->get_Item(2);
    $shape = $node->getShapes()->get_Item(1);
    $shape->setWidth($shape->getWidth() . $shape->getWidth() * 2);
    # 更改 SmartArt 形状的高度
    $node = $smart->getAllNodes()->get_Item(3);
    $shape = $node->getShapes()->get_Item(1);
    $shape->setHeight($shape->getHeight() . $shape->getHeight() * 2);
    # 更改 SmartArt 形状的旋转
    $node = $smart->getAllNodes()->get_Item(4);
    $shape = $node->getShapes()->get_Item(1);
    $shape->setRotation(90);
    $pres->save("SmartArt.pptx", SaveFormat::Pptx);
  } finally {
    $pres->dispose();
  }

检查辅助节点

我们将在本文的不同章节中使用以下源 SmartArt 形状进行研究。

todo:image_alt_text
图:幻灯片中的源 SmartArt 形状

在下面的示例代码中,我们将探讨如何在 SmartArt 节点集合中识别 Assistant Nodes 并对其进行更改。

  1. 创建 Presentation 类的实例并加载包含 SmartArt 形状的演示文稿。
  2. 通过索引获取第二张幻灯片的引用。
  3. 遍历第一张幻灯片中的所有形状。
  4. 检查形状是否为 SmartArt 类型,如果是 SmartArt,则将选定的形状强制转换为 SmartArt
  5. 遍历 SmartArt 形状中的所有节点,并检查它们是否为 Assistant Nodes
  6. 将 Assistant Node 的状态更改为普通节点。
  7. 保存演示文稿。
  # 创建演示文稿实例
  $pres = new Presentation("AddNodes.pptx");
  try {
    # 遍历第一张幻灯片中的所有形状
    foreach($pres->getSlides()->get_Item(0)->getShapes() as $shape) {)
      # 检查形状是否为 SmartArt 类型
      if (java_instanceof($shape, new JavaClass("com.aspose.slides.SmartArt"))) {
        # 将形状强制转换为 SmartArt
        $smart = $shape;
        # 遍历 SmartArt 形状的所有节点
        for($i = 0; $i < java_values($smart->getAllNodes()->size()) ; $i++) {
          $node = $smart->getAllNodes()->get_Item($i);
          # 检查节点是否为 Assistant 节点
          if ($node->isAssistant()) {
            # 将 Assistant 节点设置为 false 并使其成为普通节点
            $node->isAssistant();
          }
        }
      }
    }
    # 保存演示文稿
    $pres->save("ChangeAssitantNode.pptx", SaveFormat::Pptx);
  } finally {
    if (!java_is_null($pres)) {
      $pres->dispose();
    }
  }
todo:image_alt_text
图:幻灯片中 SmartArt 形状的辅助节点已更改

设置节点的填充格式

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

请按以下步骤操作:

  1. 创建 Presentation 类的实例。
  2. 通过索引获取幻灯片的引用。
  3. 通过设置其 LayoutType 添加一个 SmartArt 形状。
  4. 为 SmartArt 形状节点设置 Fill Format
  5. 将修改后的演示文稿写入为 PPTX 文件。
  # 实例化演示文稿
  $pres = new Presentation();
  try {
    # 访问幻灯片
    $slide = $pres->getSlides()->get_Item(0);
    # 添加 SmartArt 形状和节点
    $chevron = $slide->getShapes()->addSmartArt(10, 10, 800, 60, SmartArtLayoutType::ClosedChevronProcess);
    $node = $chevron->getAllNodes()->addNode();
    $node->getTextFrame()->setText("Some text");
    # 设置节点填充颜色
    foreach($node->getShapes() as $item) {
      $item->getFillFormat()->setFillType(FillType::Solid);
      $item->getFillFormat()->getSolidFillColor()->setColor(java("java.awt.Color")->RED);
    }
    # 保存演示文稿
    $pres->save("TestSmart.pptx", SaveFormat::Pptx);
  } finally {
    if (!java_is_null($pres)) {
      $pres->dispose();
    }
  }

生成 SmartArt 子节点的缩略图

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

  1. 创建 Presentation 类的实例。
  2. 添加 SmartArt
  3. 通过索引获取节点的引用。
  4. 获取缩略图图像。
  5. 将缩略图图像保存为任意所需的图像格式。
  # 实例化表示 PPTX 文件的 Presentation 类
  $pres = new Presentation();
  try {
    # 添加 SmartArt
    $smart = $pres->getSlides()->get_Item(0)->getShapes()->addSmartArt(10, 10, 400, 300, SmartArtLayoutType::BasicCycle);
    # 通过索引获取节点的引用
    $node = $smart->getNodes()->get_Item(1);
    # 获取缩略图
    $slideImage = $node->getShapes()->get_Item(0)->getImage();
    # 保存缩略图
    try {
      $slideImage->save("SmartArt_ChildNote_Thumbnail.png", ImageFormat::Png);
    } finally {
      if (!java_is_null($slideImage)) {
        $slideImage->dispose();
      }
    }
  } finally {
    if (!java_is_null($pres)) {
      $pres->dispose();
    }
  }

FAQ

是否支持 SmartArt 动画?

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

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

通过替代文本进行标记并搜索。为 SmartArt 设置唯一的 AltText,可在程序中无需依赖内部标识符即可定位。

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

会的。Aspose.Slides 在PDF 导出期间以高保真度渲染 SmartArt,保持布局、颜色和效果。

我可以提取整个 SmartArt 的图像吗(用于预览或报告)?

可以。您可以将 SmartArt 形状渲染为光栅格式SVG,以生成缩略图、报告或网页使用的图像。