在 C++ 中确定原始演示文稿格式

概述

加载演示文稿后,调用 Presentation::get_SourceFormat 以确定其原始格式。该方法也可通过 IPresentation::get_SourceFormat 使用。当后续处理依赖于当前实例加载时的格式时,请使用它。

源格式不同于为输出文件选择的 SaveFormat。将文件另存为其他格式不会更改现有实例的源格式。

读取文件的源格式

此示例需要一个现有的 sample.pptx 文件。它加载该文件并使用 Presentation::get_SourceFormat 选择应用程序处理策略,而不是根据文件名。修改输入路径可尝试其他格式。示例会打印所选策略;请将这些消息替换为您的应用逻辑。

#include <DOM/Presentation.h>
#include <DOM/SourceFormat.h>
#include <system/console.h>
#include <system/object_ext.h>
#include <system/string.h>

using namespace Aspose::Slides;
using namespace System;

auto presentation = MakeObject<Presentation>(u"sample.pptx");

switch (presentation->get_SourceFormat())
{
    case SourceFormat::Ppt:
    case SourceFormat::Pps:
    case SourceFormat::Pot:
        Console::WriteLine(u"Use the legacy PowerPoint processing policy.");
        break;
    case SourceFormat::Pptx:
        Console::WriteLine(u"Use the standard PPTX processing policy.");
        break;
    default:
        Console::WriteLine(String::Format(u"Use the general policy for {0}.", ObjectExt::ToString(presentation->get_SourceFormat())));
        break;
}

识别受支持的值

SourceFormat 枚举区分以下演示文稿格式。下列扩展名为常规扩展名,并非对原始文件名的还原。

SourceFormat 值 扩展名 格式
Ppt .ppt PowerPoint 97–2003 演示文稿
Pptx .pptx Office Open XML 演示文稿
Pptm .pptm 启用宏的 Office Open XML 演示文稿
Pps .pps PowerPoint 97–2003 幻灯片放映
Ppsx .ppsx Office Open XML 幻灯片放映
Ppsm .ppsm 启用宏的 Office Open XML 幻灯片放映
Pot .pot PowerPoint 97–2003 模板
Potx .potx Office Open XML 模板
Potm .potm 启用宏的 Office Open XML 模板
Odp .odp OpenDocument 演示文稿
Otp .otp OpenDocument 演示文稿模板
Fodp .fodp 平面 XML ODF 演示文稿
Xml .xml PowerPoint XML 演示文稿

读取流的源格式

此示例需要一个现有的 sample.pps 文件。将其字节读取到内存流中模拟没有文件名的输入,例如数据库值或上传的字节数组。Presentation 构造函数仅接收流。

#include <DOM/Presentation.h>
#include <DOM/SourceFormat.h>
#include <system/console.h>
#include <system/object_ext.h>
#include <system/string.h>
#include <system/io/file.h>
#include <system/io/memory_stream.h>

using namespace Aspose::Slides;
using namespace System;
using namespace System::IO;

auto bytes = File::ReadAllBytes(u"sample.pps");
auto stream = MakeObject<MemoryStream>(bytes);
auto presentation = MakeObject<Presentation>(stream);

Console::WriteLine(String::Format(u"Source format: {0}", ObjectExt::ToString(presentation->get_SourceFormat())));

PPT、PPS 和 POT 使用相同的底层二进制格式。通过文件路径加载时,扩展名可以帮助区分幻灯片放映或模板。没有文件名时,老式的 PPS 和 POT 内容可能会报告为 SourceFormat::Ppt;上面的 PPS 示例报告 Ppt

如果您的应用必须保留此区分,请单独保留原始文件名或子类型元数据。扩展名对这些老式子类型是有用的提示,但不应作为识别任意演示文稿内容的唯一依据。

在加载前后比较检测

在需要在加载完整演示文稿对象模型之前检查文件时,请使用 PresentationFactory::GetPresentationInfoIPresentationInfo::get_LoadFormat。当实例已经存在时,请使用 Presentation::get_SourceFormat

此示例需要 sample.pptx,并在两次检查时均打印 Pptx。在生产环境中,请根据处理阶段选择合适的 API;已加载的演示文稿无需再次检查仅为获取其源格式。

#include <DOM/Presentation.h>
#include <DOM/SourceFormat.h>
#include <system/console.h>
#include <system/object_ext.h>
#include <system/string.h>
#include <DOM/PresentationFactory.h>
#include <DOM/IPresentationInfo.h>
#include <LoadFormat.h>

using namespace Aspose::Slides;
using namespace System;

auto path = String(u"sample.pptx");
auto information = PresentationFactory::get_Instance()->GetPresentationInfo(path);
Console::WriteLine(String::Format(u"Before loading: {0}", ObjectExt::ToString(information->get_LoadFormat())));

auto presentation = MakeObject<Presentation>(path);
Console::WriteLine(String::Format(u"After loading: {0}", ObjectExt::ToString(presentation->get_SourceFormat())));

结果使用了不同的枚举类型:LoadFormatSourceFormat。不要通过强制转换数值来比较它们,也不要假设每种格式的检测结果完全相同。PowerPoint XML 在加载前可能报告为 LoadFormat::Unknown,加载后报告为 SourceFormat::Xml

保持源格式和输出格式分离

此示例需要 sample.pptx 并写入 converted.odp。它在保存原始实例前后均打印 Pptx。只有从 ODP 输出加载的新实例报告 Odp

#include <DOM/Presentation.h>
#include <DOM/SourceFormat.h>
#include <system/console.h>
#include <system/object_ext.h>
#include <system/string.h>
#include <Export/SaveFormat.h>

using namespace Aspose::Slides;
using namespace System;
using namespace Aspose::Slides::Export;

