在 C++ 中应用或更改幻灯片布局

概述

幻灯片布局定义了标题、文本、图片、图表和表格等占位符的位置和格式。应用布局可使幻灯片具有一致的结构,同时允许每张幻灯片包含自己的内容。

最常见的布局包括:

  • 标题幻灯片:包含标题和副标题占位符。
  • 标题和内容:包含标题占位符和通用内容占位符。
  • 空白:不包含任何内容占位符,适用于需要手动定位每个形状的情况。

了解布局继承

演示文稿有三个相关层级:

  1. 一个母版幻灯片定义主题、共享格式、背景和公共对象。
  2. 一个布局幻灯片属于母版,定义特定的占位符排列。
  3. 一个普通幻灯片使用一种布局,并存储该幻灯片输入的内容。

普通幻灯片从其布局继承主题和格式,布局又从其母版继承。直接在普通幻灯片上设置的值会覆盖该层级继承的值。创建普通幻灯片时,其占位符形状是从选定的布局生成的,而这些占位符中输入的内容属于普通幻灯片。

在从布局创建幻灯片之前,请先向布局添加所需的占位符。以后向布局添加另一个占位符不会自动为已有的普通幻灯片添加相应的占位符形状。

此关系有两个重要的影响:

  • 更改布局上继承的格式或已有占位符的几何形状会更新所有依赖该布局的幻灯片。在编辑已经在使用的布局之前,检查其依赖的幻灯片并审阅生成的演示文稿。
  • 正在被幻灯片使用的布局不能被删除。请先将其依赖的幻灯片重新指派到其他布局,或仅删除未使用的布局。

有关此层级顶部的更多信息,请参阅幻灯片母版。

若要在单个幻灯片或通过共享布局隐藏继承的徽标或装饰性母版形状,请参见控制母版图形的可见性。示例比较了两个使用相同母版的幻灯片。

选择并应用幻灯片布局

当演示文稿遵循标准 PowerPoint 布局定义时,请使用布局类型。布局名称可编辑且可本地化,因此除非您控制源模板,否则基于名称的选择可靠性较低。

下面的示例在第一个母版上查找标题和内容。如果该布局不可用,则有意回退到空白。第二个空检查是必要的,因为演示文稿可能只包含自定义布局。选定的布局随后通过ISlide::set_LayoutSlide方法应用到第一个普通幻灯片。

#include <DOM/ILayoutSlide.h>
#include <DOM/IMasterLayoutSlideCollection.h>
#include <DOM/IMasterSlide.h>
#include <DOM/ISlide.h>
#include <DOM/Presentation.h>
#include <DOM/SlideLayoutType.h>
#include <Export/SaveFormat.h>
#include <system/exceptions.h>
#include <system/smart_ptr.h>

using namespace Aspose::Slides;
using namespace Aspose::Slides::Export;
using namespace System;

auto presentation = MakeObject<Presentation>(u"input.pptx");

auto layoutSlides = presentation->get_Master(0)->get_LayoutSlides();
auto targetLayout = layoutSlides->GetByType(SlideLayoutType::TitleAndObject);

if (targetLayout == nullptr)
{
    targetLayout = layoutSlides->GetByType(SlideLayoutType::Blank);
}

if (targetLayout == nullptr)
{
    throw InvalidOperationException(u"The first master does not contain a suitable layout slide.");
}

presentation->get_Slide(0)->set_LayoutSlide(targetLayout);
presentation->Save(u"output-with-new-layout.pptx", SaveFormat::Pptx);
presentation->Dispose();

更改幻灯片的布局不会删除直接添加到幻灯片的普通形状。但是,占位符位置、继承的格式以及现有占位符与新布局之间的对应关系可能会变化,因此在切换差别较大的布局时请检查输出。

添加布局幻灯片

选择和创建是分开的操作。前面的示例仅选择了已有布局,并未创建新布局。要创建布局,请在目标母版的布局集合上调用IMasterLayoutSlideCollection::Add方法。

下面的示例始终添加一个名为Report Title and Content的新标题和内容布局,然后基于该布局添加一个普通幻灯片。布局名称在集合内必须唯一。

#include <DOM/ILayoutSlide.h>
#include <DOM/IMasterLayoutSlideCollection.h>
#include <DOM/IMasterSlide.h>
#include <DOM/ISlideCollection.h>
#include <DOM/Presentation.h>
#include <DOM/SlideLayoutType.h>
#include <Export/SaveFormat.h>
#include <system/smart_ptr.h>

