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

Введение

Aspose.Slides for Node.js via Java поддерживает встроенные и пользовательские свойства документа. Используйте эти свойства для чтения и обновления метаданных презентации, таких как автор, заголовок и пользовательские значения.

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

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

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

  • Встроенные свойства содержат стандартные метаданные, такие как заголовок, автор и статистика документа.
  • Пользовательские свойства хранят пары пользовательских имя/значение.

Aspose.Slides for Node.js via Java предоставляет доступ к обеим категориям. В PowerPoint выберите File → Info → Properties → Advanced Properties, чтобы просмотреть метаданные документа. Диалог группирует информацию по вкладкам, таким как Summary, Statistics, Contents и Custom. Используйте вкладку Custom для управления пользовательскими свойствами.

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

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

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

Пример требует зашифрованной презентации, у которой свойства документа оставлены публичными. Он проверяет режим загрузки через ProtectionManager.isOnlyDocumentPropertiesLoaded и затем читает встроенные свойства через Presentation.getDocumentProperties:

const slides = require("aspose.slides.via.java");

const loadOptions = new slides.LoadOptions();
loadOptions.setOnlyLoadDocumentProperties(true);

const presentation = new slides.Presentation("public-properties-encrypted.pptx", loadOptions);
try {
    if (presentation.getProtectionManager().isOnlyDocumentPropertiesLoaded()) {
        const documentProperties = presentation.getDocumentProperties();

        console.log("Author: " + documentProperties.getAuthor());
        console.log("Title: " + documentProperties.getTitle());
        console.log("Keywords: " + documentProperties.getKeywords());
    } else {
        console.log("The presentation was not loaded in document-properties-only mode.");
    }
} finally {
    presentation.dispose();
}

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

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

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

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

const slides = require("aspose.slides.via.java");

const inputPath = "public-properties-encrypted.pptx";
const outputPath = "updated-public-properties-encrypted.pptx";

const loadOptions = new slides.LoadOptions();
loadOptions.setPassword("open_password");

const presentation = new slides.Presentation(inputPath, loadOptions);
try {
    const documentProperties = presentation.getDocumentProperties();
    documentProperties.setTitle("Updated Product Roadmap");
    documentProperties.setKeywords("roadmap, planning, indexed");
    
    presentation.save(outputPath, slides.SaveFormat.Pptx);
} finally {
    presentation.dispose();
}

const presentationInfo = slides.PresentationFactory.getInstance().getPresentationInfo(outputPath);
console.log("The presentation is encrypted: " + presentationInfo.isEncrypted());

const metadataLoadOptions = new slides.LoadOptions();
metadataLoadOptions.setOnlyLoadDocumentProperties(true);

const metadataPresentation = new slides.Presentation(outputPath, metadataLoadOptions);
try {
    if (metadataPresentation.getProtectionManager().isOnlyDocumentPropertiesLoaded()) {
        console.log("Title: " + metadataPresentation.getDocumentProperties().getTitle());
        console.log("Keywords: " + metadataPresentation.getDocumentProperties().getKeywords());
    } else {
        console.log("The presentation was not loaded in document-properties-only mode.");
    }
} finally {
    metadataPresentation.dispose();
}

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

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

Класс DocumentProperties предоставляет встроенные метаданные через методы‑получатели, включая getAuthor, getTitle и getCreatedTime. Этот пример открывает существующую презентацию и выводит её сохранённые метаданные в консоль. Значения зависят от входной презентации; некоторые поля могут быть пустыми.

const slides = require("aspose.slides.via.java");

const presentation = new slides.Presentation("AccessBuiltInProperties.pptx");
try {
    const documentProperties = presentation.getDocumentProperties();

    console.log("Category: " + documentProperties.getCategory());
    console.log("Content status: " + documentProperties.getContentStatus());
    console.log("Creation date: " + documentProperties.getCreatedTime());
    console.log("Author: " + documentProperties.getAuthor());
    console.log("Comments: " + documentProperties.getComments());
    console.log("Keywords: " + documentProperties.getKeywords());
    console.log("Last modified by: " + documentProperties.getLastSavedBy());
    console.log("Manager: " + documentProperties.getManager());
    console.log("Modified date: " + documentProperties.getLastSavedTime());
    console.log("Presentation format: " + documentProperties.getPresentationFormat());
    console.log("Last print date: " + documentProperties.getLastPrinted());
    console.log("Is shared between producers: " + documentProperties.getSharedDoc());
    console.log("Subject: " + documentProperties.getSubject());
    console.log("Title: " + documentProperties.getTitle());
} finally {
    presentation.dispose();
}

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

Чтобы обновить встроенные метаданные, используйте методы‑установщики на объекте, возвращённом Presentation.getDocumentProperties. Этот пример открывает существующую презентацию, вызывает setAuthor, setTitle, setSubject, setComments и setManager, затем сохраняет обновлённую презентацию с помощью Presentation.save. Сохранённый PPTX содержит новые метаданные.

const slides = require("aspose.slides.via.java");

