استرجاع وتحديث معلومات العرض التقديمي في .NET

نظرة عامة

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

توضح هذه المقالة الفحص الخفيف الوزن عبر PresentationFactory وIPresentationInfo، بالإضافة إلى التحديثات المستهدفة عبر IDocumentProperties.

التحقق من تنسيق العرض التقديمي

إذا كان لديك عرض تقديمي مُحمَّل بالفعل، انظر إلى تحديد تنسيق العرض التقديمي الأصلي للكشف بعد التحميل وقيود تدفقات PPT وPPS وPOT القديمة.

استخدم PresentationFactory.GetPresentationInfo لفحص ملف دون إنشاء مثال Presentation. خاصية IPresentationInfo.LoadFormat تُبلغ عن التنسيق المُكتشف، مثل PPTX أو PPT أو ODP.

using System;
using Aspose.Slides;

var fileNames = new[] { "pres.pptx", "pres.ppt", "pres.odp" };

foreach (var fileName in fileNames)
{
    var presentationInfo = PresentationFactory.Instance.GetPresentationInfo(fileName);
    Console.WriteLine($"{fileName}: {presentationInfo.LoadFormat}");
}

إنشاء جرد عرض تقديمي خفيف الوزن

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

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

الخاصية قيمة المخزون
Slides إجمالي عدد الشرائح.
HiddenSlides عدد الشرائح المخفية.
Notes عدد الشرائح التي تحتوي على ملاحظات.
Paragraphs إجمالي عدد الفقرات، إذا كانت متاحة.
Words إجمالي عدد الكلمات.
MultimediaClips إجمالي عدد مقاطع الصوت والفيديو.

المثال التالي يقرأ هذه القيم دون إنشاء كائن [Presentation] ويطبع جردًا مُضغَطًا. كما يجمع بين [HeadingPairs] و[TitlesOfParts] لعرض مجموعات المحتوى مثل الخطوط، السمات، وعناوين الشرائح.

using System;
using System.IO;
using Aspose.Slides;

var filePath = "sample.pptx";
var presentationInfo = PresentationFactory.Instance.GetPresentationInfo(filePath);
var documentProperties = presentationInfo.ReadDocumentProperties();

Console.WriteLine($"File: {Path.GetFileName(filePath)}");
Console.WriteLine($"Format: {presentationInfo.LoadFormat}");
Console.WriteLine($"Title: {documentProperties.Title}");
Console.WriteLine($"Author: {documentProperties.Author}");
Console.WriteLine("Statistics:");
Console.WriteLine($"  Slides: {documentProperties.Slides}");
Console.WriteLine($"  Hidden slides: {documentProperties.HiddenSlides}");
Console.WriteLine($"  Slides with notes: {documentProperties.Notes}");
Console.WriteLine($"  Paragraphs: {documentProperties.Paragraphs}");
Console.WriteLine($"  Words: {documentProperties.Words}");
Console.WriteLine($"  Multimedia clips: {documentProperties.MultimediaClips}");

var headingPairs = documentProperties.HeadingPairs ?? Array.Empty<IHeadingPair>();
var titlesOfParts = documentProperties.TitlesOfParts ?? Array.Empty<string>();
var partIndex = 0;

if (headingPairs.Length == 0 || titlesOfParts.Length == 0)
{
    Console.WriteLine("Content groups: not available");
}
else
{
    Console.WriteLine("Content groups:");

    foreach (var headingPair in headingPairs)
    {
        Console.WriteLine($"  {headingPair.Name} ({headingPair.Count})");

        for (var partOffset = 0; partOffset < headingPair.Count && partIndex < titlesOfParts.Length; partOffset++)
        {
            Console.WriteLine($"    - {titlesOfParts[partIndex]}");
            partIndex++;
        }
    }

    if (partIndex < titlesOfParts.Length)
    {
        Console.WriteLine("  Other parts:");

        while (partIndex < titlesOfParts.Length)
        {
            Console.WriteLine($"    - {titlesOfParts[partIndex]}");
            partIndex++;
        }
    }
}

كل [IHeadingPair] يوفر اسم المجموعة وعدد العناصر في تلك المجموعة. [IDocumentProperties.TitlesOfParts] هو مصفوفة مسطحة ومُرتبة، لذا استهلك عدد العناوين المتتابعة المحدد بواسطة كل زوج عنوان.

البيانات الوصفية المخزنة وقيود التنسيق

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

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

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

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

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

الصورة التالية تُظهر خصائص المستند الأصلية لعرض PowerPoint:

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

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

using System;
using System.IO;
using Aspose.Slides;

var sourceFile = "sample.pptx";
var outputFile = "sample_with_updated_properties.pptx";
var presentationInfo = PresentationFactory.Instance.GetPresentationInfo(sourceFile);
var documentProperties = presentationInfo.ReadDocumentProperties();

documentProperties.Title = "Quarterly sales report";
documentProperties.LastSavedTime = DateTime.UtcNow;

presentationInfo.UpdateDocumentProperties(documentProperties);
using var outputStream = File.Create(outputFile);
presentationInfo.WriteBindedPresentation(outputStream);

الصورة التالية تُظهر خصائص المستند المعدلة لعرض PowerPoint:

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

روابط مفيدة

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

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

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

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

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

عند كفاية البيانات الوصفية المخزنة، اقرأ IDocumentProperties.HiddenSlides عبر PresentationFactory.GetPresentationInfo وIPresentationInfo.ReadDocumentProperties. هذا مناسب لجرد خفيف. إذا تم تعديل العرض في الذاكرة، قد تكون البيانات الوصفية المخزنة مفقودة أو قديمة، أو تحتاج إلى التحقق من القيم الحية؛ في هذه الحالة تجوَّل Presentation.Slides وتفحص خاصية Slide.Hidden لكل شريحة.

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

نعم. حمِّل العرض التقديمي واقرأ Presentation.SlideSize. تفحّص ISlideSize.Type، ISlideSize.Size، وISlideSize.Orientation لمقارنة الإعدادات الحالية مع القالب والأبعاد المتوقعة.

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

نعم. ابحث عن كل Chart وتفحّص ChartData.DataSourceType. للوركبوك الخارجي، اقرأ ChartData.ExternalWorkbookPath. يُحدِّد نوع مصدر البيانات والمسار إشارة إلى مرجع خارجي، لكن التحقق من توفر الهدف يتطلب فحص موارد منفصل.

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

لا توجد خاصية تعقيد واحدة. تجوَّل Presentation.Slides وكل مجموعة IBaseSlide.Shapes لكل شريحة. استخدم عدد الأشكال ووجود صور كبيرة، تأثيرات، رسومات متحركة، أو وسائط متعددة كإشارات فحص، وقُم بقياس تصيير أو تصدير تمثيلي قبل اعتبار شريحة معينة كعقبة أداء مؤكدة.