Получение и обновление информации о презентации в .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 , дают следующие значения инвентаря:
| Property | Inventory value |
|---|---|
| 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 презентации.

Следующий пример изменяет заголовок и время последнего сохранения и записывает результат в новый файл:
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);
На следующем изображении показаны обновлённые свойства документа.

Полезные ссылки
Для связанных проверок безопасности и настроек защиты см. следующие статьи:
FAQ
Как проверить, встроены ли шрифты и какие именно?
Загрузите презентацию и используйте 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 каждого слайда. Используйте количество фигур и наличие больших изображений, эффектов, анимаций или мультимедиа как индикаторы, и измерьте репрезентативный рендер или экспорт перед тем, как считать слайд подтверждённым узким местом производительности.