管理 JavaScript 中的演示文稿属性

简介

Aspose.Slides 支持两种类型的文档属性:内置自定义。这两种属性类型都可以使用 Aspose.Slides API 轻松访问和管理。

Aspose.Slides 允许您通过 DocumentProperties 类来操作演示文稿的文档属性。此类的实例由 Presentation.getDocumentProperties 方法返回。以下示例展示了如何读取、修改和管理这些属性。

管理演示文稿属性

Microsoft PowerPoint 提供了一项向演示文件添加属性的功能。这些文档属性允许在文档(演示文件)中存储一些有用的信息。文档属性分为以下两类:

  • 系统定义(内置)属性
  • 用户定义(自定义)属性

内置 属性包含文档的一般信息,例如文档标题、作者姓名、文档统计信息等。自定义 属性是用户以 名称/值 对的形式定义的,其中名称和值均由用户自行定义。使用 Aspose.Slides for Node.js via Java,开发人员可以访问和修改内置属性以及自定义属性的值。

PowerPoint 中的文档属性

Microsoft PowerPoint 2007 允许管理演示文件的文档属性。只需单击 Office 图标,然后选择 准备 | 属性 | 高级属性 如下所示:

选择高级属性菜单项 ** **
todo:image_alt_text
选择 高级属性 菜单项后,会出现一个对话框,允许您管理 PowerPoint 文件的文档属性,如下图所示:
属性对话框 ** **
todo:image_alt_text
在上述 属性对话框 中,您可以看到多个选项卡,如 常规摘要统计信息内容自定义。所有这些选项卡都用于配置与 PowerPoint 文件相关的不同信息。自定义 选项卡用于管理 PowerPoint 文件的自定义属性。

使用 Aspose.Slides for Node.js via Java 操作文档属性

正如前面所述,Aspose.Slides for Node.js via Java 支持两种文档属性,即 内置自定义 属性。因此,开发人员可以使用 Aspose.Slides for Node.js via Java API 访问这两种属性。Aspose.Slides for Node.js via Java 提供了一个 DocumentProperties 类,通过 Presentation.DocumentProperties 属性表示与演示文件关联的文档属性。

开发人员可以使用由 Presentation 对象公开的 DocumentProperties 属性来访问演示文件的文档属性,如下所示:

从加密演示文稿读取公共属性

打开密码通常会保护演示内容和文档属性。当通过将 false 传递给 ProtectionManager.setEncryptDocumentProperties 来加密演示文稿时,其文档属性保持公共。此时应用程序可以将 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 properties = presentation.getDocumentProperties();

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

在此模式下,不会加载幻灯片内容。幻灯片、母版、布局、形状、媒体及其他演示对象均不可用。应用程序在执行需要完整演示对象模型的操作前,应始终检查 ProtectionManager.isOnlyDocumentPropertiesLoaded

更新加密演示文稿的属性

对于加密的 PPTX 文件,以仅文档属性模式加载的演示文稿旨在读取公共元数据。Aspose.Slides 无法从该仅元数据对象保存更改的属性,因为公共属性必须与加密演示文稿内部的相应数据保持一致。因此,更新这些属性需要正确的打开密码并完整加载演示文稿。

