Управление свойствами презентации в Python

Введение

Aspose.Slides поддерживает два типа свойств документов: Встроенные и Пользовательские. Оба типа свойств можно легко получить и управлять ими с помощью API Aspose.Slides.

Aspose.Slides позволяет работать со свойствами презентаций через класс DocumentProperties. Экземпляр этого класса возвращается методом Presentation.getDocumentProperties. Ниже приведены примеры чтения, изменения и управления этими свойствами.

Свойства документа в PowerPoint

Microsoft PowerPoint 2007 позволяет управлять свойствами документов файлов презентаций. Нажмите значок Office и выберите Prepare | Properties | Advanced Properties, как показано ниже:

Выбор пункта меню «Advanced Properties»
PowerPoint document properties
После выбора Advanced Properties появится диалог, где можно управлять свойствами файла PowerPoint:
Диалог свойств
PowerPoint document properties
Диалог свойств содержит вкладки General, Summary, Statistics, Contents и Custom. Эти вкладки позволяют настраивать различную информацию о файлах PowerPoint. Используйте вкладку Custom для управления пользовательскими свойствами.

Работа со свойствами документов с помощью Aspose.Slides для Python via Java

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

Для доступа к этим свойствам используйте Presentation.getDocumentProperties, как показано ниже.

Чтение публичных свойств из зашифрованной презентации

Пароль открытия обычно защищает как содержимое презентации, так и свойства документа. Когда презентация зашифрована передачей false в ProtectionManager.setEncryptDocumentProperties, её свойства документа остаются публичными. Затем приложение может передать true в LoadOptions.setOnlyLoadDocumentProperties и прочитать публичные метаданные без указания пароля открытия.

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

Следующий пример проверяет режим загрузки через ProtectionManager.isOnlyDocumentPropertiesLoaded, а затем читает встроенные свойства через Presentation.getDocumentProperties:

import jpype
import asposeslides

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

from asposeslides.api import Presentation, LoadOptions

load_options = LoadOptions()
load_options.setOnlyLoadDocumentProperties(True)

presentation = Presentation("public-properties-encrypted.pptx", load_options)
try:
    if presentation.getProtectionManager().isOnlyDocumentPropertiesLoaded():
        properties = presentation.getDocumentProperties()

        print("Author: ", properties.getAuthor())
        print("Title: ", properties.getTitle())
        print("Keywords: ", properties.getKeywords())
    else:
        print("The presentation was not loaded in document-properties-only mode.")

finally:
    presentation.dispose()

В этом режиме содержимое слайдов не загружается. Слайды, шаблоны, макеты, фигуры, медиа и другие объекты презентации недоступны. Приложения должны всегда проверять ProtectionManager.isOnlyDocumentPropertiesLoaded перед выполнением операций, требующих полной объектной модели презентации.

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

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

В следующем примере презентация открывается с помощью LoadOptions.setPassword, обновляются публичные встроенные свойства и сохраняется результат. Затем проверяется, что шифрование сохранено, с помощью PresentationInfo.isEncrypted, и публичные метаданные открываются без пароля для проверки новых значений:

import jpype
import asposeslides

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

from asposeslides.api import Presentation, LoadOptions, PresentationFactory, SaveFormat

input_path = "public-properties-encrypted.pptx"
output_path = "updated-public-properties-encrypted.pptx"

load_options = LoadOptions()
load_options.setPassword("open_password")

presentation = Presentation(input_path, load_options)
try:
    presentation.getDocumentProperties().setTitle("Updated Product Roadmap")
    presentation.getDocumentProperties().setKeywords("roadmap, planning, indexed")
    presentation.save(output_path, SaveFormat.Pptx)
finally:
    presentation.dispose()

presentation_info = PresentationFactory.getInstance().getPresentationInfo(output_path)
print("The presentation is encrypted: ", presentation_info.isEncrypted())

metadata_load_options = LoadOptions()
metadata_load_options.setOnlyLoadDocumentProperties(True)

metadata_presentation = Presentation(output_path, metadata_load_options)
try:
    if metadata_presentation.getProtectionManager().isOnlyDocumentPropertiesLoaded():
        print("Title: ", metadata_presentation.getDocumentProperties().getTitle())
        print("Keywords: ", metadata_presentation.getDocumentProperties().getKeywords())
    else:
        print("The presentation was not loaded in document-properties-only mode.")

finally:
    metadata_presentation.dispose()

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

Доступ к встроенным свойствам

Встроенные свойства, предоставляемые DocumentProperties, включают: Creator (Автор), Description, Created (Дата создания), Modified (Дата изменения), Printed (Дата последней печати), LastModifiedBy, Keywords, SharedDoc (Общий документ?), PresentationFormat, Subject, и Title.

import jpype
import asposeslides

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

from asposeslides.api import Presentation, DocumentProperties