const presentation = new slides.Presentation("ModifyBuiltInProperties.pptx");
try {
    const documentProperties = presentation.getDocumentProperties();

    documentProperties.setAuthor("Aspose.Slides for Node.js via Java");
    documentProperties.setTitle("Manage PowerPoint Presentation Properties");
    documentProperties.setSubject("Modify Built-in Properties");
    documentProperties.setComments("Aspose description");
    documentProperties.setManager("Aspose manager");

    presentation.save("DocumentProperties_output.pptx", slides.SaveFormat.Pptx);
} finally {
    presentation.dispose();
}

Управление базой гиперссылок

DocumentProperties.getHyperlinkBase возвращает базовый адрес уровня документа для относительных гиперссылок. Используйте DocumentProperties.setHyperlinkBase для изменения или очистки этого адреса. Это удобно при перемещении презентации и связанных файлов в другое место. Это отдельный параметр от Hyperlink.getExternalUrl отдельной гиперссылки: изменение базы не переписывает сохранённые адреса ссылок и не меняет абсолютные назначения.

Пример требует презентацию, содержащую как относительную ссылку (например, target.html), так и абсолютную ссылку (например, https://example.org/absolute.html). Он считывает существующую базу, задаёт новую базу и сохраняет, а затем открывает презентацию для проверки значения. Затем он очищает базу, задав пустую строку, и проверяет пустое значение в отдельном сохранённом файле. Замените пример базового адреса на расположение ваших связанных файлов.

const slides = require("aspose.slides.via.java");

const presentation = new slides.Presentation("hyperlinks.pptx");
try {
    console.log("Original base: " + presentation.getDocumentProperties().getHyperlinkBase());

    const newBase = "https://example.com/new/";
    presentation.getDocumentProperties().setHyperlinkBase(newBase);
    presentation.save("hyperlinks-updated.pptx", slides.SaveFormat.Pptx);

    const updatedPresentation = new slides.Presentation("hyperlinks-updated.pptx");
    try {
        console.log("Base preserved: " + (newBase === updatedPresentation.getDocumentProperties().getHyperlinkBase()));

        updatedPresentation.getDocumentProperties().setHyperlinkBase("");
        updatedPresentation.save("hyperlinks-cleared.pptx", slides.SaveFormat.Pptx);

        const clearedPresentation = new slides.Presentation("hyperlinks-cleared.pptx");
        try {
            console.log("Base cleared: " + ("" === clearedPresentation.getDocumentProperties().getHyperlinkBase()));
        } finally {
            clearedPresentation.dispose();
        }
    } finally {
        updatedPresentation.dispose();
    }
} finally {
    presentation.dispose();
}

Оба сообщения проверки должны вывести true. Очистка базы оставляет отдельные адреса гиперссылок неизменными.

Относительная ссылка target.pptx открывала old/target.pptx, когда база указывала на папку old. После изменения базы на папку new, сохранения и повторного открытия презентации та же ссылка открывала new/target.pptx. Абсолютная ссылка продолжала открывать тот же файл. Проверьте свои относительные ссылки в PowerPoint до и после перемещения презентации или изменения её базы.

Добавление пользовательских свойств презентации

Пользовательские свойства хранят метаданные, которые не имеют соответствующего встроенного поля. Метод DocumentProperties.set_Item позволяет задать значение по имени свойства. Этот пример создаёт презентацию, добавляет два текстовых значения и целочисленное значение версии, затем сохраняет презентацию с помощью Presentation.save. Присвоение значения уже существующему имени заменяет значение этого свойства.

const slides = require("aspose.slides.via.java");

const presentation = new slides.Presentation();
try {
    const documentProperties = presentation.getDocumentProperties();

    documentProperties.set_Item("Reviewed by", "John Smith");
    documentProperties.set_Item("Confidentiality level", "Internal");
    documentProperties.set_Item("Document version", 2);

    presentation.save("CustomDocumentProperties_output.pptx", slides.SaveFormat.Pptx);
} finally {
    presentation.dispose();
}

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

Этот пример открывает презентацию, содержащую пользовательские свойства, и использует getCountOfCustomProperties для их перебора. getCustomPropertyName принимает индекс, начинающийся с нуля, и возвращает имя, используемое в DocumentProperties.set_Item. Пример выводит каждое оригинальное имя и значение, заменяя каждое значение на нумерованную строку независимо от исходного типа, и сохраняет изменения. Если пользовательские свойства отсутствуют, цикл не вносит изменений.

const slides = require("aspose.slides.via.java");

const presentation = new slides.Presentation("AccessAndModifyProperties.pptx");
try {
    const documentProperties = presentation.getDocumentProperties();

    for (let i = 0; i < documentProperties.getCountOfCustomProperties(); i++) {
        const propertyName = documentProperties.getCustomPropertyName(i);
        const propertyValue = documentProperties.get_Item(propertyName);

        console.log("Custom property name: " + propertyName);
        console.log("Custom property value: " + propertyValue);

        documentProperties.set_Item(propertyName, "New Value " + (i + 1));
    }

    presentation.save("CustomProperties_output.pptx", slides.SaveFormat.Pptx);
} finally {
    presentation.dispose();
}

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

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

Просмотр и редактирование метаданных PowerPoint

FAQ

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

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

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

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

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

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

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

Да. Презентация должна быть зашифрована после вызова ProtectionManager.setEncryptDocumentProperties с параметром false, и должна быть загружена после вызова LoadOptions.setOnlyLoadDocumentProperties с параметром true.

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

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