以下示例使用 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 {
    presentation.getDocumentProperties().setTitle("Updated Product Roadmap");
    presentation.getDocumentProperties().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 对象公开的属性包括:Creator(作者)、DescriptionKeywordsCreated(创建日期)、Modified(修改日期)、Printed(最近打印日期)、LastModifiedBySharedDoc(是否在不同生产者之间共享?)、PresentationFormatSubjectTitle

var aspose = aspose || {};
aspose.slides = require("aspose.slides.via.java");

// 实例化表示演示文稿的 Presentation 类
var pres = new aspose.slides.Presentation("Presentation.pptx");
try {
    // 创建指向与演示文稿关联的 IDocumentProperties 对象的引用
    var dp = pres.getDocumentProperties();
    // 显示内置属性
    console.log("Category : " + dp.getCategory());
    console.log("Current Status : " + dp.getContentStatus());
    console.log("Creation Date : " + dp.getCreatedTime());
    console.log("Author : " + dp.getAuthor());
    console.log("Description : " + dp.getComments());
    console.log("KeyWords : " + dp.getKeywords());
    console.log("Last Modified By : " + dp.getLastSavedBy());
    console.log("Supervisor : " + dp.getManager());
    console.log("Modified Date : " + dp.getLastSavedTime());
    console.log("Presentation Format : " + dp.getPresentationFormat());
    console.log("Last Print Date : " + dp.getLastPrinted());
    console.log("Is Shared between producers : " + dp.getSharedDoc());
    console.log("Subject : " + dp.getSubject());
    console.log("Title : " + dp.getTitle());
} finally {
    if (pres != null) {
        pres.dispose();
    }
}

修改内置属性

修改演示文件的内置属性和访问它们一样简单。只需将字符串值分配给任意所需属性,即可修改属性值。下面的示例演示了如何使用 Aspose.Slides for Node.js via Java 修改演示文件的内置文档属性。

var aspose = aspose || {};
aspose.slides = require("aspose.slides.via.java");

var pres = new aspose.slides.Presentation("Presentation.pptx");
try {
    // 创建指向与演示文稿关联的 IDocumentProperties 对象的引用
    var dp = pres.getDocumentProperties();
    // 设置内置属性
    dp.setAuthor("Aspose.Slides for Node.js via Java");
    dp.setTitle("Modifying Presentation Properties");
    dp.setSubject("Aspose Subject");
    dp.setComments("Aspose Description");
    dp.setManager("Aspose Manager");
    // 将演示文稿保存到文件
    pres.save("DocProps.pptx", aspose.slides.SaveFormat.Pptx);
} finally {
    if (pres != null) {
        pres.dispose();
    }
}

此示例修改了演示文稿的内置属性,修改后效果如下所示:

修改后内置文档属性 ** **
todo:image_alt_text

添加自定义文档属性

Aspose.Slides for Node.js via Java 还允许开发人员为演示文稿的文档属性添加自定义值。下面的示例展示了如何为演示文稿设置自定义属性。

var aspose = aspose || {};
aspose.slides = require("aspose.slides.via.java");

var pres = new aspose.slides.Presentation();
try {
    // 获取文档属性
    var dProps = pres.getDocumentProperties();
    // 添加自定义属性
    dProps.set_Item("New Custom", 12);
    dProps.set_Item("My Name", "Mudassir");
    dProps.set_Item("Custom", 124);
    // 获取特定索引处的属性名称
    var getPropertyName = dProps.getCustomPropertyName(2);
    // 删除选中的属性
    dProps.removeCustomProperty(getPropertyName);
    // 保存演示文稿
    pres.save("CustomDemo.pptx", aspose.slides.SaveFormat.Pptx);
} finally {
    if (pres != null) {
        pres.dispose();
    }
}
已添加的自定义文档属性 ** **
todo:image_alt_text

访问和修改自定义属性

Aspose.Slides for Node.js via Java 还允许开发人员访问自定义属性的值。下面的示例展示了如何访问并修改演示文稿的所有自定义属性。

var aspose = aspose || {};
aspose.slides = require("aspose.slides.via.java");

var pres = new aspose.slides.Presentation("Presentation.pptx");
try {
    // 创建指向与演示文稿关联的 DocumentProperties 对象的引用
    var dp = pres.getDocumentProperties();
    // 访问并修改自定义属性
    for (var i = 0; i < dp.getCountOfCustomProperties(); i++) {
        // 显示自定义属性的名称和值
        console.log("Custom Property Name : " + dp.getCustomPropertyName(i));
        console.log("Custom Property Value : " + dp.get_Item(dp.getCustomPropertyName(i)));
        // 修改自定义属性的值
        dp.set_Item(dp.getCustomPropertyName(i), "New Value " + (i + 1));
    }
    // 将演示文稿保存到文件
    pres.save("CustomDemoModified.pptx", aspose.slides.SaveFormat.Pptx);
} finally {
    if (pres != null) {
        pres.dispose();
    }
}

此示例修改了 PPTX 演示文稿的自定义属性。下图显示了修改前后的演示文稿自定义属性:

修改前的自定义属性 ** **
todo:image_alt_text
修改后的自定义属性 ** **
todo:image_alt_text

高级文档属性

新的两种方法 ReadDocumentPropertiesUpdateDocumentProperties 已添加到 PresentationInfo 类中。它们提供了对文档属性的快速访问,并允许在不加载完整演示文稿的情况下更改和更新属性。

典型的场景是加载属性、修改某些值并更新文档,可按以下方式实现:

var aspose = aspose || {};
aspose.slides = require("aspose.slides.via.java");

// 读取演示文稿的信息
var info = aspose.slides.PresentationFactory.getInstance().getPresentationInfo("presentation.pptx");
var props = info.readDocumentProperties();
props.setAuthor("New Author");
props.setTitle("New Title");
info.updateDocumentProperties(props);
info.writeBindedPresentation("presentation.pptx");

还有一种方法是将特定演示文稿的属性用作模板,以更新其他演示文稿中的属性:

var aspose = aspose || {};
aspose.slides = require("aspose.slides.via.java");

function updateByTemplate(path, template) {
    var toUpdate = aspose.slides.PresentationFactory.getInstance().getPresentationInfo(path);
    toUpdate.updateDocumentProperties(template);
    toUpdate.writeBindedPresentation(path);
}

var info = aspose.slides.PresentationFactory.getInstance().getPresentationInfo("template.pptx");
var template = 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");
updateByTemplate("doc1.pptx", template);
updateByTemplate("doc2.odp", template);
updateByTemplate("doc3.ppt", template);
var aspose = aspose || {};
aspose.slides = require("aspose.slides.via.java");

function updateByTemplate(path, template) 
{
    var toUpdate = aspose.slides.PresentationFactory.getInstance().getPresentationInfo(path);
    toUpdate.updateDocumentProperties(template);
    toUpdate.writeBindedPresentation(path);
}

可以从零创建新模板,然后用于更新多个演示文稿:

var aspose = aspose || {};
aspose.slides = require("aspose.slides.via.java");

function updateByTemplate(path, template) {
    var toUpdate = aspose.slides.PresentationFactory.getInstance().getPresentationInfo(path);
    toUpdate.updateDocumentProperties(template);
    toUpdate.writeBindedPresentation(path);
}

var template = new aspose.slides.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");
updateByTemplate("doc1.pptx", template);
updateByTemplate("doc2.odp", template);
updateByTemplate("doc3.ppt", template);
var aspose = aspose || {};
aspose.slides = require("aspose.slides.via.java");

function updateByTemplate(path, template) 
{
    var toUpdate = aspose.slides.PresentationFactory.getInstance().getPresentationInfo(path);
    toUpdate.updateDocumentProperties(template);
    toUpdate.writeBindedPresentation(path);
}

设置校对语言

Aspose.Slides 提供了 LanguageId 属性(由 PortionFormat 类公开),允许您为 PowerPoint 文档设置校对语言。校对语言是 PowerPoint 检查拼写和语法时使用的语言。

下面的 JavaScript 代码演示了如何为 PowerPoint 设置校对语言:xxx 为什么 JavaScript PortionFormat 类中缺少 LanguageId?

var aspose = aspose || {};
aspose.slides = require("aspose.slides.via.java");

var pres = new aspose.slides.Presentation("Presentation.pptx");
try {
    var autoShape = pres.getSlides().get_Item(0).getShapes().get_Item(0);
    var paragraph = autoShape.getTextFrame().getParagraphs().get_Item(0);
    paragraph.getPortions().clear();
    var newPortion = new aspose.slides.Portion();
    var font = new aspose.slides.FontData("SimSun");
    var portionFormat = newPortion.getPortionFormat();
    portionFormat.setComplexScriptFont(font);
    portionFormat.setEastAsianFont(font);
    portionFormat.setLatinFont(font);
    portionFormat.setLanguageId("zh-CN");// set the Id of a proofing language
    newPortion.setText("1。");
    paragraph.getPortions().add(newPortion);
} finally {
    if (pres != null) {
        pres.dispose();
    }
}

设置默认语言

下面的 JavaScript 代码演示了如何为整个 PowerPoint 演示文稿设置默认语言:

var aspose = aspose || {};
aspose.slides = require("aspose.slides.via.java");

var loadOptions = new aspose.slides.LoadOptions();
loadOptions.setDefaultTextLanguage("en-US");
var pres = new aspose.slides.Presentation(loadOptions);
try {
    // 添加一个带文本的新矩形形状
    var shp = pres.getSlides().get_Item(0).getShapes().addAutoShape(aspose.slides.ShapeType.Rectangle, 50, 50, 150, 50);
    shp.getTextFrame().setText("New Text");
    // 检查第一个文本分段的语言
    console.log(shp.getTextFrame().getParagraphs().get_Item(0).getPortions().get_Item(0).getPortionFormat().getLanguageId());
} finally {
    if (pres != null) {
        pres.dispose();
    }
}

实时示例

尝试在线应用 Aspose.Slides Metadata 了解如何通过 Aspose.Slides API 处理文档属性:

View & Edit PowerPoint Metadata

常见问题

如何从演示文稿中移除内置属性?

内置属性是演示文稿的组成部分,不能完全移除。不过,您可以更改其值,或在特定属性允许的情况下将其设为空。

如果添加已存在的自定义属性会怎样?

如果添加的自定义属性已存在,其原有值将被新值覆盖。无需事先删除或检查属性,Aspose.Slides 会自动更新属性值。

我可以在不完全加载演示文稿的情况下访问演示属性吗?

可以。使用 PresentationFactory.getPresentationInfo 然后调用 PresentationInfo.readDocumentProperties 即可在不创建 Presentation 实例的情况下读取存储的文档元数据。有关完整报告示例和特定格式限制,请参阅 构建轻量级演示清单

我可以在不提供打开密码的情况下读取加密演示文稿的公共属性吗?

可以。前提是文档属性加密在演示文稿加密之前已被禁用,并且演示文稿以仅文档属性模式加载。

我可以在仅文档属性模式下更新加密的 PPTX 文件吗?

不能。公共属性和加密属性的数据必须保持一致,因此在仅文档属性模式下更新加密的 PPTX 文件需要使用正确的打开密码完整加载演示文稿。