# Создайте экземпляр класса Presentation, который представляет презентацию
presentation = Presentation("Presentation.pptx")
try:
    # Создайте ссылку на объект DocumentProperties, связанный с Presentation
    properties = presentation.getDocumentProperties()

    # Отобразите встроенные свойства
    print("Category : ", properties.getCategory())
    print("Current Status : ", properties.getContentStatus())
    print("Creation Date : ", properties.getCreatedTime())
    print("Author : ", properties.getAuthor())
    print("Description : ", properties.getComments())
    print("KeyWords : ", properties.getKeywords())
    print("Last Modified By : ", properties.getLastSavedBy())
    print("Supervisor : ", properties.getManager())
    print("Modified Date : ", properties.getLastSavedTime())
    print("Presentation Format : ", properties.getPresentationFormat())
    print("Last Print Date : ", properties.getLastPrinted())
    print("Is Shared between producers : ", properties.getSharedDoc())
    print("Subject : ", properties.getSubject())
    print("Title : ", properties.getTitle())
finally:
    presentation.dispose()

Изменение встроенных свойств

Изменение встроенных свойств так же просто, как их получение. Используйте соответствующий сеттер для присвоения нового значения. Ниже приведен пример изменения встроенных свойств документа с помощью Aspose.Slides для Python via Java.

import jpype
import asposeslides

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

from asposeslides.api import Presentation, SaveFormat, DocumentProperties

presentation = Presentation("Presentation.pptx")
try:
    # Создайте ссылку на объект DocumentProperties, связанный с Presentation
    properties = presentation.getDocumentProperties()

    # Установите встроенные свойства
    properties.setAuthor("Aspose.Slides for Python via Java")
    properties.setTitle("Modifying Presentation Properties")
    properties.setSubject("Aspose Subject")
    properties.setComments("Aspose Description")
    properties.setManager("Aspose Manager")

    # Сохраните презентацию в файл
    presentation.save("DocProps.pptx", SaveFormat.Pptx)
finally:
    presentation.dispose()

Этот пример изменяет встроенные свойства презентации, как показано ниже:

Встроенные свойства документа после изменения
PowerPoint document properties

Добавление пользовательских свойств документа

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

import jpype
import asposeslides

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

from asposeslides.api import Presentation, SaveFormat

presentation = Presentation()
try:
    # Получение свойств документа
    properties = presentation.getDocumentProperties()

    # Добавление пользовательских свойств
    properties.set_Item("New Custom", jpype.JInt(12))
    properties.set_Item("My Name", "Mudassir")
    properties.set_Item("Custom", jpype.JInt(124))

    # Получение имени свойства по конкретному индексу
    property_name = properties.getCustomPropertyName(2)

    # Удаление выбранного свойства
    properties.removeCustomProperty(property_name)

    # Сохранение презентации
    presentation.save("CustomDemo.pptx", SaveFormat.Pptx)
finally:
    presentation.dispose()
Добавленные пользовательские свойства документа
PowerPoint document properties

Доступ и изменение пользовательских свойств

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

import jpype
import asposeslides

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

from asposeslides.api import Presentation, SaveFormat, DocumentProperties

presentation = Presentation("Presentation.pptx")
try:
    # Создайте ссылку на объект DocumentProperties, связанный с Presentation
    properties = presentation.getDocumentProperties()

    # Получите доступ к пользовательским свойствам и измените их
    for i in range(properties.getCountOfCustomProperties()):
        property_name = properties.getCustomPropertyName(i)
        # Отобразите имена и значения пользовательских свойств
        print("Custom Property Name : ", property_name)
        print("Custom Property Value : ", properties.get_Item(property_name))

        # Измените значения пользовательских свойств
        properties.set_Item(property_name, f"New Value {i + 1}")

    # Сохраните презентацию в файл
    presentation.save("CustomDemoModified.pptx", SaveFormat.Pptx)
finally:
    presentation.dispose()

Этот пример изменяет пользовательские свойства презентации PPTX. На следующих рисунках показаны пользовательские свойства презентации до и после изменения:

Пользовательские свойства до изменения
PowerPoint document properties
Пользовательские свойства после изменения
PowerPoint document properties

Расширенные свойства документа

Два новых метода readDocumentProperties и updateDocumentProperties добавлены в класс PresentationInfo. Они предоставляют быстрый доступ к свойствам документа и позволяют изменять и обновлять свойства без полной загрузки презентации.

Типичный рабочий процесс загрузки свойств, изменения их значений и обновления документа может быть реализован следующим образом:

import jpype
import asposeslides

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

from asposeslides.api import PresentationFactory

# Прочитать информацию о презентации
presentation_info = PresentationFactory.getInstance().getPresentationInfo("presentation.pptx")

# Получить текущие свойства
properties = presentation_info.readDocumentProperties()

# Установить новые значения полей Автора и Заголовка
properties.setAuthor("New Author")
properties.setTitle("New Title")

# Обновить презентацию новыми значениями
presentation_info.updateDocumentProperties(properties)
presentation_info.writeBindedPresentation("presentation.pptx")

Существует другой способ использования свойств конкретной презентации как шаблона для обновления свойств в других презентациях:

import jpype
import asposeslides

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

from asposeslides.api import PresentationFactory

presentation_info = PresentationFactory.getInstance().getPresentationInfo("template.pptx")
template = presentation_info.readDocumentProperties()

