Получить и обновить информацию о презентации в Java
Обзор
Aspose.Slides может определять формат презентации и читать её метаданные документа без создания полной модели объектной структуры презентации. Это полезно, когда необходимо классифицировать файлы, создавать инвентарь или проверять свойства перед тем, как решить, загружать и обрабатывать содержимое презентации.
В этой статье демонстрируется лёгкая проверка с помощью PresentationFactory и IPresentationInfo, а также целевые обновления с помощью IDocumentProperties.
Проверка формата презентации
Используйте PresentationFactory.getPresentationInfo для проверки файла без создания экземпляра Presentation. Метод IPresentationInfo.getLoadFormat сообщает обнаруженный формат, например PPTX, PPT или ODP.
import com.aspose.slides.IPresentationInfo;
import com.aspose.slides.LoadFormat;
import com.aspose.slides.PresentationFactory;
String[] fileNames = { "pres.pptx", "pres.ppt", "pres.odp" };
for (String fileName : fileNames) {
IPresentationInfo presentationInfo = PresentationFactory.getInstance().getPresentationInfo(fileName);
int loadFormat = presentationInfo.getLoadFormat();
String formatName = "Other (" + loadFormat + ")";
if (loadFormat == LoadFormat.Pptx) {
formatName = "PPTX";
} else if (loadFormat == LoadFormat.Ppt) {
formatName = "PPT";
} else if (loadFormat == LoadFormat.Odp) {
formatName = "ODP";
}
System.out.println(fileName + ": " + formatName);
}
Создание лёгкого инвентаря презентаций
Когда вы обрабатываете множество файлов презентаций, может потребоваться компактный инвентарь для проверки, индексирования или системы управления документами. В данном случае используйте PresentationFactory.getPresentationInfo чтобы получить объект IPresentationInfo, а затем вызовите IPresentationInfo.readDocumentProperties для чтения метаданных документа. Этот подход не создаёт экземпляр Presentation и не требует обхода полной модели объектной структуры презентации.
Расширенные свойства, предоставляемые IDocumentProperties, дают следующие значения инвентаря:
| Метод | Значение инвентаря |
|---|---|
| getSlides | Общее количество слайдов. |
| getHiddenSlides | Количество скрытых слайдов. |
| getNotes | Количество слайдов, содержащих заметки. |
| getParagraphs | Общее количество абзацев, если доступно. |
| getWords | Общее количество слов. |
| getMultimediaClips | Общее количество аудио- и видеоклипов. |
Следующий пример считывает эти значения без создания объекта Presentation и выводит компактный инвентарь. Он также комбинирует getHeadingPairs с getTitlesOfParts , чтобы отобразить группы содержимого, такие как шрифты, темы и заголовки слайдов.
import com.aspose.slides.IDocumentProperties;
import com.aspose.slides.IHeadingPair;
import com.aspose.slides.IPresentationInfo;
import com.aspose.slides.LoadFormat;
import com.aspose.slides.PresentationFactory;
import java.nio.file.Paths;
String filePath = "sample.pptx";
IPresentationInfo presentationInfo = PresentationFactory.getInstance().getPresentationInfo(filePath);
IDocumentProperties documentProperties = presentationInfo.readDocumentProperties();
int loadFormat = presentationInfo.getLoadFormat();
String formatName = "Other (" + loadFormat + ")";
if (loadFormat == LoadFormat.Pptx) {
formatName = "PPTX";
} else if (loadFormat == LoadFormat.Ppt) {
formatName = "PPT";
} else if (loadFormat == LoadFormat.Odp) {
formatName = "ODP";
}
System.out.println("File: " + Paths.get(filePath).getFileName());
System.out.println("Format: " + formatName);
System.out.println("Title: " + documentProperties.getTitle());
System.out.println("Author: " + documentProperties.getAuthor());
System.out.println("Statistics:");
System.out.println(" Slides: " + documentProperties.getSlides());
System.out.println(" Hidden slides: " + documentProperties.getHiddenSlides());
System.out.println(" Slides with notes: " + documentProperties.getNotes());
System.out.println(" Paragraphs: " + documentProperties.getParagraphs());
System.out.println(" Words: " + documentProperties.getWords());
System.out.println(" Multimedia clips: " + documentProperties.getMultimediaClips());
IHeadingPair[] headingPairs = documentProperties.getHeadingPairs();
String[] titlesOfParts = documentProperties.getTitlesOfParts();
headingPairs = headingPairs != null ? headingPairs : new IHeadingPair[0];
titlesOfParts = titlesOfParts != null ? titlesOfParts : new String[0];
int partIndex = 0;
if (headingPairs.length == 0 || titlesOfParts.length == 0) {
System.out.println("Content groups: not available");
} else {
System.out.println("Content groups:");
for (IHeadingPair headingPair : headingPairs) {
System.out.println(" " + headingPair.getName() + " (" + headingPair.getCount() + ")");
for (int partOffset = 0; partOffset < headingPair.getCount() && partIndex < titlesOfParts.length; partOffset++) {
System.out.println(" - " + titlesOfParts[partIndex]);
partIndex++;
}
}
if (partIndex < titlesOfParts.length) {
System.out.println(" Other parts:");
while (partIndex < titlesOfParts.length) {
System.out.println(" - " + titlesOfParts[partIndex]);
partIndex++;
}
}
}
Каждый IHeadingPair предоставляет имя группы и количество элементов в этой группе. IDocumentProperties.getTitlesOfParts возвращает плоский упорядоченный массив, поэтому используйте количество последовательных заголовков, указанных для каждой пары заголовков.
Сохранённые метаданные и ограничения форматов
Свойства инвентаря, возвращаемые IPresentationInfo.readDocumentProperties отражают метаданные, доступные в исходном документе. Aspose.Slides не загружает и не обходит модель объектной структуры презентации для пересчёта этих значений в этом вызове. Отсутствующие свойства представлены значениями по умолчанию, а сохранённые значения могут быть устаревшими, если приложение, последним сохранившее файл, не обновило свойства документа.
- PPTX: Формат предоставляет расширенные свойства документа для подсчётов слайдов, заметок, скрытых слайдов, абзацев, слов и мультимедиа, а также пар заголовков и названий частей. Доступность зависит от того, какие свойства записал производитель документа.
- PPT: Бинарный формат может хранить соответствующие свойства сводки документа. Если свойство отсутствует или не было обновлено производителем документа, Aspose.Slides возвращает его сохранённое или значение по умолчанию, а не вычисляет его из слайдов.
- ODP: Метаданные OpenDocument предоставляют общую статистику документа, такую как количество страниц, абзацев и слов, но эти значения не соответствуют каждому специфическому расширенному свойству PowerPoint. Метаданные скрытых слайдов, слайдов‑заметок, мультимедиа, пар заголовков и названий частей могут быть недоступны, и свойства инвентаря могут возвращать значения по умолчанию. Не рассматривайте нулевое значение или пустой массив как окончательное доказательство отсутствия соответствующего содержимого.
Используйте подход лёгких метаданных для инвентарей и предварительных проверок. Загружайте презентацию и проверяйте её живую модель объектной структуры, когда результат должен отражать изменения в памяти или когда необходимо проверить фактическое содержимое презентации.
Обновление свойств презентации
Свойства, возвращаемые IPresentationInfo.readDocumentProperties также можно изменять без создания экземпляра Presentation. Примените изменения с помощью IPresentationInfo.updateDocumentProperties, а затем запишите связанную презентацию с помощью IPresentationInfo.writeBindedPresentation.
На следующем изображении показаны исходные свойства документа PowerPoint-презентации.

