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

Обзор

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

Примеры требуют Aspose.Slides for Python via Java и совместимую среду выполнения Java. Каждый пример запускает JVM, если она ещё не запущена. Предоставьте существующие файлы презентаций по путям, используемым в примерах.

В этой статье демонстрируется лёгкая проверка через PresentationFactory и PresentationInfo, а также целевые обновления через DocumentProperties.

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

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

Используйте PresentationFactory.getPresentationInfo для проверки файла без создания экземпляра Presentation. Метод PresentationInfo.getLoadFormat сообщает обнаруженный формат, например PPTX, PPT или ODP.

import jpype
import asposeslides

if not jpype.isJVMStarted():
    jpype.startJVM()

from asposeslides.api import LoadFormat, PresentationFactory

file_names = ["pres.pptx", "pres.ppt", "pres.odp"]

for file_name in file_names:
    presentation_info = PresentationFactory.getInstance().getPresentationInfo(file_name)
    load_format = presentation_info.getLoadFormat()
    format_name = f"Other ({load_format})"

    if load_format == LoadFormat.Pptx:
        format_name = "PPTX"
    elif load_format == LoadFormat.Ppt:
        format_name = "PPT"
    elif load_format == LoadFormat.Odp:
        format_name = "ODP"

    print(f"{file_name}: {format_name}")

Создание облегчённого инвентаря презентаций

При обработке большого количества файлов презентаций может потребоваться компактный инвентарь для проверки, индексации или системы управления документами. В этом случае используйте PresentationFactory.getPresentationInfo чтобы получить объект PresentationInfo, а затем вызовите PresentationInfo.readDocumentProperties для чтения метаданных документа. Такой подход не создаёт экземпляр Presentation и не требует обхода полной объектной модели презентации.

Расширенные свойства, предоставляемые DocumentProperties, дают следующие значения инвентаря:

Метод Значение
getSlides Общее количество слайдов.
getHiddenSlides Количество скрытых слайдов.
getNotes Количество слайдов, содержащих заметки.
getParagraphs Общее количество абзацев, если доступно.
getWords Общее количество слов.
getMultimediaClips Общее количество аудио‑ и видеоклипов.

Следующий пример считывает эти значения без создания объекта Presentation и выводит компактный инвентарь. Он также комбинирует getHeadingPairs с getTitlesOfParts для отображения групп содержимого, таких как шрифты, темы и заголовки слайдов.

import jpype
import asposeslides

if not jpype.isJVMStarted():
    jpype.startJVM()

from pathlib import Path
from asposeslides.api import LoadFormat, PresentationFactory

file_path = "sample.pptx"
presentation_info = PresentationFactory.getInstance().getPresentationInfo(file_path)
document_properties = presentation_info.readDocumentProperties()

load_format = presentation_info.getLoadFormat()
format_name = f"Other ({load_format})"

if load_format == LoadFormat.Pptx:
    format_name = "PPTX"
elif load_format == LoadFormat.Ppt:
    format_name = "PPT"
elif load_format == LoadFormat.Odp:
    format_name = "ODP"

print(f"File: {Path(file_path).name}")
print(f"Format: {format_name}")
print(f"Title: {document_properties.getTitle()}")
print(f"Author: {document_properties.getAuthor()}")
print("Statistics:")
print(f"  Slides: {document_properties.getSlides()}")
print(f"  Hidden slides: {document_properties.getHiddenSlides()}")
print(f"  Slides with notes: {document_properties.getNotes()}")
print(f"  Paragraphs: {document_properties.getParagraphs()}")
print(f"  Words: {document_properties.getWords()}")
print(f"  Multimedia clips: {document_properties.getMultimediaClips()}")

heading_pairs = document_properties.getHeadingPairs()
titles_of_parts = document_properties.getTitlesOfParts()
heading_pairs = heading_pairs if heading_pairs is not None else []
titles_of_parts = titles_of_parts if titles_of_parts is not None else []
part_index = 0

if len(heading_pairs) == 0 or len(titles_of_parts) == 0:
    print("Content groups: not available")
else:
    print("Content groups:")

    for heading_pair in heading_pairs:
        print(f"  {heading_pair.getName()} ({heading_pair.getCount()})")

        for part_offset in range(heading_pair.getCount()):
            if part_index >= len(titles_of_parts):
                break
            print(f"    - {titles_of_parts[part_index]}")
            part_index += 1

    if part_index < len(titles_of_parts):
        print("  Other parts:")

        while part_index < len(titles_of_parts):
            print(f"    - {titles_of_parts[part_index]}")
            part_index += 1

