You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python设置默认打印机后打印PDF仍发送至初始默认打印机问题

问题原因与解决方案

你的问题出在win32api.ShellExecute的"print"命令行为上:它会缓存程序启动时的默认打印机上下文,即便后续通过win32print.SetDefaultPrinter修改了系统默认打印机,这个缓存也不会更新,导致打印任务始终发往初始默认打印机。

修复方案1:给ShellExecute明确指定打印机

直接在ShellExecute的参数中添加打印机指定参数"/d:<打印机名>",跳过系统默认打印机的依赖,强制指定打印目标。修改后的代码如下:

def printfile(filename):
    # 将import放在函数外,避免循环重复导入
    import win32print, time, win32api
    
    while True:
        printername = input("printername:")
        try:
            # 保存原默认打印机
            original_printer = win32print.GetDefaultPrinter()
            
            if original_printer != printername:
                win32print.SetDefaultPrinter(printername)
                time.sleep(0.5)  # 短延迟确保系统设置生效
            
            # 关键修改:添加/d参数指定打印机
            win32api.ShellExecute(
                0,
                "print",
                filename,
                f"/d:{printername}",
                ".",
                0
            )       
            
            time.sleep(3)
            
            # 恢复原默认打印机
            win32print.SetDefaultPrinter(original_printer)
        except Exception as err:
            print(err)
        
printfile('Black.pdf')

修复方案2:直接使用win32print打印API(更稳定)

跳过ShellExecute,直接用win32print的原生接口发送打印任务,完全控制打印目标,避免上下文缓存问题:

def printfile(filename):
    import win32print, time
    
    while True:
        printername = input("printername:")
        try:
            original_printer = win32print.GetDefaultPrinter()
            
            # 获取打印机句柄
            hprinter = win32print.OpenPrinter(printername)
            try:
                # 创建打印任务
                hjob = win32print.StartDocPrinter(hprinter, 1, (filename, None, "RAW"))
                try:
                    win32print.StartPagePrinter(hprinter)
                    # 读取文件内容并发送到打印机
                    with open(filename, "rb") as f:
                        win32print.WritePrinter(hprinter, f.read())
                    win32print.EndPagePrinter(hprinter)
                finally:
                    win32print.EndDocPrinter(hprinter)
            finally:
                win32print.ClosePrinter(hprinter)
            
            time.sleep(3)
            win32print.SetDefaultPrinter(original_printer)
        except Exception as err:
            print(err)
        
printfile('Black.pdf')

额外优化点

  • 把import语句移到函数外部,避免每次循环重复导入模块,提升运行效率。
  • 移除不必要的global变量,改用局部变量保存原打印机即可。

内容的提问来源于stack exchange,提问作者MASOOD

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 10:25:10