使用 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
更优雅的事情,可能是目标文件夹上的监视,但这解决了我的问题。我希望将来其他人会觉得这很有用。
目标:使用 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。图像质量差异如此之大可以,另一个不行)。
我做了什么:在 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
更优雅的事情,可能是目标文件夹上的监视,但这解决了我的问题。我希望将来其他人会觉得这很有用。