Каждый HeadingPair предоставляет имя группы и количество элементов в этой группе. DocumentProperties.getTitlesOfParts возвращает плоский упорядоченный массив, поэтому нужно потреблять количество последовательных заголовков, указанное каждым HeadingPair.

Хранимые метаданные и ограничения форматов

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

  • PPTX: Формат предоставляет расширенные свойства документа для подсчётов слайдов, заметок, скрытых слайдов, абзацев, слов и мультимедийных клипов, а также пары заголовков и названия частей. Доступность зависит от того, какие свойства записал создатель документа.
  • PPT: Бинарный формат может хранить соответствующие свойства‑резюме документа. Если свойство отсутствует или не было обновлено производителем документа, Aspose.Slides возвращает его сохранённое или значение по умолчанию, а не вычисляет его из слайдов.
  • ODP: Метаданные OpenDocument предоставляют общую статистику документа, такую как количество страниц, абзацев и слов, но эти значения не сопоставляются со всеми расширенными свойствами PowerPoint. Метаданные о скрытых слайдах, слайдах‑заметках, мультимедиа, парах заголовков и названиях частей могут быть недоступны, и свойства инвентаря могут возвращать значения по умолчанию. Не рассматривайте нулевое значение или пустой массив как окончательное доказательство отсутствия соответствующего содержимого.

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

Обновление свойств презентации

Свойства, возвращаемые PresentationInfo.readDocumentProperties, также можно изменить без создания экземпляра Presentation. Примените изменения с помощью PresentationInfo.updateDocumentProperties, а затем запишите связанную презентацию через PresentationInfo.writeBindedPresentation.

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

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

Следующий пример изменяет заголовок и время последнего сохранения и записывает результат в новый файл:

import jpype
import asposeslides

if not jpype.isJVMStarted():
    jpype.startJVM()

from asposeslides.api import PresentationFactory
from java.io import FileOutputStream
from java.util import Date

source_file = "sample.pptx"
output_file = "sample_with_updated_properties.pptx"
presentation_info = PresentationFactory.getInstance().getPresentationInfo(source_file)
document_properties = presentation_info.readDocumentProperties()

document_properties.setTitle("Quarterly sales report")
last_saved_time = Date()
document_properties.setLastSavedTime(last_saved_time)

presentation_info.updateDocumentProperties(document_properties)
output_stream = FileOutputStream(output_file)
try:
    presentation_info.writeBindedPresentation(output_stream)
finally:
    output_stream.close()

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

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

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

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

FAQ

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

Загрузите презентацию и используйте Presentation.getFontsManager. Вызовите FontsManager.getEmbeddedFonts, чтобы получить встроенные шрифты, и FontsManager.getFonts, чтобы получить шрифты, используемые в презентации. Сравните обоих результатов, чтобы найти шрифты, необходимые для отображения, но не встроенные.

Как быстро определить, есть ли в файле скрытые слайды и их количество?

Если хранимые метаданные документа достаточны, прочитайте DocumentProperties.getHiddenSlides через PresentationFactory.getPresentationInfo и PresentationInfo.readDocumentProperties. Это подходит для лёгкого инвентаря. Если презентация была изменена в памяти, хранимые метаданные могут быть отсутствовать или устареть, либо требуется проверить живые значения, пройдите через Presentation.getSlides и проверьте метод Slide.getHidden у каждого слайда.

Можно ли обнаружить, использованы ли пользовательские размеры и ориентация слайда, и отличаются ли они от значений по умолчанию?

Да. Загрузите презентацию и вызовите Presentation.getSlideSize. Используйте SlideSize.getType, SlideSize.getSize и SlideSize.getOrientation, чтобы сравнить текущие настройки с ожидаемыми предустановками и размерами.

Есть ли быстрый способ увидеть, ссылаются ли диаграммы на внешние источники данных?

Да. Найдите каждую Chart и вызовите ChartData.getDataSourceType. Для внешней книги вызовите ChartData.getExternalWorkbookPath. Тип источника данных и путь указывают на внешнюю ссылку, но проверка доступности цели требует отдельной проверки ресурсов.

Как оценить «тяжёлые» слайды, которые могут замедлять рендеринг или экспорт в PDF?

Нет единого свойства сложности. Пройдите через Presentation.getSlides и коллекцию BaseSlide.getShapes каждого слайда. Используйте количество фигур и наличие больших изображений, эффектов, анимаций или мультимедиа как сигналы отсева, и измерьте представительный рендеринг или экспорт, прежде чем считать слайд подтверждённым узким местом производительности.