【问题标题】:PowerPoint Print to PDF using win32comPowerPoint 使用 win32com 打印到 PDF
【发布时间】:2021-03-03 18:31:55
【问题描述】:

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

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

我做了什么:在this question 的帮助下,我想出了如何导出为 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 不太熟悉,而且文档似乎不存在,所以我不确定还能尝试什么。

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

【问题讨论】:

  • win32com 是 pywin32 模块的一部分。有一个寻求帮助的邮件列表,还有timgolden.me.uk/pywin32-docs/html/com/win32com/HTML/…。但是请注意,win32com 只是访问 COM 服务器的一种方式。要回答您的问题,您需要查看 PowerPoint 的对象模型,看看他们是否有办法指定文件名。
  • 我还要指出,Office 中的“导出为 PDF”任务有两个选项:“标准”,用于发布,“最小尺寸”仅用于在线。你可能设置错了。
  • 一般对于 win32com(至少 Office 部分)我查看 VBA 和 C# 文档并尝试翻译。看起来有一个背景选项。试试deck.PrintOut(Background=True) 之类的东西。请参阅 docs.microsoft.com/en-us/office/vba/api/…docs.microsoft.com/en-us/dotnet/api/…。还有这个9年前的! stackoverflow.com/questions/7993387/…
  • 嗨@TimRoberts,我已经尝试过导出设置 - 我相信我已经将所有内容设置为最高质量,包括有关压缩图像的 PowerPoint 设置。我现在手头没有这些链接,但还有其他人提到 Office-default Export to PDF 可能会在压缩方面非常激进,尤其是在处理 .png 文件时(我的情况)。

标签: python pdf office365 powerpoint


【解决方案1】:

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

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

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 更优雅的工作,可能是目标文件夹上的手表,但这解决了我的问题。我希望其他人将来会发现这很有用。

【讨论】:

    猜你喜欢
    • 2022-07-21
    • 1970-01-01
    • 2013-07-27
    • 1970-01-01
    • 2015-10-19
    • 1970-01-01
    • 2021-11-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多