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

概述

加载演示文稿后,读取只读的 Presentation.source_format 属性以确定其原始格式。当后续处理依赖于加载当前实例时的格式时,请使用它。

源格式不同于为输出文件选择的 SaveFormat。将文件保存为另一种格式不会改变现有实例的源格式。

读取文件的源格式

此示例需要一个已有的 sample.pptx 文件。它加载该文件并使用 Presentation.source_format 选择应用程序处理策略,而不是使用文件名。将输入路径更改为其他格式以进行尝试。示例会打印所选策略;请将消息替换为您的业务逻辑。

import aspose.slides as slides

with slides.Presentation("sample.pptx") as presentation:
    source_format = presentation.source_format
    if source_format in (slides.SourceFormat.PPT, slides.SourceFormat.PPS, slides.SourceFormat.POT):
        print("Use the legacy PowerPoint processing policy.")
    elif source_format == slides.SourceFormat.PPTX:
        print("Use the standard PPTX processing policy.")
    else:
        print(f"Use the general policy for {source_format.name}.")

识别受支持的值

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 构造函数仅接受流。

import io
import aspose.slides as slides

with open("sample.pps", "rb") as input_file:
    data = input_file.read()

with io.BytesIO(data) as stream:
    with slides.Presentation(stream) as presentation:
        print(f"Source format: {presentation.source_format.name}")

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

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

比较加载前后的检测

当需要在加载完整演示对象模型之前检查文件时,请使用 PresentationFactory.get_presentation_infoPresentationInfo.load_format。实例已存在时请使用 Presentation.source_format

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

import aspose.slides as slides

path = "sample.pptx"
information = slides.PresentationFactory.instance.get_presentation_info(path)
print(f"Before loading: {information.load_format.name}")

with slides.Presentation(path) as presentation:
    print(f"After loading: {presentation.source_format.name}")

结果使用不同的枚举类型:LoadFormatSourceFormat。不要通过强制转换其数值来比较它们,也不要假设每种格式的检测结果完全相同。在下面描述的保存后重新打开检查中,PowerPoint XML 在加载前报告为 LoadFormat.UNKNOWN,加载后报告为 SourceFormat.XML

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

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

import aspose.slides as slides

with slides.Presentation("sample.pptx") as presentation:
    print(f"Before saving: {presentation.source_format.name}")

    presentation.save("converted.odp", slides.export.SaveFormat.ODP)
    print(f"After saving: {presentation.source_format.name}")

with slides.Presentation("converted.odp") as reopened:
    print(f"Reopened output: {reopened.source_format.name}")

使用 slides.Presentation() 从头创建的演示文稿报告 SourceFormat.PPTX。它没有输入文件:这是新创建实例的默认值,而不是表明加载了 PPTX 文件的证据。如果该区分对您的应用重要,请单独跟踪实例是创建还是加载的。

将源格式映射到扩展名

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

import aspose.slides as slides

extensions = {
    slides.SourceFormat.PPT: ".ppt",
    slides.SourceFormat.PPTX: ".pptx",
    slides.SourceFormat.PPTM: ".pptm",
    slides.SourceFormat.PPS: ".pps",
    slides.SourceFormat.PPSX: ".ppsx",
    slides.SourceFormat.PPSM: ".ppsm",
    slides.SourceFormat.POT: ".pot",
    slides.SourceFormat.POTX: ".potx",
    slides.SourceFormat.POTM: ".potm",
    slides.SourceFormat.ODP: ".odp",
    slides.SourceFormat.OTP: ".otp",
    slides.SourceFormat.FODP: ".fodp",
    slides.SourceFormat.XML: ".xml",
}

with slides.Presentation("sample.pptx") as presentation:
    extension = extensions.get(presentation.source_format)
    print(extension if extension is not None else "No extension mapping is available.")

此映射并不转换文件,也不恢复流加载期间丢失的遗留 PPS/POT 子类型。实际保存时,请显式选择 SaveFormat,或使用在 Save Presentations in Their Original Format 中展示的转换方式。

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

此独立示例在工作目录中创建一个演示文稿并写入三个文件,使用相同名称的文件会被覆盖。它分别通过路径和内存流重新打开每个输出。对于 PPTX 和 ODP,两条路径都报告已保存的格式。对于 PPS,按路径加载报告 PPS,而在没有文件名的情况下加载相同字节则报告 PPT

import io
import aspose.slides as slides

formats = [slides.export.SaveFormat.PPTX, slides.export.SaveFormat.ODP, slides.export.SaveFormat.PPS]

with slides.Presentation() as presentation:
    for output_format in formats:
        path = f"roundtrip.{output_format.name.lower()}"
        presentation.save(path, output_format)

        with open(path, "rb") as input_file:
            data = input_file.read()

        with slides.Presentation(path) as from_file:
            with io.BytesIO(data) as stream:
                with slides.Presentation(stream) as from_stream:
                    print(f"{output_format.name}: file={from_file.source_format.name}, stream={from_stream.source_format.name}")

对上述所有格式进行相同检查后,生成的演示文稿(扩展名匹配)得到以下结果:

已保存格式 文件路径的 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。本表描述的是格式识别,而非在转换过程中保留每个演示文稿特性的完整性。

常见问题

将演示文稿保存为 ODP 会改变从 PPTX 加载的演示文稿的源格式吗?

不会。现有实例仍然报告 PPTX。从已保存的 ODP 文件加载的实例报告 ODP

流能否始终区分遗留的演示文稿、幻灯片放映和模板?

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

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

读取 Presentation.source_format。在加载前进行检查时使用 PresentationFactory.get_presentation_info