C# System.Printing打印任务状态原因排查、Deleted状态分析及打印机耗材检测咨询
C# System.Printing打印任务状态原因排查、Deleted状态分析及打印机耗材检测咨询
你好!针对你遇到的打印任务总是显示PrintJobStatus.Deleted的问题,以及想检测打印机纸张和墨水的需求,我来帮你逐一分析:
一、PrintJobStatus.Deleted 状态的原因分析及排查建议
1. 代码中PDF文件处理方式错误(最可能的原因)
我注意到你的代码里直接用File.ReadAllText(filePath)读取PDF文件内容,然后转成Unicode字节流写入打印任务流——但PDF是二进制格式,不是纯文本文件!这种方式会把PDF的二进制数据当成乱码文本读取,写入打印流后,打印机无法识别无效的打印数据,会直接丢弃这个任务,所以状态会变成Deleted。
正确的做法应该是读取PDF的二进制字节,而不是文本:
// 替换原有的文本读取和写入逻辑 byte[] pdfBytes = File.ReadAllBytes(filePath); Stream myStream = myPrintJob.JobStream; myStream.Write(pdfBytes, 0, pdfBytes.Length); myStream.Close();
2. 打印任务被快速清理的其他可能原因
- 打印机驱动兼容性问题:如果打印机驱动不支持你提交的打印格式,可能会自动删除无效任务。可以尝试更新打印机驱动,或者换用系统自带的通用驱动测试。
- 打印队列自动清理设置:部分打印机或系统会自动删除已完成/无效的任务,你可以打开系统的「打印队列」,查看任务是否真的被提交后立即被清理。
- 代码中状态检查时机过早:你在写入流后立即调用
CheckPrintJobStatus,此时打印任务可能还没来得及被打印机处理,状态还没更新。可以尝试添加短暂延迟后再刷新状态:
// 写入流后延迟1-2秒再检查 System.Threading.Thread.Sleep(1000); printJob.Refresh(); CheckPrintJobStatus(myPrintJob);
二、如何检测打印机的纸张与耗材状态
使用System.Printing命名空间的API,可以通过PrintQueue对象获取打印机的硬件状态,包括纸张、墨水/碳粉情况:
1. 检测纸张状态
可以通过PrintQueue的PrinterState属性判断是否缺纸,或者检查队列的状态标志:
// 获取默认打印队列 PrintQueue defaultPrintQueue = LocalPrintServer.GetDefaultPrintQueue(); defaultPrintQueue.Refresh(); // 检查是否缺纸 if ((defaultPrintQueue.PrinterState & PrinterState.PaperOut) != 0) { Console.WriteLine("打印机缺纸!"); } // 检查是否有纸张可用 if (!defaultPrintQueue.IsPaperAvailable) { Console.WriteLine("打印机无可用纸张!"); }
2. 检测墨水/碳粉状态
对于支持耗材状态报告的打印机,可以通过PrintQueue的GetPrintSystemAttributes获取耗材信息,或者检查PrinterState中的低墨标志:
// 检查是否低墨/碳粉 if ((defaultPrintQueue.PrinterState & PrinterState.TonerLow) != 0) { Console.WriteLine("打印机墨水/碳粉不足!"); } // 更详细的耗材信息(部分打印机支持) foreach (PrintSystemAttribute attr in defaultPrintQueue.GetPrintSystemAttributes()) { if (attr is TonerLevel tonerLevel) { Console.WriteLine($"碳粉剩余量:{tonerLevel.Value}%"); } else if (attr is PaperLevel paperLevel) { Console.WriteLine($"纸张剩余量:{paperLevel.Value}张"); } }
注意:并非所有打印机都支持详细的耗材状态报告,这取决于打印机硬件和驱动是否提供该API支持。如果上述方法无法获取,可能需要使用打印机厂商提供的专用SDK来查询。
备注:内容来源于stack exchange,提问作者NIB
相关产品推荐
相关产品推荐

