python - 保存带有 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)
解决方案
您可以访问与通过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
.
推荐阅读
- firebase - 我可以在 ReactNative 项目中同时使用 'react-native-firebase' 和 'firebase' 吗?
- python-3.x - 是否可以使用 Python(PyUSB)获取 USB 设备节点(文件)?
- javascript - Javascript错误的计算和舍入数字
- linux - 如何从正在运行的程序的输出中只显示我想要的数据?
- c - 如何在 C 中请求无限的用户输入?
- c# - Unity 中的脚本问题
- mysql - MySQL SELECT、UNION、JOIN 查询优化
- flask - 如何从 Flask-WTF 中的 BooleanField 获取值?
- c# - 是否有将以下 LINQ 查询语法转换为使用 Lambda 的方法语法的解决方案
- c# - 从 C# 调用 Cygwin 的 Seg 错误