auto presentation = MakeObject<Presentation>(u"sample.pptx");
Console::WriteLine(String::Format(u"Before saving: {0}", ObjectExt::ToString(presentation->get_SourceFormat())));

presentation->Save(u"converted.odp", SaveFormat::Odp);
Console::WriteLine(String::Format(u"After saving: {0}", ObjectExt::ToString(presentation->get_SourceFormat())));

auto reopened = MakeObject<Presentation>(u"converted.odp");
Console::WriteLine(String::Format(u"Reopened output: {0}", ObjectExt::ToString(reopened->get_SourceFormat())));

使用 MakeObject<Presentation>() 从头创建的演示文稿报告 SourceFormat::Pptx。它没有输入文件:这是新创建实例的默认值,并不表示加载了 PPTX 文件。如果区分是创建还是加载实例对您很重要,请单独跟踪此信息。

将源格式映射到扩展名

以下示例需要 sample.pptx。它将每个当前支持的 SourceFormat 值映射到常规扩展名,而不解析输入文件名。回退机制避免对未识别的值静默分配扩展名。

#include <DOM/Presentation.h>
#include <DOM/SourceFormat.h>
#include <system/console.h>
#include <system/object_ext.h>
#include <system/string.h>

using namespace Aspose::Slides;
using namespace System;

auto presentation = MakeObject<Presentation>(u"sample.pptx");
auto extension = String::Empty;
switch (presentation->get_SourceFormat())
{
    case SourceFormat::Ppt:
        extension = u".ppt";
        break;
    case SourceFormat::Pptx:
        extension = u".pptx";
        break;
    case SourceFormat::Pptm:
        extension = u".pptm";
        break;
    case SourceFormat::Pps:
        extension = u".pps";
        break;
    case SourceFormat::Ppsx:
        extension = u".ppsx";
        break;
    case SourceFormat::Ppsm:
        extension = u".ppsm";
        break;
    case SourceFormat::Pot:
        extension = u".pot";
        break;
    case SourceFormat::Potx:
        extension = u".potx";
        break;
    case SourceFormat::Potm:
        extension = u".potm";
        break;
    case SourceFormat::Odp:
        extension = u".odp";
        break;
    case SourceFormat::Otp:
        extension = u".otp";
        break;
    case SourceFormat::Fodp:
        extension = u".fodp";
        break;
    case SourceFormat::Xml:
        extension = u".xml";
        break;
    default:
        break;
}

Console::WriteLine(extension.IsEmpty() ? u"No extension mapping is available." : extension);

此映射不会转换文件或恢复在流加载期间丢失的老式 PPS/POT 子类型。实际保存时,请显式选择 SaveFormat,或使用 在原始格式中保存演示文稿 中展示的转换。

通过保存和重新打开验证格式

此独立示例创建一个演示文稿并在工作目录中写入三个文件,若同名文件已存在则覆盖。它随后分别通过路径和内存流重新打开每个输出。对于 PPTX 和 ODP,两种方式都报告已保存的格式。对于 PPS,路径加载报告 Pps,而使用相同字节但无文件名的加载报告 Ppt

#include <DOM/Presentation.h>
#include <DOM/SourceFormat.h>
#include <system/console.h>
#include <system/object_ext.h>
#include <system/string.h>
#include <Export/SaveFormat.h>
#include <system/array.h>
#include <system/io/file.h>
#include <system/io/memory_stream.h>

using namespace Aspose::Slides;
using namespace System;
using namespace Aspose::Slides::Export;
using namespace System::IO;

auto presentation = MakeObject<Presentation>();
auto formats = MakeArray<SaveFormat>({SaveFormat::Pptx, SaveFormat::Odp, SaveFormat::Pps});

for (auto format : formats)
{
    auto formatName = ObjectExt::ToString(format);
    auto path = String::Format(u"roundtrip.{0}", formatName.ToLowerInvariant());
    presentation->Save(path, format);

    auto fromFile = MakeObject<Presentation>(path);
    auto bytes = File::ReadAllBytes(path);
    auto stream = MakeObject<MemoryStream>(bytes);
    auto fromStream = MakeObject<Presentation>(stream);

    Console::WriteLine(String::Format(u"{0}: file={1}, stream={2}", formatName, ObjectExt::ToString(fromFile->get_SourceFormat()), ObjectExt::ToString(fromStream->get_SourceFormat())));
}

以下表格总结了具有匹配扩展名的演示文稿的源格式识别情况:

已保存的格式 从文件路径获取的 SourceFormat 从无名称流获取的 SourceFormat
PPT Ppt Ppt
PPTX, PPTM Pptx, Pptm 分别对应 与文件路径相同
PPS Pps Ppt
PPSX, PPSM Ppsx, Ppsm 分别对应 与文件路径相同
POT Pot Ppt
POTX, POTM Potx, Potm 分别对应 与文件路径相同
ODP, OTP Odp, Otp 分别对应 与文件路径相同
FODP Fodp Fodp
PowerPoint XML Xml Xml

老式 PPS/POT 内容在无名称流中会标准化为 Ppt。此表描述的是格式识别结果,并不保证在转换过程中保留每个演示文稿的所有特性。

常见问题

将演示文稿从 PPTX 保存为 ODP 时,会改变其源格式吗?

不会。现有实例仍报告 Pptx。从保存的 ODP 文件加载的实例报告 Odp

流是否始终能够区分传统的演示文稿、幻灯片放映和模板?

不能。PPT、PPS 和 POT 共享同一二进制格式。如果需要此区分,请单独保留文件名或子类型元数据。

如果演示文稿已经加载,我应该使用哪个 API?

读取 Presentation::get_SourceFormat。在加载之前进行检查时,请使用 PresentationFactory::GetPresentationInfo