2016-01-22 553 views
0

我正在寻找一种方法来检查我的打印机的某些状态。 我想知道这些状态:Java:如何检查打印机状态

  • 如果打印机是开/关
  • 如果纸张用完
  • 也许一种方式来获得默认纸张大小?

我发现这部分代码:

Attribute[] attrs = service.getAttributes().toArray(); 

for (Attribute attr : attrs) { 
    String attrName = attr.getName(); 
    String attrValue = attr.toString(); 

    System.out.println("Found attribute: " + attrName + " with value: " + attrValue); 
} 

这部分工作正常,并给了我这样的输出: enter image description here

但我没有找到一种方式来获得信息我想。

我也试过这个。

AttributeSet attributes = service.getAttributes(); 
String printerState = attributes.get(PrinterState.class).toString(); 

System.out.println("printerState = " + printerState); 

但printerState总是null

+0

检查这里的实现类,看看哪些属性可能存在的打印机服务属性https://docs.oracle.com/javase/8/docs/ api/javax/print/attribute/PrintServiceAttribute.html –

+0

for attributes.get您很可能必须使用https://docs.oracle.com/javase/8/docs/api/javax/print/attribute/standard/PrinterState .html#getName-- –

+0

它似乎重复http://stackoverflow.com/questions/16035739/how-to-access-the-status-of-the-printer –

回答

-1

我正在查找相同的打印机信息。默认情况下,您只能获取您找到的信息。如果你需要更多,你可以使用SNMP。您需要在Windows中配置它,并根据环境,这可能是一个问题。

0

仅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
  • ...