Эффективное объединение презентаций на C++

Presentation Merging

При объединении одной презентации с другой вы фактически комбинируете их слайды в одну презентацию, получая один файл.

What Can Be Merged

С помощью Aspose.Slides можно объединять

  • целые презентации. Все слайды из исходных презентаций попадают в одну презентацию
  • отдельные слайды. Выбранные слайды складываются в одну презентацию
  • презентации в одном формате (PPT в PPT, PPTX в PPTX и т.д.) и в разных форматах (PPT в PPTX, PPTX в ODP и т.д.) друг с другом.

Merging Options

Можно задать параметры, определяющие, будет ли

  • каждый слайд в результирующей презентации сохранять уникальный стиль
  • один общий стиль применяться ко всем слайдам в результирующей презентации.

Для объединения презентаций Aspose.Slides предоставляет методы AddClone (из интерфейса ISlideCollection). Существует несколько перегрузок метода AddClone, определяющих параметры процесса объединения. Каждый объект Presentation имеет коллекцию Slides, поэтому вы можете вызвать AddClone у презентации, в которую хотите добавить слайды.

Метод AddClone возвращает объект ISlide, являющийся клоном исходного слайда. Слайды в результирующей презентации представляют собой просто копию слайдов из источника. Поэтому вы можете изменять полученные слайды (например, применять стили, параметры форматирования или макеты), не опасаясь влияния на исходные презентации.

Merge Presentations

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);

Merge Presentations with a Slide Master

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) при объединении.

Merge Specific Slides from Presentations

Объединение конкретных слайдов из нескольких презентаций удобно для создания пользовательских наборов слайдов. Aspose.Slides C++ позволяет выбрать и импортировать только нужные слайды, при этом сохраняются форматирование, макет и дизайн оригинальных слайдов.

В следующем примере на 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();

Merge Presentations with a Slide Layout

Этот код на 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);

Merge Presentations with Different Slide Sizes

Чтобы объединить две презентации с различными размерами слайдов, необходимо изменить размер одной из них, чтобы он соответствовал размеру другой презентации.

Пример кода, демонстрирующий описанную операцию:

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);

Merge Slides to a Presentation Section

В этом примере на 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; после загрузки такие слайды можно безопасно клонировать в незащищённый целевой файл (или в защищённый).

Насколько потокобезопасна операция слияния?

Не используйте один и тот же экземпляр Presentation из нескольких потоков [/slides/cpp/multithreading/]. Рекомендуемое правило — «один документ — один поток»; разные файлы можно обрабатывать параллельно в отдельных потоках.