使用打印服务器队列发送ZPL打印作业仅挂起不打印的问题求助
问题分析与解决方案
核心问题
通过PrintServer/PrintQueue提交打印作业时,作业被添加到队列后立即被删除,无法执行打印。直接向打印机IP发送ZPL指令可正常工作,但业务要求必须通过打印队列实现耗材缺料时的作业缓存。
关键原因
默认调用pq.AddJob()时,打印作业会被标记为EMF格式(增强元文件),而ZPL是打印机原生的RAW指令,打印服务器无法解析EMF格式下的ZPL内容,直接判定为无效作业并删除。
修复步骤
1. 指定RAW格式提交作业
调用AddJob的重载方法,明确指定作业为RAW格式,让打印服务器直接将指令转发给打印机,不做格式转换:
PrintServer ps = new PrintServer(@"\\10.10.15.158"); PrintQueue pq = ps.GetPrintQueue(@"Printer1"); // 指定作业名和RAW格式类型 PrintSystemJobInfo job = pq.AddJob("ZPL Label Job", "RAW", false);
2. 用BinaryWriter写入ZPL指令
ZPL是字节流指令,StreamWriter会做字符编码转换,可能破坏原始指令。改用BinaryWriter直接写入字节:
// 转换ZPL字符串为ASCII字节流(ZPL基于ASCII编码) byte[] zplBytes = Encoding.ASCII.GetBytes(@"^XA^FO50,50^ADN,36,20^FDTest label^FS^XZ"); using (BinaryWriter writer = new BinaryWriter(job.JobStream)) { writer.Write(zplBytes); writer.Flush(); // 关闭流时自动提交作业 }
额外验证点
- 确认打印队列的高级设置中已启用“允许RAW格式打印”(默认开启,可进入打印机属性-高级选项检查)
- 确保程序运行账户拥有打印队列的提交作业权限(你其他程序能正常打印,此步骤大概率无需调整)
内容的提问来源于stack exchange,提问作者Oliver Yoliver
相关产品推荐
相关产品推荐

