استرجاع وتحديث معلومات العرض في C++

نظرة عامة

يمكن لـ Aspose.Slides تحديد صيغة العرض وقراءة بياناته الوصفية دون إنشاء نموذج كائن عرض كامل. يكون هذا مفيدًا عندما تحتاج إلى تصنيف الملفات، بناء جرد، أو فحص الخصائص قبل اتخاذ قرار بتحميل ومعالجة محتوى العرض.

يُظهر هذا المقال كيفية الفحص الخفيف عبر PresentationFactory وIPresentationInfo، وكذلك التحديثات المستهدفة عبر IDocumentProperties.

التحقق من صيغة العرض

استخدم IPresentationFactory::GetPresentationInfo لفحص ملف دون إنشاء كائن Presentation. تُعيد طريقة IPresentationInfo::get_LoadFormat الصيغة المكتشفة، مثل PPTX أو PPT أو ODP.

#include <DOM/IPresentationInfo.h>
#include <DOM/PresentationFactory.h>
#include <LoadFormat.h>
#include <system/array.h>
#include <system/console.h>
#include <system/object_ext.h>
#include <system/string.h>

using namespace Aspose::Slides;
using namespace System;

auto fileNames = MakeArray<String>({u"pres.pptx", u"pres.ppt", u"pres.odp"});

for (const auto& fileName : fileNames)
{
    auto presentationInfo = PresentationFactory::get_Instance()->GetPresentationInfo(fileName);
    Console::WriteLine(String::Format(u"{0}: {1}", fileName, ObjectExt::ToString(presentationInfo->get_LoadFormat())));
}

بناء جرد عرض خفيف

عند معالجة العديد من ملفات العروض، قد تحتاج إلى جرد مدمج للتحقق أو الفهرسة أو نظام إدارة المستندات. في هذا السيناريو، استخدم IPresentationFactory::GetPresentationInfo للحصول على كائن IPresentationInfo، ثم استدعِ طريقة IPresentationInfo::ReadDocumentProperties لقراءة بيانات المستند الوصفية. لا ينشئ هذا النهج كائن Presentation ولا يتطلب استعراض نموذج كائن العرض بالكامل.

الخصائص الموسعة التي يوفرها IDocumentProperties تُعطي القيم التالية للجرد:

الطريقة قيمة الجرد
get_Slides إجمالي عدد الشرائح.
get_HiddenSlides عدد الشرائح المخفية.
get_Notes عدد الشرائح التي تحتوي على ملاحظات.
get_Paragraphs إجمالي عدد الفقرات، إذا توفرت.
get_Words إجمالي عدد الكلمات.
get_MultimediaClips إجمالي عدد مقاطع الصوت والفيديو.

المثال التالي يقرأ هذه القيم دون إنشاء كائن Presentation ويطبع جردًا مدمجًا. كما يجمع بين IDocumentProperties::get_HeadingPairs وIDocumentProperties::get_TitlesOfParts لعرض مجموعات المحتوى مثل الخطوط، السمات، وعناوين الشرائح.

#include <DOM/IDocumentProperties.h>
#include <DOM/IHeadingPair.h>
#include <DOM/IPresentationInfo.h>
#include <DOM/PresentationFactory.h>
#include <LoadFormat.h>
#include <system/console.h>
#include <system/io/path.h>
#include <system/object_ext.h>
#include <system/string.h>

using namespace Aspose::Slides;
using namespace System;
using namespace System::IO;

auto filePath = String(u"sample.pptx");
auto presentationInfo = PresentationFactory::get_Instance()->GetPresentationInfo(filePath);
auto documentProperties = presentationInfo->ReadDocumentProperties();