using namespace Aspose::Slides;
using namespace Aspose::Slides::Export;
using namespace System;

auto presentation = MakeObject<Presentation>(u"input.pptx");

auto masterSlide = presentation->get_Master(0);
auto reportLayout = masterSlide->get_LayoutSlides()->Add(SlideLayoutType::TitleAndObject, u"Report Title and Content");
presentation->get_Slides()->AddEmptySlide(reportLayout);

presentation->Save(u"output-with-report-layout.pptx", SaveFormat::Pptx);
presentation->Dispose();

仅当模板真正需要另一个可复用结构时才添加布局。如果已经存在合适的布局,请选择并复用它,而不是创建重复的布局。

向布局幻灯片添加占位符

ILayoutSlide::get_PlaceholderManager方法提供一个ILayoutPlaceholderManager用于向布局添加占位符形状。

PowerPoint 占位符 ILayoutPlaceholderManager 方法
内容 AddContentPlaceholder(float x, float y, float width, float height)
内容(垂直) AddVerticalContentPlaceholder(float x, float y, float width, float height)
文本 AddTextPlaceholder(float x, float y, float width, float height)
文本(垂直) AddVerticalTextPlaceholder(float x, float y, float width, float height)
图片 AddPicturePlaceholder(float x, float y, float width, float height)
图表 AddChartPlaceholder(float x, float y, float width, float height)
表格 AddTablePlaceholder(float x, float y, float width, float height)
SmartArt AddSmartArtPlaceholder(float x, float y, float width, float height)
媒体 AddMediaPlaceholder(float x, float y, float width, float height)
在线图片 AddOnlineImagePlaceholder(float x, float y, float width, float height)

下面的示例验证空白布局是否存在,向其添加四个占位符,然后创建一个使用该修改后布局的普通幻灯片。顺序有意为之:先添加占位符,再创建普通幻灯片,以便 Aspose.Slides 能在该幻灯片上生成相应的占位符形状。

#include <DOM/IGlobalLayoutSlideCollection.h>
#include <DOM/ILayoutPlaceholderManager.h>
#include <DOM/ILayoutSlide.h>
#include <DOM/ISlideCollection.h>
#include <DOM/Presentation.h>
#include <DOM/SlideLayoutType.h>
#include <Export/SaveFormat.h>
#include <system/exceptions.h>
#include <system/smart_ptr.h>

using namespace Aspose::Slides;
using namespace Aspose::Slides::Export;
using namespace System;

auto presentation = MakeObject<Presentation>();

auto blankLayout = presentation->get_LayoutSlides()->GetByType(SlideLayoutType::Blank);

if (blankLayout == nullptr)
{
    throw InvalidOperationException(u"The presentation does not contain a Blank layout slide.");
}

auto placeholderManager = blankLayout->get_PlaceholderManager();
placeholderManager->AddContentPlaceholder(20.0f, 20.0f, 310.0f, 270.0f);
placeholderManager->AddVerticalTextPlaceholder(350.0f, 20.0f, 350.0f, 270.0f);
placeholderManager->AddChartPlaceholder(20.0f, 310.0f, 310.0f, 180.0f);
placeholderManager->AddTablePlaceholder(350.0f, 310.0f, 350.0f, 180.0f);

presentation->get_Slides()->AddEmptySlide(blankLayout);
presentation->Save(u"output-with-placeholders.pptx", SaveFormat::Pptx);
presentation->Dispose();

结果:

布局幻灯片上的占位符

删除未使用的布局幻灯片

使用Compress::RemoveUnusedLayoutSlides方法删除所有普通幻灯片未引用的布局。该方法会保留仍在使用的布局。

#include <DOM/Presentation.h>
#include <Export/SaveFormat.h>
#include <LowCode/Compress.h>
#include <system/smart_ptr.h>

using namespace Aspose::Slides;
using namespace Aspose::Slides::Export;
using namespace Aspose::Slides::LowCode;
using namespace System;

auto presentation = MakeObject<Presentation>(u"input.pptx");

Compress::RemoveUnusedLayoutSlides(presentation);
presentation->Save(u"output-without-unused-layouts.pptx", SaveFormat::Pptx);
presentation->Dispose();

