使用 win32com 将 PowerPoint 打印为 PDF

PowerPoint Print to PDF using win32com

目标:使用 python,我想打开一个 Powerpoint 演示文稿并使用“Microsoft Print to PDF”打印机进行打印。 我不想 想将它导出为 PDF,我想使用“打印为 PDF”来打印它。这不是 this question.

的副本

为什么:我发现在我的用例中,打印为 PDF 可提供更好的图像质量,而导出为 PDF 会过度压缩内容。此外,我没有 Acrobat Pro,所以除了 Office 默认将文件导出为 PDF 之外,我别无他法。 (对于那些好奇的人,我有一个很大的 .pptx(12Mb,由于一些高质量的图像)。导出为 PDF 生成一个 1.4Mb 大的 PDF,打印为 PDF 生成另一个 1.8Mb。图像质量差异如此之大可以,另一个不行)。

我做了什么:在 的帮助下,我已经弄清楚了如何导出为 PDF(但使用 win32com 而不是 comtypes).

然后我试着改变周围的东西,这样我就可以打印而不是保存,就像这样:

powerpoint = win32com.client.Dispatch("Powerpoint.Application")
deck = powerpoint.Presentations.Open("prs.pptx")
deck.PrintOut()
deck.Close()
powerpoint.Quit()

这几乎可以工作,因为它选择 Microsoft Print to PDF 作为打印机(因为它是默认设置)。但是,“打印为 PDF”会打开文件名提示 - 这就是我目前遇到的问题。我想找到一种方法来以编程方式处理类似文件对话框的 window 并确认打印。

我检查了是否需要 deck.PrintOut(PrintToFile="prs.pdf"),但是这并没有创建任何文件。

问题:

1 - 有没有一种方法,使用 win32com 或类似的方法,以处理额外对话框的方式调用 deck.PrintOut()? 2 - 或者,有没有一种方法可以捕获对话并进行处理?

我对 win32com 不太熟悉,文档似乎不存在,所以我不确定还能尝试什么。

希望这个问题足够清楚。非常感谢。

我在上面找到了解决我自己问题的方法,所以我将post作为答案。

事实证明,使用 PrintOut 的尝试是正确的 (doc here)!但是我相信这个方法是异步的,所以在下面的代码片段中:

powerpoint = win32com.client.Dispatch("Powerpoint.Application")
deck = powerpoint.Presentations.Open("prs.pptx")
deck.PrintOut(PrintToFile="prs.pdf")
deck.Close()
powerpoint.Quit()

打印任务因关闭 presentation/quitting PowerPoint 而中止。

虽然听起来很傻,但工作代码是:

powerpoint = win32com.client.Dispatch("Powerpoint.Application")
deck = powerpoint.Presentations.Open("prs.pptx")
deck.PrintOut(PrintToFile="prs.pdf")
time.sleep(10)  # Enough time to ensure the print operation is complete
deck.Close()
powerpoint.Quit()

我会做一些比固定 sleep 更优雅的事情,可能是目标文件夹上的监视,但这解决了我的问题。我希望将来其他人会觉得这很有用。