دمج العروض التقديمية بفعالية في C++

نظرة عامة

يقوم Aspose.Slides لـ C++ بدمج العروض التقديمية عن طريق استنساخ الشرائح من عرض تقديمي واحد إلى آخر. العملية الأساسية هي ISlideCollection::AddClone، التي يمكنها الحفاظ على تنسيق الشريحة الأصلية أو ربط الشريحة المستنسخة بماستر أو تخطيط في عرض تقديمي الوجهة.

يغطي هذا المقال أكثر سيناريوهات الدمج شيوعاً:

  • دمج جميع الشرائح مع الحفاظ على تنسيق المصدر؛
  • دمج شرائح مختارة؛
  • تطبيق ماستر من عرض تقديمي الوجهة؛
  • تطبيق تخطيط معين من عرض تقديمي الوجهة؛
  • توحيد أحجام الشرائح المختلفة قبل الدمج؛
  • إضافة شرائح مستنسخة إلى قسم؛
  • دمج عدة عروض تقديمية في تدفق عمل شامل من البداية إلى النهاية؛
  • معالجة الماسترات، الموارد، الملاحظات، التعليقات، الوسائط، الخطوط، كلمات المرور، الملفات الكبيرة، ومقاييس الخيوط المتعددة.

كيف يؤثر استنساخ الشرائح على الماسترات والتخطيطات

تستمد الشريحة جزءاً كبيراً من مظهرها من التخطيط والماستر الخاصين بها. لهذا السبب، يحدد اختيارك للتحميل الزائد (overload) طريقة دمج الشريحة المستنسخة في عرض تقديمي الوجهة.

استخدم 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 تعديل المحتوى الموجود أثناء تغيير أبعاد الشريحة. يضمن النوع SlideSizeScaleType::EnsureFit ملاءمة المحتوى للحجم المطلوب.

#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).

#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، احصل على الشرائح الحالية لكل قسم مصدر عبر ISection::GetSlidesListOfSection، أعد إنشاء الأقسام في الوجهة، واستنسخ كل شريحة مرتجعة إلى قسم الوجهة المقابل. راجع مثال Manage Slide Sections للحصول على مثال كامل لتعداد الأقسام، بما في ذلك الأقسام الفارغة والتغييرات الهيكلية.

دمج عدة عروض تقديمية بأمان

المثال النهائي التالي يستخدم العرض التقديمي الأول كوجهة، يطبع حجم الشرائح لكل مصدر إضافي، يبقي كل مصدر مفتوحًا فقط أثناء النسخ، ويحفظ الملف النهائي مرةً واحدة.

#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 أيضًا واجهات برمجة تطبيقات مخصصة لـ presentation notes وpresentation comments.

إذا كان تنسيق صفحة الملاحظات مهمًا، تحقق من العرض التقديمي المدمج لأن ماسترات الملاحظات هي كائنات على مستوى العرض وقد تختلف بين ملفات المصدر. في سير عمل المراجعة، تحقق أيضًا من مؤلفي التعليقات وسلاسل التعليقات بعد دمج ملفات من مؤلفين أو قوالب مختلفة.

الصور، الصوت، الفيديو، كائنات OLE، والروابط الخارجية

يمكن للشرائح الإشارة إلى موارد على مستوى العرض مثل الصور، الصوت المضمّن، الفيديو المضمّن، وبيانات OLE. استنسخ الشريحة نفسها بدلاً من نسخ الأشكال المرئية فقط حتى يتمكن Aspose.Slides من الحفاظ على علاقات الشريحة بمواردها.

يجب معاملة الموارد المضمّنة والمربوطة بشكل مختلف. يبقى الصوت أو الفيديو أو كائن OLE أو الارتباط التشعبي المرتبط يعتمد على هدفه الخارجي؛ لا يحول استنساخ الشريحة رابطًا خارجيًا إلى محتوى مضمّن. اختبر مسارات الموارد المربوطة وعناوين URL في البيئة التي سيفتح فيها العرض المدمج.

يتتبع Aspose.Slides تلقائيًا الماسترات المستنسخة، لكن لا ينبغي اعتبار ذلك ضمانًا عامًّا أن الموارد الثنائية المتطابقة من مصادر غير مرتبطة ستُدمج دائمًا دون تكرار. إذا كان حجم ملف الإخراج مهمًا، افحص الحزمة المدمجة وقم بقياس النتيجة بدلاً من الاعتماد على الإزالة الضمنية للتكرارات.

الخطوط المضمَّنة وتوافر الخطوط

تُدار الخطوط على مستوى العرض. إذا كان من الضروري الحفاظ على التناسق الطباعي عبر الأجهزة، لا تفترض أن استنساخ الشرائح وحده يضمن توفر كل الخطوط المطلوبة في بيئة الوجهة. يمكنك فحص الخطوط المضمَّنة عبر FontsManager::GetEmbeddedFonts وإدارة التضمين صراحةً كما هو موضح في Embed Fonts in Presentations.

تحقق أيضًا من أنك مسموح لك بتضمين الخطوط المستخدمة في ملفات المصدر. قد تقيد تراخيص الخطوط عملية التضمين.

العروض التقديمية المحمية بكلمة مرور

