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
相关产品推荐
相关产品推荐

