在 C++ 中高效合併簡報
概述
Aspose.Slides for C++ 透過將投影片從一個 簡報 複製到另一個簡報來合併簡報。主要操作是 ISlideCollection::AddClone,它可以保留來源投影片的格式,或將複製的投影片附加到目標簡報中的母片或版面配置上。
本文涵蓋最常見的合併工作流程:
- 合併所有投影片,同時保留其來源格式;
- 合併選取的投影片;
- 套用目標簡報的母片;
- 套用目標簡報的特定版面配置;
- 在合併前正規化不同的投影片尺寸;
- 將複製的投影片加入節;
- 在一個端對端工作流程中合併多個簡報;
- 處理母片、資源、備註、評論、媒體、字型、密碼、大檔案和多執行緒相關問題。
投影片複製對母片與版面配置的影響
投影片的大部分外觀繼承自其版面配置與母片。因此,您選擇的複製重載決定了合併後的投影片如何整合到目標簡報中。
請以以下任一方式使用 ISlideCollection::AddClone:
AddClone(sourceSlide)— 保留來源投影片的版面配置與格式。必要時,來源母片會自動複製到目標簡報。Aspose.Slides 會自動追蹤已複製的母片,以避免重覆的投影片多次複製相同的母片。AddClone(sourceSlide, destinationMaster, allowCloneMissingLayout)— 將複製的投影片附加到特定的目標 IMasterSlide。Aspose.Slides 會根據版面類型或名稱在該母片下尋找匹配的版面配置。AddClone(sourceSlide, destinationLayout)— 直接將複製的投影片附加到特定的目標 ILayoutSlide。
傳遞給 AddClone 重載的母片或版面配置必須屬於 目標 簡報,而非來源簡報。
合併整個簡報並保留來源格式
最簡單的合併方式是將來源簡報中的每一張投影片複製到目標簡報。這是在匯入的投影片需保留其原始主題、母片與版面配置關係時的適當選擇。
#include <DOM/ISlideCollection.h>
#include <DOM/Presentation.h>
#include <Export/SaveFormat.h>
using namespace Aspose::Slides;
using namespace Aspose::Slides::Export;
auto destination = System::MakeObject<Presentation>(u"destination.pptx");
auto source = System::MakeObject<Presentation>(u"source.pptx");
for (const auto& slide : source->get_Slides())
{
destination->get_Slides()->AddClone(slide);
}
destination->Save(u"merged.pptx", SaveFormat::Pptx);
當來源與目標使用不同設計時,結果簡報可能會包含多個母片。這在刻意保留來源格式時屬於預期行為。
合併選取的投影片
您不需要複製所有投影片。以下範例只會從來源簡報匯入指定的投影片索引。
#include <DOM/ISlideCollection.h>
#include <DOM/Presentation.h>
#include <Export/SaveFormat.h>
using namespace Aspose::Slides;
using namespace Aspose::Slides::Export;
auto destination = System::MakeObject<Presentation>(u"destination.pptx");
auto source = System::MakeObject<Presentation>(u"source.pptx");
int32_t slideIndexes[] = {0, 2, 4};
for (auto index : slideIndexes)
{
destination->get_Slides()->AddClone(source->get_Slide(index));
}
destination->Save(u"merged-selected-slides.pptx", SaveFormat::Pptx);
在從使用者輸入或外部設定取得索引時,請先驗證投影片索引的有效性。
使用目標母片合併投影片
當匯入的投影片應使用已屬於目標簡報的母片時,請使用 AddClone(ISlide, IMasterSlide, bool) 重載。
#include <DOM/IMasterSlide.h>
#include <DOM/ISlideCollection.h>
#include <DOM/Presentation.h>
#include <Export/SaveFormat.h>
using namespace Aspose::Slides;
using namespace Aspose::Slides::Export;
auto destination = System::MakeObject<Presentation>(u"destination.pptx");
auto source = System::MakeObject<Presentation>(u"source.pptx");
auto destinationMaster = destination->get_Master(0);
for (const auto& slide : source->get_Slides())
{
destination->get_Slides()->AddClone(slide, destinationMaster, true);
}
destination->Save(u"merged-with-destination-master.pptx", SaveFormat::Pptx);
Aspose.Slides 會依照來源版面配置的類型或名稱,在指定的母片下選取適當的版面配置。若不存在相符的版面配置且 allowCloneMissingLayout 為 true,則會複製來源版面配置以加入投影片;若為 false,則會拋出 PptxEditException。
當您希望合併失敗而不是在目標母片中新增版面配置時,請使用 false。
使用特定目標版面配置合併投影片
當您確定匯入的投影片應使用哪一個目標版面配置時,請使用 AddClone(ISlide, ILayoutSlide) 重載。
#include <DOM/ILayoutSlide.h>
#include <DOM/ISlideCollection.h>
#include <DOM/Presentation.h>
#include <Export/SaveFormat.h>
using namespace Aspose::Slides;
using namespace Aspose::Slides::Export;
auto destination = System::MakeObject<Presentation>(u"destination.pptx");
auto source = System::MakeObject<Presentation>(u"source.pptx");
auto destinationLayout = destination->get_LayoutSlide(0);
for (const auto& slide : source->get_Slides())
{
destination->get_Slides()->AddClone(slide, destinationLayout);
}
destination->Save(u"merged-with-destination-layout.pptx", SaveFormat::Pptx);
套用目標版面配置會變更繼承的版面配置關係;不會重新設計來源投影片的內容。如果來源與目標版面配置的佔位元結構不同,請檢查結果,以確保繼承的格式與佔位元行為符合預期。
合併具有不同投影片尺寸的簡報
不同投影片尺寸的簡報可以合併,但將投影片複製到尺寸不同的簡報時,內容不會自動為新畫布重新設計。因此,形狀可能會出現位移、意外縮放,或位於可視投影片區域之外。
實務做法是先在複製前調整來源簡報的尺寸。[SlideSize::SetSize](https://reference.aspose.com/slides/zh-hant/cpp/aspose.slides/slidesize/setsize/) 方法可以在變更投影片尺寸的同時縮放現有內容。[SlideSizeScaleType::EnsureFit](https://reference.aspose.com/slides/zh-hant/cpp/aspose.slides/slidesizescaletype/) 則會將內容縮放至符合指定尺寸。
#include <DOM/ISlideCollection.h>
#include <DOM/ISlideSize.h>
#include <DOM/Presentation.h>
#include <DOM/SlideSizeScaleType.h>
#include <Export/SaveFormat.h>
#include <drawing/size_f.h>
using namespace Aspose::Slides;
using namespace Aspose::Slides::Export;
auto destination = System::MakeObject<Presentation>(u"destination.pptx");
auto source = System::MakeObject<Presentation>(u"source.pptx");
auto destinationSize = destination->get_SlideSize()->get_Size();
auto sourceSize = source->get_SlideSize()->get_Size();
if (sourceSize.get_Width() != destinationSize.get_Width() ||
sourceSize.get_Height() != destinationSize.get_Height())
{
source->get_SlideSize()->SetSize(
destinationSize.get_Width(),
destinationSize.get_Height(),
SlideSizeScaleType::EnsureFit);
}
for (const auto& slide : source->get_Slides())
{
destination->get_Slides()->AddClone(slide);
}
destination->Save(u"merged-same-slide-size.pptx", SaveFormat::Pptx);
調整尺寸會在記憶體中變更來源簡報物件。若您需要保持原始來源簡報不變,以供其他操作使用,請為合併開啟另一個實例。
將投影片合併至簡報節
基本的投影片複製迴圈不會重建來源簡報的節層次結構。若輸出結果需要保留節,請在目標簡報中建立或選取節,並使用 [AddClone(ISlide, ISection)](https://reference.aspose.com/slides/zh-hant/cpp/aspose.slides/islidecollection/addclone/) 明確將投影片複製至該節。
#include <DOM/ISectionCollection.h>
#include <DOM/ISlideCollection.h>
#include <DOM/Presentation.h>
#include <Export/SaveFormat.h>
using namespace Aspose::Slides;
using namespace Aspose::Slides::Export;
auto destination = System::MakeObject<Presentation>(u"destination.pptx");
auto source = System::MakeObject<Presentation>(u"source.pptx");
auto importedSection = destination->get_Sections()->AppendEmptySection(u"Imported slides");
for (const auto& slide : source->get_Slides())
{
destination->get_Slides()->AddClone(slide, importedSection);
}
destination->Save(u"merged-with-section.pptx", SaveFormat::Pptx);
複製的投影片會附加到指定的目標節。若要保留多個來源節,請列舉 [Presentation::get_Sections](https://reference.aspose.com/slides/zh-hant/cpp/aspose.slides/presentation/get_sections/),使用 [ISection::GetSlidesListOfSection](https://reference.aspose.com/slides/zh-hant/cpp/aspose.slides/isection/getslideslistofsection/) 取得每個來源節的投影片清單,在目標簡報中重新建立相同的節,然後將每張投影片複製至對應的目標節。完整的節列舉範例請參考 管理投影片節,其中說明了空節與結構變更的處理方式。
安全合併多個簡報
以下端對端範例以第一個簡報作為目標,對每個後續來源正規化投影片尺寸,僅在複製期間保持來源開啟,最後一次性儲存最終檔案。
#include <DOM/ISlideCollection.h>
#include <DOM/ISlideSize.h>
#include <DOM/Presentation.h>
#include <DOM/SlideSizeScaleType.h>
#include <Export/SaveFormat.h>
#include <drawing/size_f.h>
using namespace Aspose::Slides;
using namespace Aspose::Slides::Export;
System::String inputFiles[] = {u"part1.pptx", u"part2.pptx", u"part3.pptx"};
const int32_t inputFileCount = 3;
auto merged = System::MakeObject<Presentation>(inputFiles[0]);
auto mergedSize = merged->get_SlideSize()->get_Size();
for (int32_t fileIndex = 1; fileIndex < inputFileCount; fileIndex++)
{
auto source = System::MakeObject<Presentation>(inputFiles[fileIndex]);
auto sourceSize = source->get_SlideSize()->get_Size();
if (sourceSize.get_Width() != mergedSize.get_Width() ||
sourceSize.get_Height() != mergedSize.get_Height())
{
source->get_SlideSize()->SetSize(
mergedSize.get_Width(),
mergedSize.get_Height(),
SlideSizeScaleType::EnsureFit);
}
for (const auto& slide : source->get_Slides())
{
merged->get_Slides()->AddClone(slide);
}
}
merged->Save(u"merged.pptx", SaveFormat::Pptx);
此範例提供了保留匯入投影片來源格式的基礎。如果您的最終輸出必須使用單一目標主題,請將簡單的 AddClone(slide) 呼叫替換為前述的目標母片或目標版面配置的重載。
實務考量
母片、版面配置與格式保真度
預設的投影片複製會自動將所需的來源母片帶入目標簡報。Aspose.Slides 會維護一個自動複製母片的內部註冊表,以避免重複複製相同的母片。手動預先複製的母片不會被該註冊表追蹤,除非您需要對母片結構進行明確控制,否則請避免預先複製母片。
不要假設名稱相同的兩個母片或版面配置在視覺上等價。如果企業範本必須控制最終外觀,請明確選擇目標母片或版面配置,並在合併後驗證結果。
備註與評論
講者備註與投影片評論與投影片內容關聯,複製投影片時會一併複製。Aspose.Slides 亦提供專門的 API 來處理 簡報備註 與 簡報評論。
若備註頁的格式很重要,請驗證合併後的簡報,因為備註母片是簡報層級的物件,來源檔案之間可能不同。對於審閱工作流程,也請在合併不同作者或範本的檔案後,驗證評論作者與串接評論。
圖片、音訊、影片、OLE 物件與外部連結
投影片可能會引用簡報層級的資源,例如圖片、內嵌音訊、內嵌影片與 OLE 資料。請複製整張投影片,而非僅複製可見圖形,讓 Aspose.Slides 能保留投影片與其資源之間的關聯。
內嵌資源與連結資源的處理方式不同。連結的音訊、影片、OLE 物件或超連結仍然依賴外部目標;複製投影片不會將外部連結自動轉換為內嵌內容。請在最終會開啟合併簡報的環境中測試連結路徑與 URL。
Aspose.Slides 會追蹤自動複製的母片,但這不代表來自不同來源簡報的相同二進位資源一定會被去重。如需控制輸出檔案大小,請自行檢查合併後的封裝並測量結果,而非依賴隱含的去重機制。
內嵌字型與字型可用性
字型在簡報層級管理。如果排版必須在不同機器間保持一致,請勿僅假設複製投影片即可確保所有必要字型在目標環境中可用。您可以使用 [FontsManager::GetEmbeddedFonts](https://reference.aspose.com/slides/zh-hant/cpp/aspose.slides/fontsmanager/getembeddedfonts/) 檢查內嵌字型,並依照 在簡報中內嵌字型 的說明自行管理內嵌。
同時請確認您有權限內嵌來源檔案所使用的字型。字型授權可能會限制內嵌行為。
受密碼保護的簡報
必須先成功開啟受密碼保護的來源簡報,才能複製其投影片。請透過 [LoadOptions::set_Password](https://reference.aspose.com/slides/zh-hant/cpp/aspose.slides/loadoptions/set_password/) 提供密碼。
#include <DOM/LoadOptions.h>
#include <DOM/Presentation.h>
using namespace Aspose::Slides;
auto loadOptions = System::MakeObject<LoadOptions>();
loadOptions->set_Password(u"YOUR_PASSWORD");
auto source = System::MakeObject<Presentation>(u"protected.pptx", loadOptions);
開啟加密來源不會自動將相同保護套用到目標簡報。若需要,請另外設定輸出保護。
大型簡報與記憶體使用
包含高解析度圖片、音訊、影片或其他大型二進位物件的簡報會佔用大量記憶體。[LoadOptions::set_BlobManagementOptions](https://reference.aspose.com/slides/zh-hant/cpp/aspose.slides/loadoptions/set_blobmanagementoptions/) 提供 BLOB 處理與暫存檔使用的控制選項。詳情請參考 管理簡報 BLOB 以取得大型檔案的最佳實踐。
對於大型檔案,優先使用檔案路徑載入,合併完成後立即釋放每個來源簡報,除非工作流程需要檢查點,否則避免重複儲存中間結果。
執行緒安全性
不要同時從多個執行緒載入、修改、儲存或複製同一個 簡報 實例。每個簡報實例應僅用於單一合併作業。若平行處理獨立工作,請使用獨立的簡報實例,並遵循 Aspose.Slides 多執行緒指引。
常見問答
如何保留每個來源簡報的原始設計?
使用不提供目標母片或版面配置的 AddClone。當匯入的投影片需要來源母片時,Aspose.Slides 會自動複製該母片。
如何讓匯入的投影片使用目標主題?
使用接受目標母片的重載。傳入來自目標簡報的母片,而非來源母片。Aspose.Slides 會嘗試將每個來源投影片映射到該母片下的適當版面配置。
什麼時候應使用特定目標版面配置而非目標母片?
當所有匯入的投影片都必須使用同一已知版面配置時,使用特定版面配置;當希望 Aspose.Slides 依據來源版面配置的類型或名稱在母片的版面配置中自動選擇時,使用母片。
不同投影片尺寸的簡報可以合併嗎?
可以,但投影片內容不會自動重新設計以符合目標尺寸。若需要可預測的版面配置,請先使用 [SlideSize::SetSize](https://reference.aspose.com/slides/zh-hant/cpp/aspose.slides/slidesize/setsize/) 和 [SlideSizeScaleType::EnsureFit](https://reference.aspose.com/slides/zh-hant/cpp/aspose.slides/slidesizescaletype/) 重新調整來源簡報。
可以將 PPT、PPTX 與 ODP 簡報合併為同一個檔案嗎?
可以。載入每個來源簡報,將所需投影片複製至同一目標簡報,然後以支援的輸出格式儲存。由於不同簡報格式的功能集可能不完全相同,請在跨格式合併後檢查複雜內容。參考 支援的檔案格式。
來源節會自動保留嗎?
基本的僅複製投影片的迴圈不會保留節。若需要保留節,請在目標簡報中重新建立所需節,並使用 [AddClone](https://reference.aspose.com/slides/zh-hant/cpp/aspose.slides/islidecollection/addclone/) 的節重載。
講者備註與評論會保留嗎?
會隨複製的投影片一起複製。對於依賴備註母片樣式、評論作者或串接審閱資料的工作流程,請在合併後驗證結果,因為這些情況涉及簡報層級結構以及投影片層級內容。
音訊、影片、OLE 物件與超連結會怎樣處理?
內嵌內容會隨複製的投影片資源關聯一起保留。外部連結仍保持外部狀態,合併後仍需確保其目標檔案或 URL 可用。
所有來源的內嵌字型是否保證在合併簡報中可用?
不要僅依賴投影片複製來部署字型。請檢查目標簡報的內嵌字型,並在排版重要時明確管理字型內嵌或外部字型可用性。
如何合併受密碼保護的檔案?
使用正確的 [LoadOptions::set_Password](https://reference.aspose.com/slides/zh-hant/cpp/aspose.slides/loadoptions/set_password/) 開啟檔案,然後照常複製投影片。輸出保護需另行設定。
如何處理非常大型的簡報?
在大型二進位物件佔用記憶體的情況下使用 BLOB 管理,盡可能以檔案路徑載入,及時釋放來源簡報,僅在必要時儲存最終結果。
可以從多個執行緒合併投影片嗎?
不要在多個執行緒中同時使用同一個 [簡報] 實例。每個合併作業應使用自己的簡報實例以確保執行緒安全。