Python调用Zebra模块向网络打印机打印PRN文件遇问题求助
问题排查与修复
核心问题
你的代码和Zebra官网示例的关键差异,是导致打印失败的主要原因:
- 发送的是字符串而非字节串:网络打印机要求接收字节流,官网代码用
b""显式声明字节数据,而你的代码直接发送格式化后的字符串。 - 存在语法错误:函数定义
def print_label(printer_name)缺少冒号,import socket放在函数内部会导致重复导入或执行异常。 - 错误处理过于笼统:无法定位具体异常(如IP错误、连接超时、模板格式化失败)。
- 未验证打印机IP:未确认
printers[printer_name]返回的IP是否正确、可访问。
修复后的代码
import socket # 定义打印机IP字典(根据实际情况修改) printers = { "office_printer": "10.80.209.106", # 添加其他打印机配置 } def print_label(printer_name): # 先验证打印机名称是否存在 host = printers.get(printer_name) if not host: print(f"错误:无效的打印机名称 {printer_name}") return port = 9100 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) try: sock.connect((host, port)) # 将ZPL模板转为字节串(编码用utf-8或打印机支持的编码) zpl_content = ZEBRA_TEMPLATE_VAR.format(var1, var2, var3, var4).encode('utf-8') sock.sendall(zpl_content) # 用sendall确保数据全部发送 sock.shutdown(socket.SHUT_WR) # 告知打印机数据发送完毕 # 可选:接收打印机响应,排查打印状态 resp = sock.recv(1024) if resp: print(f"打印机反馈:{resp.decode('utf-8')}") except socket.gaierror: print(f"错误:无法解析打印机IP {host}") except socket.timeout: print(f"错误:连接打印机 {host} 超时") except ConnectionRefusedError: print(f"错误:打印机 {host} 拒绝连接,请检查端口/打印机状态") except Exception as e: print(f"未知错误:{str(e)}") finally: sock.close()
其他问题的解决建议
- zebra模块提示打印机名称无效:网络打印机无需本地打印机名称,直接用IP+端口连接即可。若坚持用zebra模块,需确保配置的是打印机的网络标识(如共享名或IP),而非本地设备名。
- simple_zpl2模块无数据发送:检查模块生成的ZPL代码是否合法,调用发送方法时需将ZPL内容转为字节串,同时用
telnet {打印机IP} 9100测试端口是否连通。
内容的提问来源于stack exchange,提问作者Fernando Beckworth
相关产品推荐
相关产品推荐