template.setAuthor("Template Author")
template.setTitle("Template Title")
template.setCategory("Template Category")
template.setKeywords("Keyword1, Keyword2, Keyword3")
template.setCompany("Our Company")
template.setComments("Created from template")
template.setContentType("Template Content")
template.setSubject("Template Subject")

for path in ["doc1.pptx", "doc2.odp", "doc3.ppt"]:
    presentation_to_update = PresentationFactory.getInstance().getPresentationInfo(path)
    presentation_to_update.updateDocumentProperties(template)
    presentation_to_update.writeBindedPresentation(path)
import jpype
import asposeslides

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

from asposeslides.api import PresentationFactory

def update_by_template(path, template):
    presentation_to_update = PresentationFactory.getInstance().getPresentationInfo(path)
    presentation_to_update.updateDocumentProperties(template)
    presentation_to_update.writeBindedPresentation(path)

Новый шаблон можно создать с нуля и затем использовать для обновления нескольких презентаций:

import jpype
import asposeslides

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

from asposeslides.api import PresentationFactory, DocumentProperties

template = DocumentProperties()

template.setAuthor("Template Author")
template.setTitle("Template Title")
template.setCategory("Template Category")
template.setKeywords("Keyword1, Keyword2, Keyword3")
template.setCompany("Our Company")
template.setComments("Created from template")
template.setContentType("Template Content")
template.setSubject("Template Subject")

for path in ["doc1.pptx", "doc2.odp", "doc3.ppt"]:
    presentation_to_update = PresentationFactory.getInstance().getPresentationInfo(path)
    presentation_to_update.updateDocumentProperties(template)
    presentation_to_update.writeBindedPresentation(path)

Установка языка корректуры

Aspose.Slides предоставляет метод PortionFormat.setLanguageId, позволяющий установить язык корректуры для документа PowerPoint. Язык корректуры — это язык, для которого проверяется орфография и грамматика в презентации.

Этот Python‑код показывает, как установить язык корректуры для PowerPoint:

import jpype
import asposeslides

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

from asposeslides.api import Presentation, Portion, FontData

pptx_file_name = "presentation.pptx"

presentation = Presentation(pptx_file_name)
try:
    auto_shape = presentation.getSlides().get_Item(0).getShapes().get_Item(0)

    paragraph = auto_shape.getTextFrame().getParagraphs().get_Item(0)
    paragraph.getPortions().clear()

    new_portion = Portion()

    font = FontData("SimSun")
    portion_format = new_portion.getPortionFormat()
    portion_format.setComplexScriptFont(font)
    portion_format.setEastAsianFont(font)
    portion_format.setLatinFont(font)

    portion_format.setLanguageId("zh-CN") # установить идентификатор языка корректуры

    new_portion.setText("1。")
    paragraph.getPortions().add(new_portion)
finally:
    presentation.dispose()

Установка языка по умолчанию

Этот Python‑код показывает, как установить язык по умолчанию для всей презентации PowerPoint:

import jpype
import asposeslides

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

from asposeslides.api import Presentation, LoadOptions, ShapeType

load_options = LoadOptions()
load_options.setDefaultTextLanguage("en-US")

presentation = Presentation(load_options)
try:
    # Добавляет прямоугольную форму с текстом
    shape = presentation.getSlides().get_Item(0).getShapes().addAutoShape(ShapeType.Rectangle, 50, 50, 150, 50)
    shape.getTextFrame().setText("New Text")

    # Проверяет язык первой части
    print(shape.getTextFrame().getParagraphs().get_Item(0).getPortions().get_Item(0).getPortionFormat().getLanguageId())
finally:
    presentation.dispose()

Рабочий пример

Попробуйте онлайн‑приложение Aspose.Slides Metadata, чтобы увидеть, как работать со свойствами документа через API Aspose.Slides:

View & Edit PowerPoint Metadata

Часто задаваемые вопросы

Как удалить встроенное свойство из презентации?

Встроенные свойства являются неотъемлемой частью презентации и полностью удалить их нельзя. Однако можно изменить их значения или установить пустое значение, если это допускается конкретным свойством.

Что произойдёт, если добавить пользовательское свойство, которое уже существует?

Если добавить пользовательское свойство, которое уже существует, его текущее значение будет перезаписано новым. Нет необходимости предварительно удалять или проверять свойство — Aspose.Slides автоматически обновит значение свойства.

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

Да. Используйте PresentationFactory.getPresentationInfo, а затем PresentationInfo.readDocumentProperties для чтения сохранённой метаданных документа без создания экземпляра Presentation. См. Build a Lightweight Presentation Inventory для полного примера отчёта и ограничений, зависящих от формата.

Можно ли прочитать публичные свойства зашифрованной презентации без её пароля открытия?

Да. Шифрование свойств документа должно быть отключено до того, как презентация была зашифрована, и презентация должна быть загружена в режиме только свойств документа.

Можно ли обновить зашифрованный файл PPTX в режиме только свойств документа?

Нет. Публичные и зашифрованные данные свойств должны оставаться согласованными, поэтому обновление зашифрованного файла PPTX требует полной загрузки презентации с правильным паролем открытия.