Получение и обновление информации о презентации на Java

Обзор

Aspose.Slides может определить формат презентации и прочитать её метаданные без создания полной модели объектов презентации. Это полезно, когда необходимо классифицировать файлы, создать инвентарь или проверить свойства перед тем, как решить, загружать и обрабатывать содержимое презентации.

В этой статье показана легковесная проверка с помощью PresentationFactory и IPresentationInfo, а также целевые обновления с помощью IDocumentProperties.

Проверка формата презентации

Если у вас уже загружена презентация, см. Determine the Original Presentation Format для обнаружения после загрузки и ограничений устаревших потоков PPT, PPS и POT.

Используйте 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 презентации.

Исходные свойства документа 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);
}

Следующее изображение показывает изменённые свойства документа PowerPoint презентации.

Изменённые свойства документа PowerPoint презентации

Полезные ссылки

Для связанных проверок безопасности и настроек защиты см. следующие статьи:

FAQ

Как проверить, встроены ли шрифты и какие именно?

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