仅适用于 Windows 的解决方案,查询 WMI "win32_printer" 类:Win32_Printer class。
在 Java 中,您可以像这样使用 ProcessBuilder 来启动 PowerShell 并执行 PS 脚本:
String printerName = "POS_PRINTER";
ProcessBuilder builder = new ProcessBuilder("powershell.exe", "get-wmiobject -class win32_printer | Select-Object Name, PrinterState, PrinterStatus | where {$_.Name -eq '"+printerName+"'}");
String fullStatus = null;
Process reg;
builder.redirectErrorStream(true);
try {
reg = builder.start();
fullStatus = getStringFromInputStream(reg.getInputStream());
reg.destroy();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
System.out.print(fullStatus);
getStringFromInputStream() 方法请看这里:a comprehensive StackOverflow answer。
运行上面的代码后,你会得到一个字符串,内容如下:
Name PrinterState PrinterStatus
---- ------------ -------------
POS_PRINTER 0 3
您现在需要查看各种打印机状态的状态和状态代码是否正在发生变化 - 关闭打印机并检查数字、打开盖子、取出纸张等...我认为这取决于制造商/驱动程序,所以您只需要测试并查看返回码。使用正确的打印机端口也可能很重要,例如对于爱普生打印机,您必须使用“ESDPRT”而不是直接使用 COM 或 LPT 来正确更新状态...
如果状态有效,请解析数字并使您的程序相应地工作,例如State = 4240 和 Status = 3 表示 Epson (TM) 打印机的“无纸”...
如果一切正常,您可以像这样解析状态和状态代码:
int statusCode = 0;
int stateCode = 0;
int indexPrinterStatusCodeStart = fullStatus.length() - 1;
PrinterStatus printerStatus = null;
// reverse loop string till space and remember index which indicates start of printerStatusCode
while(fullStatus.charAt(indexPrinterStatusCodeStart) != ' '){
indexPrinterStatusCodeStart--;
}
try{
// substring between indexPrinterStatusCode and string length
statusCode=Integer.parseInt(fullStatus.substring(indexPrinterStatusCodeStart, fullStatus.length()).trim());
// substring between index of printerName + printerName length and start index of printerStatusCode
stateCode=Integer.parseInt(fullStatus.substring(fullStatus.indexOf(printerName) + printerName.length(), indexPrinterStatusCodeStart).trim());
}catch(Exception e){
System.err.println("Failed to parse printer status/state codes!" + e.getMessage());
}
然后类似的事情......
if(statusCode == 1 || statusCode == 2){
if(statusCode == 1 && stateCode == 1){
printerStatus = "Printer paused!";
}else{
printerStatus = "Printer turned off!";
}
}else if (statusCode == 3 && stateCode == 0){
printerStatus = "Printer should work!";
}
// etc...
Win32_Printer 类还包括其他一些可能适用于其他打印机/驱动程序并值得测试的属性,例如:
- 状态信息
- 状态
- 可用性
- 错误说明
- 错误信息
- ExtendedDetectedErrorState
- 扩展打印机状态
- ...