Python调用Microsoft Print To PDF打印PDF如何跳过弹窗预设输出路径
解决方案
可以实现无弹窗指定输出路径打印,你之前用的ShellExecute直接调用打印的方式没有提供传入PDF输出路径的参数入口,所以会触发系统弹窗,改用win32print搭配调整打印机参数的方式即可实现需求。
核心思路
Microsoft Print to PDF作为Windows内置虚拟打印机,支持通过修改打印配置的PortName参数传入目标PDF输出路径,识别到该参数后会自动跳过路径选择弹窗- 不要直接调用
ShellExecute触发打印,先调整打印机的配置参数再提交打印任务
环境依赖
首先安装pywin32库:
pip install pywin32
可运行代码示例
import win32print import win32api import win32gui import os def print_to_pdf(source_file: str, output_pdf_path: str) -> None: """ 无弹窗调用Microsoft Print to PDF打印文件到指定PDF路径 :param source_file: 待打印的源文件路径,支持txt、docx、jpg等系统支持直接打印的格式 :param output_pdf_path: 输出PDF的完整路径 """ printer_name = "Microsoft Print to PDF" # 打开打印机获取句柄 printer_handle = win32print.OpenPrinter(printer_name) try: # 获取打印机默认配置 printer_info = win32print.GetPrinter(printer_handle, 2) dev_mode = printer_info["pDevMode"] # 配置输出路径参数,虚拟打印机会将该值作为输出路径跳过弹窗 dev_mode.PortName = output_pdf_path # 生效配置修改 win32print.DocumentProperties( win32gui.GetForegroundWindow(), printer_handle, printer_name, dev_mode, dev_mode, win32print.DM_IN_BUFFER | win32print.DM_OUT_BUFFER ) # 提交打印任务 win32api.ShellExecute( 0, "print", source_file, f'/d:"{printer_name}"', os.path.dirname(source_file), 0 ) finally: # 释放打印机句柄 win32print.ClosePrinter(printer_handle) # 调用示例 if __name__ == "__main__": # 替换为实际的源文件路径和输出路径 PRINT_SOURCE = r"C:\Users\xxx\Documents\test.docx" OUTPUT_PDF = r"C:\Users\xxx\Documents\test_output.pdf" print_to_pdf(PRINT_SOURCE, OUTPUT_PDF)
注意事项
- 待打印的源文件需要是Windows系统关联了默认打开程序且支持直接打印的格式,否则可能触发对应应用的交互弹窗
- 输出路径如果已存在同名文件会直接覆盖,无确认提示
- 若打印Office系列文件,需要确保本机安装了完整版本的Office套件,部分精简版Office可能出现打印异常
- 32位和64位Python对应的pywin32版本要匹配,否则会出现接口调用失败的问题
内容的提问来源于stack exchange,提问作者stanly
相关产品推荐
相关产品推荐