يجب فتح مصدر محمي بكلمة مرور بنجاح قبل أن يمكن استنساخ شرائحه. قدّم كلمة المرور عبر 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 ضوابط لمعالجة BLOB واستخدام ملفات مؤقتة. راجع Manage Presentation BLOBs لاستراتيجيات الملفات الكبيرة.

بالنسبة للملفات الكبيرة، يفضَّل التحميل من مسارات الملفات عندما يكون ذلك ممكنًا، وتخلص من كل عرض تقديمي مصدر بمجرد الانتهاء من دمجه، وتجنب حفظ النتائج الوسيطة باستمرار إلا إذا كان سير العمل يتطلب نقاط فحص.

سلامة الخيوط

لا تقم بتحميل أو تعديل أو حفظ أو استنساخ نفس كائن Presentation بصورة متزامنة من عدة خيوط. احفظ كل كائن عرض تقديمي محصورًا في عملية دمج واحدة. إذا قمت بتوازي مهام مستقلة، استخدم كائنات عرض تقديمي مستقلة واتبع دليل Aspose.Slides multithreading guidance.

الأسئلة المتداولة

كيف يمكنني الحفاظ على التصميم الأصلي لكل عرض تقديمي مصدر؟

استخدم AddClone دون تزويد ماستر أو تخطيط وجهة. يستطيع Aspose.Slides استنساخ الماستر المصدر تلقائيًا عندما تحتاجه الشريحة المستوردة.

كيف أجعل الشرائح المستوردة تستخدم سمة الوجهة؟

استخدم التحميل الزائد الذي يقبل ماستر وجهة. مرّر ماسترًا من عرض تقديمي الوجهة، وليس من المصدر. سيحاول Aspose.Slides مطابقة كل شريحة مصدر مع تخطيط مناسب تحت ذلك الماستر.

متى ينبغي استخدام تخطيط وجهة محدد بدلًا من ماستر وجهة؟

استخدم تخطيطًا محددًا عندما يجب أن تستخدم كل شريحة مستوردة تخطيطًا واحدًا معروفًا. استخدم ماسترًا عندما تريد أن يختار Aspose.Slides بين تخطيطات ذلك الماستر بناءً على نوع أو اسم التخطيط الأصلي.

هل يمكن دمج عروض تقديمية بأحجام شرائح مختلفة؟

نعم، لكن محتوى الشريحة لا يُعيد تصميمه تلقائيًا لأبعاد الوجهة. عدّل حجم عرض تقديمي المصدر أولاً عندما تحتاج إلى مواضع متوقعة، على سبيل المثال باستخدام SlideSize::SetSize وSlideSizeScaleType::EnsureFit.

هل يمكنني دمج ملفات PPT و PPTX و ODP في ملف واحد؟

نعم. حمّل كل عرض تقديمي مصدر، استنسخ الشرائح المطلوبة إلى عرض تقديمي وجهة واحد، واحفظ الوجهة بصيغة مدعومة. نظرًا لاختلاف مجموعة الميزات بين صيغ العرض، تحقق من المحتوى المعقد بعد دمج صيغ مختلفة. راجع Supported File Formats.

هل يتم الحفاظ تلقائيًا على أقسام المصدر؟

ليس في حلقة أساسية تستنسخ الشرائح فقط. أعد إنشاء الأقسام المطلوبة في الوجهة واستخدم تحميل زائد القسم من AddClone عندما يجب الحفاظ على هيكل الأقسام.

هل تُحافظ الملاحظات الصوتية والتعليقات؟

تُنسخ مع الشريحة المستنسخة. بالنسبة لسير عمل يعتمد على تنسيق ماستر الملاحظات أو مؤلفي التعليقات أو بيانات المراجعة المتسلسلة، تحقق من النتيجة المدمجة لأن هذه السيناريوهات تشمل هياكل على مستوى العرض بالإضافة إلى محتوى الشرائح.

ماذا يحدث للوسائط (الصوت، الفيديو، كائنات OLE) والروابط التشعبية؟

المحتوى المضمّن يُحمل كجزء من علاقات موارد الشريحة المستنسخة. الروابط الخارجية تظل خارجية، لذلك يجب أن تكون ملفات الهدف أو عناوين URL متاحة بعد الدمج.

هل الخطوط المضمَّنة من كل مصدر مضمونة التوفر في العرض المدمج؟

لا تعتمد على استنساخ الشرائح فقط لنشر الخطوط. فحص الخطوط المضمَّنة في الوجهة وإدارة تضمين الخطوط أو توافر الخطوط الخارجية صراحةً عندما تكون الطباعة مهمة.

كيف أدمج ملفًا محميًا بكلمة مرور؟

افتحه باستخدام LoadOptions::set_Password، ثم استنسخ شرائحه كالمعتاد. يتم تكوين حماية الإخراج بشكل منفصل.

كيف يجب أن أتعامل مع عروض تقديمية كبيرة جدًا؟

استخدم إدارة BLOB عندما تهيمن الكائنات الثنائية الكبيرة على استهلاك الذاكرة، فضلًا عن التحميل من مسارات الملفات للملفات الضخمة، وتخلص من عروض تقديمي المصدر فور الانتهاء من دمجها، واحفظ النتيجة النهائية فقط عند الحاجة.

هل يمكن دمج الشرائح من عدة خيوط؟

لا تستخدم كائن Presentation واحدًا بشكل متزامن من عدة خيوط. احتفظ بكل عملية دمج معزولة على كائن عرض تقديمي خاص بها.