若要删除特定布局,请先使用其get_HasDependingSlides方法或GetDependingSlides方法。重新指派任何依赖的幻灯片后,再调用ILayoutSlide::Remove。尝试删除正在使用的布局会抛出PptxEditException。

在布局幻灯片上控制页脚可见性

布局拥有自己的页脚、幻灯片编号和日期时间占位符。使用ILayoutSlide::get_HeaderFooterManager方法可为单个布局控制这些占位符。这在例如内容布局需要显示页脚而标题布局不需要时非常有用。

下面的示例安全地选择一个布局并使其页脚元素可见:

#include <DOM/IGlobalLayoutSlideCollection.h>
#include <DOM/ILayoutSlide.h>
#include <DOM/ILayoutSlideHeaderFooterManager.h>
#include <DOM/Presentation.h>
#include <DOM/SlideLayoutType.h>
#include <Export/SaveFormat.h>
#include <system/exceptions.h>
#include <system/smart_ptr.h>

using namespace Aspose::Slides;
using namespace Aspose::Slides::Export;
using namespace System;

auto presentation = MakeObject<Presentation>(u"input.pptx");

auto layoutSlide = presentation->get_LayoutSlides()->GetByType(SlideLayoutType::TitleAndObject);

if (layoutSlide == nullptr)
{
    layoutSlide = presentation->get_LayoutSlides()->GetByType(SlideLayoutType::Blank);
}

if (layoutSlide == nullptr)
{
    throw InvalidOperationException(u"The presentation does not contain a suitable layout slide.");
}

auto headerFooterManager = layoutSlide->get_HeaderFooterManager();
headerFooterManager->SetFooterVisibility(true);
headerFooterManager->SetSlideNumberVisibility(true);
headerFooterManager->SetDateTimeVisibility(true);
headerFooterManager->SetFooterText(u"Footer text");
headerFooterManager->SetDateTimeText(u"Date and time text");

presentation->Save(u"output-with-layout-footers.pptx", SaveFormat::Pptx);
presentation->Dispose();

在母版及其子布局上控制页脚可见性

要在母版层级中应用一致的页脚设置,请使用IMasterSlide::get_HeaderFooterManager方法。IMasterSlideHeaderFooterManager的传播方法作用于母版及其依赖的布局幻灯片和普通幻灯片;它们不会仅针对单个普通幻灯片。

#include <DOM/IMasterSlide.h>
#include <DOM/IMasterSlideHeaderFooterManager.h>
#include <DOM/Presentation.h>
#include <Export/SaveFormat.h>
#include <system/smart_ptr.h>

using namespace Aspose::Slides;
using namespace Aspense::Slides::Export;
using namespace System;

auto presentation = MakeObject<Presentation>(u"input.pptx");

auto headerFooterManager = presentation->get_Master(0)->get_HeaderFooterManager();
headerFooterManager->SetFooterAndChildFootersVisibility(true);
headerFooterManager->SetSlideNumberAndChildSlideNumbersVisibility(true);
headerFooterManager->SetDateTimeAndChildDateTimesVisibility(true);
headerFooterManager->SetFooterAndChildFootersText(u"Footer text");
headerFooterManager->SetDateTimeAndChildDateTimesText(u"Date and time text");

presentation->Save(u"output-with-master-footers.pptx", SaveFormat::Pptx);
presentation->Dispose();

常见问题

母版幻灯片和布局幻灯片有什么区别?

母版幻灯片定义演示文稿的主题和共享格式。布局幻灯片属于母版,定义一种可复用的占位符排列。普通幻灯片使用这些布局并存储幻灯片特有的内容。

我可以将布局幻灯片从一个演示文稿复制到另一个吗?

可以。使用IGlobalLayoutSlideCollection::AddClone方法将副本添加到目标集合。跨演示文稿复制时,还需验证源布局使用的字体、主题、图像和其他资源。

修改已在使用的布局会发生什么?

依赖的幻灯片会继承布局的更改,除非它们在本地覆盖了受影响的格式或对象。因此,占位符几何形状和继承的样式可能在许多幻灯片上一次性改变。编辑布局前,请使用GetDependingSlides识别受影响的幻灯片。

如果我删除仍在使用的布局会怎样?

Aspose.Slides 会抛出PptxEditException。请先重新指派依赖的幻灯片,或使用RemoveUnusedLayoutSlides仅删除未被引用的布局。