在 PHP 中打开演示文稿

概述

除了从头创建 PowerPoint 演示文稿之外,Aspose.Slides 还可以打开现有的演示文稿。加载演示文稿后,您可以检索其信息、编辑幻灯片内容、添加新幻灯片、删除已有幻灯片等。

打开演示文稿

要打开现有的演示文稿,请实例化 Presentation 类并将文件路径传入其构造函数。

以下 PHP 示例演示了如何打开演示文稿并获取其幻灯片计数:

// 实例化 Presentation 类并将文件路径传递给其构造函数。
$presentation = new Presentation("Sample.pptx");
try {
    // 输出演示文稿中的幻灯片总数。
    echo($presentation->getSlides()->size());
} finally {
    $presentation->dispose();
}

打开受密码保护的演示文稿

当需要打开受密码保护的演示文稿时,将密码通过 setPassword 方法传入 LoadOptions 类,以解密并加载它。以下 PHP 代码演示了此操作:

$loadOptions = new LoadOptions();
$loadOptions->setPassword("YOUR_PASSWORD");

$presentation = new Presentation("Sample.pptx", $loadOptions);
try {
    // 对已解密的演示文稿执行操作。
} finally {
    $presentation->dispose();
}

打开大型演示文稿

Aspose.Slides 提供了一些选项——尤其是 LoadOptions 类中的 getBlobManagementOptions 方法——帮助您加载大型演示文稿。

以下 PHP 代码演示了加载大型演示文稿(例如 2 GB):

$filePath = "LargePresentation.pptx";

$loadOptions = new LoadOptions();
// 选择 KeepLocked 行为——演示文稿文件将在整个生命周期内保持锁定
// Presentation 实例,但无需加载到内存或复制到临时文件。
$loadOptions->getBlobManagementOptions()->setPresentationLockingBehavior(PresentationLockingBehavior::KeepLocked);
$loadOptions->getBlobManagementOptions()->setTemporaryFilesAllowed(true);
$loadOptions->getBlobManagementOptions()->setMaxBlobsBytesInMemory(10 * 1024 * 1024); // 10 MB

$presentation = new Presentation($filePath, $loadOptions);
try {
    // 已加载大型演示文稿,可直接使用,同时内存消耗保持低水平。

    // 对演示文稿进行更改。
    $presentation->getSlides()->get_Item(0)->setName("Very large presentation");

    // 将演示文稿保存到另一个文件。此操作期间内存消耗仍保持低水平。
    $presentation->save("LargePresentation-copy.pptx", SaveFormat::Pptx);
	
	// 不要这样做!因为文件在演示文稿对象释放之前被锁定,会抛出 I/O 异常。
	//unlink($filePath);
} finally {
    $presentation->dispose();
}
// 在这里执行是可以的。源文件已不再被演示文稿对象锁定。
unlink($filePath);

控制外部资源

Aspose.Slides 提供了 IResourceLoadingCallback 接口,允许您管理外部资源。以下 PHP 代码展示了如何使用 IResourceLoadingCallback 接口:

class ImageLoadingHandler {
    function resourceLoading($args) {
        if (java_values($args->getOriginalUri()->endsWith(".jpg"))) {
            // 加载替代图像。
			$bytes = file_get_contents("aspose-logo.jpg");
			$javaByteArray = java_values($bytes);
            $args->setData($javaByteArray);
            return ResourceLoadingAction::UserProvided;
        } else if (java_values($args->getOriginalUri()->endsWith(".png"))) {
            // 设置替代 URL。
            $args->setUri("http://www.google.com/images/logos/ps_logo2.png");
            return ResourceLoadingAction::Default;
        }
        // 跳过所有其他图像。
        return ResourceLoadingAction::Skip;
    }
}

$loadingHandler = java_closure(new ImageLoadingHandler(), null, java("com.aspose.slides.IResourceLoadingCallback"));

$loadOptions = new LoadOptions();
$loadOptions->setResourceLoadingCallback($loadingHandler);

$presentation = new Presentation("Sample.pptx", $loadOptions);

加载不含嵌入二进制对象的演示文稿

PowerPoint 演示文稿可能包含以下类型的嵌入二进制对象:

使用 LoadOptions.setDeleteEmbeddedBinaryObjects 方法,您可以在加载演示文稿时删除所有嵌入的二进制对象。

此方法对于移除可能的恶意二进制内容非常有用。以下 PHP 代码演示了如何加载不含任何嵌入二进制内容的演示文稿:

$loadOptions = new LoadOptions();
$loadOptions->setDeleteEmbeddedBinaryObjects(true);

$presentation = new Presentation("malware.ppt", $loadOptions);
try {
    // 对演示文稿执行操作。
} finally {
    $presentation->dispose();
}

常见问题

如何判断文件已损坏且无法打开?

加载时会抛出解析/格式验证异常。此类错误通常会提到 ZIP 结构无效或 PowerPoint 记录损坏。

打开时若缺少必需的字体会怎样?

文件仍会打开,但后续的 rendering/export 可能会替换字体。请在运行时环境中 Configure font substitutionsadd the required fonts

打开时嵌入的媒体(视频/音频)怎么办?

它们会作为演示文稿资源可用。如果媒体通过外部路径引用,请确保这些路径在您的环境中可访问;否则 rendering/export 可能会省略这些媒体。