gpt4 book ai didi

Java:如何检查打印机状态

转载 作者:行者123 更新时间:2023-11-30 07:39:09 27 4
gpt4 key购买 nike

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

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

我找到了这个代码部分:

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

最佳答案

仅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 才能正确更新状态...

如果状态有效,请解析数字并使您的程序相应地工作,例如对于 Epson (TM) 打印机,State = 4240 和 Status = 3 表示“无纸”...

如果一切正常,您可以像这样解析状态和状态代码:

    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 类还包括一些可能适用于其他打印机/驱动程序并且值得测试的其他属性,例如:

  • 状态信息
  • 状态
  • 可用性
  • 错误描述
  • 错误信息
  • 扩展检测错误状态
  • 扩展打印机状态
  • ...

关于Java:如何检查打印机状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34942713/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com