Console::WriteLine(String::Format(u"File: {0}", Path::GetFileName(filePath)));
Console::WriteLine(String::Format(u"Format: {0}", ObjectExt::ToString(presentationInfo->get_LoadFormat())));
Console::WriteLine(String::Format(u"Title: {0}", documentProperties->get_Title()));
Console::WriteLine(String::Format(u"Author: {0}", documentProperties->get_Author()));
Console::WriteLine(u"Statistics:");
Console::WriteLine(String::Format(u"  Slides: {0}", documentProperties->get_Slides()));
Console::WriteLine(String::Format(u"  Hidden slides: {0}", documentProperties->get_HiddenSlides()));
Console::WriteLine(String::Format(u"  Slides with notes: {0}", documentProperties->get_Notes()));
Console::WriteLine(String::Format(u"  Paragraphs: {0}", documentProperties->get_Paragraphs()));
Console::WriteLine(String::Format(u"  Words: {0}", documentProperties->get_Words()));
Console::WriteLine(String::Format(u"  Multimedia clips: {0}", documentProperties->get_MultimediaClips()));

auto headingPairs = documentProperties->get_HeadingPairs();
auto titlesOfParts = documentProperties->get_TitlesOfParts();
auto partIndex = 0;

if (headingPairs == nullptr || titlesOfParts == nullptr || headingPairs->get_Length() == 0 || titlesOfParts->get_Length() == 0)
{
    Console::WriteLine(u"Content groups: not available");
}
else
{
    Console::WriteLine(u"Content groups:");

    for (const auto& headingPair : headingPairs)
    {
        auto partCount = headingPair->get_Count();
        Console::WriteLine(String::Format(u"  {0} ({1})", headingPair->get_Name(), partCount));

        for (auto partOffset = 0; partOffset < partCount && partIndex < titlesOfParts->get_Length(); partOffset++)
        {
            Console::WriteLine(String::Format(u"    - {0}", titlesOfParts[partIndex]));
            partIndex++;
        }
    }

    if (partIndex < titlesOfParts->get_Length())
    {
        Console::WriteLine(u"  Other parts:");

        while (partIndex < titlesOfParts->get_Length())
        {
            Console::WriteLine(String::Format(u"    - {0}", titlesOfParts[partIndex]));
            partIndex++;
        }
    }
}

كل IHeadingPair يُوفر اسم المجموعة عبر IHeadingPair::get_Name وعدد العناصر في تلك المجموعة عبر IHeadingPair::get_Count. تُعيد IDocumentProperties::get_TitlesOfParts مصفوفة مسطحة مرتبة، لذا استهلك عدد العناوين المتتالية المحدد لكل زوج عناوين.

البيانات الوصفية المخزنة والقيود على الصيغة

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

  • PPTX: توفر الصيغة خصائص مستند موسعة لعدد الشرائح، الملاحظات، الشرائح المخفية، الفقرات، الكلمات، والوسائط المتعددة، بالإضافة إلى أزواج العناوين وعناوين الأجزاء. تعتمد التوافرية على الخصائص التي كتبها منتج المستند.
  • PPT: يمكن للصيغة الثنائية تخزين خصائص ملخص المستند المقابلة. إذا كانت خاصية غير موجودة أو لم يتم تحديثها من قبل المنتج، تُعيد Aspose.Slides قيمتها المخزنة أو الافتراضية بدلاً من حسابها من الشرائح.
  • ODP: تُوفر بيانات ODF العامة إحصاءات عامة للمستند مثل عدد الصفحات، الفقرات، والكلمات، لكن هذه القيم لا تُطابق كل خاصية موسعة خاصة بـ PowerPoint. قد تكون بيانات الشرائح المخفية، ملاحظات الشرائح، الوسائط المتعددة، أزواج العناوين، وعناوين الأجزاء غير متوفرة، وقد تُعيد خصائص الجرد قيمًا افتراضية. لا تُعامل القيمة الصفرية أو المصفوفة الفارغة كدليل قاطع على غياب المحتوى المقابل.

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

تحديث خصائص العرض

يمكن أيضًا تغيير الخصائص التي تُعيدها IPresentationInfo::ReadDocumentProperties دون إنشاء كائن Presentation؛ طبّق التغييرات باستخدام IPresentationInfo::UpdateDocumentProperties، ثم اكتب العرض المرتبط باستخدام IPresentationInfo::WriteBindedPresentation.

