在 C++ 中高效合并演示文稿

演示文稿合并

当您将一个演示文稿合并到另一个时,实际上是将它们的幻灯片合并到单个演示文稿中,以获得一个文件。

可以合并的内容

使用 Aspose.Slides,您可以合并

  • 整个演示文稿。所有演示文稿中的幻灯片会合并到一个演示文稿中
  • 特定幻灯片。选定的幻灯片会合并到一个演示文稿中
  • 同一格式的演示文稿(PPT 转 PPT、PPTX 转 PPTX 等)以及不同格式的演示文稿(PPT 转 PPTX、PPTX 转 ODP 等)相互合并。

合并选项

您可以应用以下选项,以决定:

  • 输出演示文稿中的每一张幻灯片是否保留唯一的样式
  • 是否对输出演示文稿中的所有幻灯片使用相同的样式

要合并演示文稿,Aspose.Slides 提供了来自 ISlideCollection 接口的 AddClone 方法。AddClone 方法有多种实现,定义了演示文稿合并过程的参数。每个 Presentation 对象都有一个 Slides 集合,因此您可以从目标演示文稿调用 AddClone 方法以合并幻灯片。

AddClone 方法返回一个 ISlide 对象,即源幻灯片的克隆。输出演示文稿中的幻灯片仅是源幻灯片的副本。因此,您可以对生成的幻灯片进行更改(例如应用样式、格式选项或布局),而无需担心源演示文稿受到影响。

合并演示文稿

Aspose.Slides 提供了 AddClone (ISlide) 方法,允许在保留原始布局和样式(默认参数)的情况下合并幻灯片。

以下 C++ 代码演示了如何合并演示文稿:

auto pres1 = System::MakeObject<Presentation>(u"pres1.pptx");
auto pres2 = System::MakeObject<Presentation>(u"pres2.pptx");
for (const auto& slide : pres2->get_Slides())
{
    pres1->get_Slides()->AddClone(slide);
}

pres1->Save(u"combined.pptx", SaveFormat::Pptx);

使用幻灯片母版合并演示文稿

Aspose.Slides 提供了 AddClone (ISlide, IMasterSlide, bool) 方法,允许在应用幻灯片母版模板的情况下合并幻灯片。这样,必要时您可以更改输出演示文稿中幻灯片的样式。

以下 C++ 代码演示了上述操作:

auto pres1 = System::MakeObject<Presentation>(u"pres1.pptx");
auto pres2 = System::MakeObject<Presentation>(u"pres2.pptx");
for (const auto& slide : pres2->get_Slides())
{
    pres1->get_Slides()->AddClone(slide, pres2->get_Masters()->idx_get(0), true);
}

pres1->Save(u"combined.pptx", SaveFormat::Pptx);

如果希望输出演示文稿中的幻灯片使用不同的布局,请在合并时改用 AddClone (ISlide, ILayoutSlide) 方法。

从演示文稿中合并特定幻灯片

从多个演示文稿中合并特定幻灯片对于创建自定义幻灯片集非常有用。Aspose.Slides C++ 允许您只选择并导入所需的幻灯片。API 会保留原始幻灯片的格式、布局和设计。

下面的 C++ 代码创建一个新演示文稿,从两个其他演示文稿中添加标题幻灯片,并将结果保存为文件:

SmartPtr<ISlide> GetTitleSlide(SmartPtr<IPresentation> presentation)
{
    for (auto&& slide : presentation->get_Slides())
    {
        if (slide->get_LayoutSlide()->get_LayoutType() == SlideLayoutType::Title)
        {
            return slide;
        }
    }
    return nullptr;
}
auto presentation = MakeObject<Presentation>();
auto presentation1 = MakeObject<Presentation>(u"presentation1.pptx");
auto presentation2 = MakeObject<Presentation>(u"presentation2.pptx");

presentation->get_Slides()->RemoveAt(0);

auto slide1 = GetTitleSlide(presentation1);

if (slide1 != nullptr)
    presentation->get_Slides()->AddClone(slide1);

auto slide2 = GetTitleSlide(presentation2);

if (slide2 != nullptr)
    presentation->get_Slides()->AddClone(slide2);

presentation->Save(u"combined.pptx", SaveFormat::Pptx);

presentation2->Dispose();
presentation1->Dispose();
presentation->Dispose();

使用幻灯片布局合并演示文稿

此 C++ 代码展示了如何在合并幻灯片时应用您首选的幻灯片布局,以生成一个输出演示文稿:

auto pres1 = System::MakeObject<Presentation>(u"pres1.pptx");
auto pres2 = System::MakeObject<Presentation>(u"pres2.pptx");
for (const auto& slide : pres2->get_Slides())
{
    pres1->get_Slides()->AddClone(slide, pres2->get_LayoutSlides()->idx_get(0));
}

pres1->Save(u"combined.pptx", SaveFormat::Pptx);

合并不同尺寸幻灯片的演示文稿

若要合并尺寸不同的两个演示文稿,必须将其中一个演示文稿的尺寸调整为与另一个相同。

以下示例代码演示了此操作:

auto pres1 = System::MakeObject<Presentation>(u"pres1.pptx");
auto pres1Size = pres1->get_SlideSize()->get_Size();

auto pres2 = System::MakeObject<Presentation>(u"pres2.pptx");
pres2->get_SlideSize()->SetSize(pres1Size.get_Width(), pres1Size.get_Height(), SlideSizeScaleType::EnsureFit);

for (const auto& slide : pres2->get_Slides())
{
    pres1->get_Slides()->AddClone(slide);
}

pres1->Save(u"combined.pptx", SaveFormat::Pptx);

将幻灯片合并到演示文稿章节

此 C++ 代码展示了如何将特定幻灯片合并到演示文稿的某个章节:

auto pres1 = System::MakeObject<Presentation>(u"pres1.pptx");
auto pres2 = System::MakeObject<Presentation>(u"pres2.pptx");
for (int32_t index = 0; index < pres2->get_Slides()->get_Count(); index++)
{
    auto slide = pres2->get_Slides()->idx_get(index);
    pres1->get_Slides()->AddClone(slide, pres1->get_Sections()->idx_get(0));
}

pres1->Save(u"combined.pptx", SaveFormat::Pptx);

该幻灯片会被添加到章节的末尾。

FAQ

合并时是否保留演讲者备注?

是的。克隆幻灯片时,Aspose.Slides 会保留所有幻灯片元素,包括备注、格式和动画。

评论及其作者会被转移吗?

评论作为幻灯片内容的一部分,会随幻灯片一起复制。评论作者标签会以评论对象的形式保留在生成的演示文稿中。

如果源演示文稿受密码保护怎么办?

必须使用密码通过 LoadOptions::set_Password 打开(参见 [/slides/cpp/password-protected-presentation/]),加载后,这些幻灯片可以安全地克隆到未受保护的目标文件(或同样受保护的文件)中。

合并操作的线程安全性如何?

请勿在 多个线程 中使用同一个 Presentation 实例。推荐的规则是 “一个文档 — 一个线程”;不同的文件可以在独立线程中并行处理。