Получить и обновить информацию о презентации на 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: Метаданные OpenDocument предоставляют общую статистику документа, такую как количество страниц, абзацев и слов, но эти значения не сопоставляются со всеми расширенными свойствами 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 презентации.

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