الصورة التالية تُظهر خصائص المستند الأصلية.

خصائص المستند الأصلية للعرض PowerPoint

المثال التالي يغيّر العنوان ووقت الحفظ الأخير ويكتب النتيجة إلى ملف جديد:

#include <DOM/IDocumentProperties.h>
#include <DOM/IPresentationInfo.h>
#include <DOM/PresentationFactory.h>
#include <system/date_time.h>
#include <system/string.h>

using namespace Aspose::Slides;
using namespace System;

auto sourceFile = String(u"sample.pptx");
auto outputFile = String(u"sample_with_updated_properties.pptx");
auto presentationInfo = PresentationFactory::get_Instance()->GetPresentationInfo(sourceFile);
auto documentProperties = presentationInfo->ReadDocumentProperties();

documentProperties->set_Title(u"Quarterly sales report");
documentProperties->set_LastSavedTime(DateTime::get_UtcNow());

presentationInfo->UpdateDocumentProperties(documentProperties);
presentationInfo->WriteBindedPresentation(outputFile);

الصورة التالية تُظهر خصائص المستند المحدثة.

خصائص المستند التي تم تعديلها للعرض PowerPoint

روابط مفيدة

للفحوصات الأمنية ذات الصلة وإعدادات الحماية، راجع المقالات التالية:

الأسئلة المتكررة

كيف يمكنني التحقق مما إذا كانت الخطوط مضمنة وما هي؟

حمل العرض واستخدم Presentation::get_FontsManager. استدعِ FontsManager::GetEmbeddedFonts للحصول على الخطوط المضمنة وFontsManager::GetFonts للحصول على الخطوط المستخدمة في العرض. قارن النتيجتين لتحديد الخطوط المطلوبة للعرض ولكن غير المضمنة.

كيف يمكنني بسرعة معرفة ما إذا كان الملف يحتوي على شرائح مخفية وعددها؟

عند كون البيانات الوصفية المخزنة كافية، اقرأ IDocumentProperties::get_HiddenSlides عبر IPresentationFactory::GetPresentationInfo وIPresentationInfo::ReadDocumentProperties. هذا مناسب لجرد خفيف. إذا تم تعديل العرض في الذاكرة، قد تكون البيانات الوصفية المخزنة مفقودة أو قديمة، أو إذا أردت التحقق من القيم الحية، استعرض Presentation::get_Slides وتفحص طريقة Slide::get_Hidden لكل شريحة بدلاً من ذلك.

هل يمكنني اكتشاف ما إذا كان حجم الشريحة المخصص والاتجاه مستخدمان، وما إذا كانا يختلفان عن الإعدادات الافتراضية؟

نعم. حمّل العرض واقرأ Presentation::get_SlideSize. افحص ISlideSize::get_Type، ISlideSize::get_Size، وISlideSize::get_Orientation لمقارنة الإعدادات الحالية مع القالب والأبعاد المتوقعة.

هل هناك طريقة سريعة لمعرفة ما إذا كانت المخططات تشير إلى مصادر بيانات خارجية؟

نعم. ابحث عن كل Chart وتفحص ChartData::get_DataSourceType. للمصادر الخارجية، اقرأ ChartData::get_ExternalWorkbookPath. نوع مصدر البيانات والمسار يحددان الإشارة الخارجية، لكن التحقق من توفر الهدف يتطلب فحص موارد منفصل.

كيف يمكنني تقييم “الشرائح الثقيلة” التي قد تبطئ العرض أو تصدير PDF؟

لا توجد خاصية تعقيد واحدة. استعرض Presentation::get_Slides ومجموعة IBaseSlide::get_Shapes لكل شريحة. استخدم عدد الأشكال ووجود صور كبيرة، تأثيرات، رسوم متحركة، أو وسائط متعددة كإشارات تصنيف، وقم بقياس عرض تمثيلي أو تصدير قبل اعتبار الشريحة عنق زجاجة أداء مؤكد.