首页 > 解决方案 > 保存带有 comtypes 的 PowerPoint 演示文稿时使用文件格式常量

问题描述

通过 comtypes 保存 Powerpoint 演示文稿时,如何访问可用作文件格式的常量?

在下面的示例32中用作格式,但我想使用此处列出的常量)或至少找到一个记录列表,其中包含每个常量的值。

对于 Word,此列表还包含每个常量的值。

import comtypes.client

powerpoint = comtypes.client.CreateObject("Powerpoint.Application")
pres = powerpoint.Presentations.Open(input_path)
pres.SaveAs(output_path, 32)

标签: pythonpowerpointcomtypes

解决方案


您可以访问与通过comtypes.client.Constants()该类加载的 COM 对象关联的所有枚举名称;将您创建的 PowerPoint.Application COM 对象传递给它:

from comtypes.client import Constants, CreateObject

powerpoint = CreateObject("Powerpoint.Application")
pp_constants = Constants(powerpoint)

pres = powerpoint.Presentations.Open(input_path)
pres.SaveAs(output_path, pp_constants.ppSaveAsPDF)

Constants实例加载底层类型库并将属性查找动态转换为类型库访问。由于一些模糊的原因,它没有包含在comtypes文档中,即使它是近 10 年前添加的。

另一种选择是访问生成的类型库中生成的模块的属性,如带参数属性(命名属性)部分所示。这将使您可以访问与 Powerpoint IDL 关联的任何常量,包括自动完成支持 IDE(一旦通过第一次访问 PowerPoint.Application 对象生成)。

CreateObject()如果类型信息暴露在正在创建的对象上,则在您使用该模块时会自动生成该模块;这绝对是'Powerpoint.Application'因为您没有明确设置接口。仅当有可用的类型信息时,自动接口选择才有效。

枚举名称被添加到顶层生成的模块中,所以直接使用那些:

import comtypes.client

powerpoint = comtypes.client.CreateObject("Powerpoint.Application")

# only import the generated namespace after the com object has been created
# at least once. The generated module is cached for future runs.
from comtypes.gen import PowerPoint

pres = powerpoint.Presentations.Open(input_path)
pres.SaveAs(output_path, PowerPoint.ppSaveAsPDF)

类型库的简称可以在 VBA 对象浏览器中找到;Steve Rindsberg 的答案中的屏幕截图显示,对于PpSaveAsFileType枚举,它是PowerPoint. 我相信enum的文档中ppSaveAsFileType也使用了相同的名称;请注意(PowerPoint)文档标题的附加内容。

您还可以使用类型库的 GUID 以及版本号,但是如果您必须手动键入,那键盘就不太适用了。

如果需要提醒,可以使用from comtypes.gen import PowerPoint; help(PowerPoint)查看已定义的名称,或者仅参考 Microsoft 文档。

任何一种方法都可以避免使用幻数;类型库定义本身为您提供符号名称。

如果您找到任何代码示例win32com,那么任何使用win32com.client.constants属性都会直接转换为comtypes.client.Constant(...)comtypes.gen.<module>属性。


我无权访问 Windows 设置来实际测试任何这些,我从阅读文档和comtypes.


推荐阅读