В следующем примере изменяется заголовок и время последнего сохранения, и результат записывается в новый файл:
import com.aspose.slides.IDocumentProperties;
import com.aspose.slides.IPresentationInfo;
import com.aspose.slides.PresentationFactory;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.util.Date;
String sourceFile = "sample.pptx";
String outputFile = "sample_with_updated_properties.pptx";
IPresentationInfo presentationInfo = PresentationFactory.getInstance().getPresentationInfo(sourceFile);
IDocumentProperties documentProperties = presentationInfo.readDocumentProperties();
documentProperties.setTitle("Quarterly sales report");
documentProperties.setLastSavedTime(new Date());
presentationInfo.updateDocumentProperties(documentProperties);
try (OutputStream outputStream = new FileOutputStream(outputFile)) {
presentationInfo.writeBindedPresentation(outputStream);
}

Полезные ссылки
Для связанных проверок безопасности и настроек защиты смотрите следующие статьи:
Часто задаваемые вопросы
Как проверить, встроены ли шрифты и какие именно?
Загрузите презентацию и используйте Presentation.getFontsManager. Вызовите IFontsManager.getEmbeddedFonts для получения встроенных шрифтов и IFontsManager.getFonts для получения шрифтов, используемых в презентации. Сравните оба результата, чтобы найти шрифты, необходимые для отображения, но не встроенные.
Как быстро определить, есть ли в файле скрытые слайды и сколько их?
Если метаданные документа достаточны, считайте IDocumentProperties.getHiddenSlides через PresentationFactory.getPresentationInfo и IPresentationInfo.readDocumentProperties. Это подходит для лёгкого инвентаря. Если презентация была изменена в памяти, сохранённые метаданные могут отсутствовать или быть устаревшими, либо нужно проверить живые значения, пройдите по Presentation.getSlides и проверьте метод ISlide.getHidden каждого слайда.
Можно ли определить, используется ли пользовательский размер и ориентация слайда, и отличаются ли они от значений по умолчанию?
Да. Загрузите презентацию и вызовите Presentation.getSlideSize. Используйте ISlideSize.getType, ISlideSize.getSize и ISlideSize.getOrientation , чтобы сравнить текущие настройки с ожидаемыми предустановками и размерами.
Есть ли быстрый способ узнать, ссылаются ли диаграммы на внешние источники данных?
Да. Найдите каждую Chart и вызовите IChartData.getDataSourceType. Для внешней рабочей книги вызовите IChartData.getExternalWorkbookPath. Тип и путь источника данных указывают на внешнюю ссылку, но проверка доступности ресурса требует отдельной проверки.
Как оценить «тяжёлые» слайды, которые могут замедлять рендеринг или экспорт в PDF?
Единого свойства сложности не существует. Обойдите Presentation.getSlides и коллекцию IBaseSlide.getShapes каждого слайда. Используйте количество фигур и наличие больших изображений, эффектов, анимаций или мультимедиа как сигналы, а также измерьте представительный рендер или экспорт, прежде чем считать слайд подтверждённым узким местом производительности.