Java:如何检查打印机状态

时间:2016-01-22 09:03:20

标签: java printing status

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

  • 如果打开/关闭打印机
  • 如果纸张用完
  • 也许是一种获取默认纸张尺寸的方法?

我找到了这段代码:

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

2 个答案:

答案 0 :(得分:2)

仅限Windows解决方案,查询WMI" win32_printer" class: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直接正确更新状态......

如果状态有效,请解析数字并使您的程序正常工作,例如状态= 4240,状态= 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类还包含一些其他可能适用于其他打印机/驱动程序的属性,值得测试,属性如下:

  • StatusInfo
  • 状态
  • 状况
  • ErrorDescription中
  • ErrorInformation
  • ExtendedDetectedErrorState
  • ExtendedPrinterStatus
  • ...

答案 1 :(得分:-1)

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