首页 > 解决方案 > PowerPoint 使用 win32com 打印到 PDF

问题描述

目标:使用 python,我想打开一个 Powerpoint 演示文稿并使用“Microsoft Print to PDF”打印机进行打印。我不想将其导出为 PDF,我想使用 Print to PDF 进行打印。这不是这个问题的重复。

原因:我发现在我的用例中,Print to PDF 提供了更好的图像质量,而 Export as PDF 则过度压缩了内容。另外我没有 Acrobat Pro,所以除了 Office 默认导出文件到 PDF 之外,我没有其他办法。(对于那些好奇的人,我有一个很大的 .pptx(12Mb,由于一些高质量的图像)。导出到 PDF 会生成一个 1.4Mb 大的 PDF,打印到 PDF 会生成另一个 1.8Mb 的 PDF。图像质量差异是这样的可以,另一个不行)。

我做了什么:我已经想出了如何在这个问题的帮助下导出为 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”会提示输入文件名 - 这就是我目前遇到的问题。我想找到一种以编程方式处理类似文件对话框的窗口并确认打印的方法。

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

问题

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

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

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

标签: pythonpdfoffice365powerpoint

解决方案


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

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

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

通过关闭演示文稿/退出 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,可能是目标文件夹上的手表,但这解决了我的问题。我希望其他人在未来发现这很有用。


推荐阅读