仅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
现在,你需要看看状态和状态代码正在改变打印机的各种状态 - 关闭打印机和检查数字,打开封面,取出纸等,...这是我认为制造商/司机依赖,所以你只需要测试,看看返回代码。使用正确的打印机端口也很重要。对于Epson打印机,您必须使用“ESDPRT”,而不是直接使用COM或LPT进行状态更新...
如果状态正常,请解析数字并使您的程序正常工作。状态= 4240和状态= 3的意思是“无纸”为爱普生(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类还包括一些其他的特性,可能对一些其他打印机/驱动程序工作,是值得的测试,性能,如:
- StatusInfo
- 状态
- 可用性
- ErrorDescription中
- ErrorInformation
- ExtendedDetectedErrorState
- ExtendedPrinterStatus
- ...
检查这里的实现类,看看哪些属性可能存在的打印机服务属性https://docs.oracle.com/javase/8/docs/ api/javax/print/attribute/PrintServiceAttribute.html –
for attributes.get您很可能必须使用https://docs.oracle.com/javase/8/docs/api/javax/print/attribute/standard/PrinterState .html#getName-- –
它似乎重复http://stackoverflow.com/questions/16035739/how-to-access-the-status-of-the-printer –