Python调用win32print打印任务滞留在队列的问题求助
解决Windows下Python向网络打印机发送文本/文件的队列滞留问题
问题根源
你当前代码使用RAW数据类型直接发送UTF-8文本,但Brother DCP-L5652DN这类打印机无法直接解析纯UTF-8文本,导致任务滞留在队列中。RAW模式要求发送打印机原生支持的指令(如PCL、ESC/POS),而普通文本需要经过系统转换或添加打印机能识别的控制符。
针对性解决方案
1. 修正数据类型与文本格式
将数据类型改为TEXT,Windows会自动将文本转换为打印机兼容的格式,同时添加换行和换页符触发打印机输出:
import win32print import win32api printer_name = "Brother DCP-L5652DN Printer" try: v_printer_handle = win32print.OpenPrinter(printer_name) v_job_name = "My Job" v_file_to_print = None v_data_type = "TEXT" # 切换为TEXT类型,由Windows处理格式转换 v_DocInfo = (v_job_name, v_file_to_print, v_data_type) win32print.StartDocPrinter(v_printer_handle, 1, v_DocInfo) win32print.StartPagePrinter(v_printer_handle) # 使用Windows默认ANSI编码(如cp1252)编码,添加换行+换页符确保打印机输出 raw_data = "This is a test printing python !\r\n\x0C".encode('cp1252') v_bytes = win32print.WritePrinter(v_printer_handle, raw_data) print("Bytes Sent: ", v_bytes) win32print.EndPagePrinter(v_printer_handle) win32print.EndDocPrinter(v_printer_handle) win32print.ClosePrinter(v_printer_handle) print("打印任务提交成功") except win32api.error as e: print(f"打印出错: {e}")
如果坚持使用RAW模式,需要发送打印机支持的指令,比如添加换页符\x0C:
raw_data = bytes("This is a test printing python !\x0C", "utf-8")
2. 确认打印机名称准确性
打印机名称必须完全匹配系统中的注册名称,可通过以下代码获取所有打印机的准确名称:
import win32print printers = win32print.EnumPrinters(win32print.PRINTER_ENUM_LOCAL | win32print.PRINTER_ENUM_NETWORK) for printer in printers: print(printer[2]) # 打印打印机名称
3. 打印文件的实现方式
- 文本文件:读取文件内容后按TEXT模式编码发送,类似上面的文本发送逻辑;
- PDF/Office文件:使用
ShellExecute调用系统关联程序打印,避免格式不兼容问题:
import win32api printer_name = "Brother DCP-L5652DN Printer" file_path = r"C:\path\to\your\file.pdf" # printto参数需将打印机名称用双引号包裹,处理名称含空格的情况 win32api.ShellExecute( 0, "printto", file_path, f'"{printer_name}"', ".", 0 )
内容的提问来源于stack exchange,提问作者Ricardo Pascoal
相关产品推荐
相关产品推荐

