【问题标题】:Java: How to check if printer statusJava:如何检查打印机状态
【发布时间】:2016-01-22 09:03:19
【问题描述】:

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

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

我找到了这个代码部分:

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);
}

这部分工作正常,并给了我这个输出:

但我没有找到获取所需信息的方法。

我也试过了。

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

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

但是printerState总是null

【问题讨论】:

标签: java printing status


【解决方案1】:

仅适用于 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
  • 扩展打印机状态
  • ...

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2020-12-27
      • 1970-01-01
      • 1970-01-01
      • 2021-07-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多