java - 查找打印机是否在线并准备好打印

标签 java printing printers

以下 4 个问题没有帮助,因此这不是重复的:

ONE , TWO , THREE , FOUR


我需要找到一种方法来确定我的系统报告的打印机是否可以打印。

打印机页面:

enter image description here

图中打印机“THERMAL”可以打印,但是“HPRT PPTII-A(USB)”无法打印。系统告诉我,通过使不可用的打印机变暗

使用下面的代码,我能够找到系统中的所有打印机

public static List<String> getAvailablePrinters() {
    DocFlavor flavor = DocFlavor.SERVICE_FORMATTED.PRINTABLE;
    PrintRequestAttributeSet aset = new HashPrintRequestAttributeSet();

    PrintService[] services = PrintServiceLookup.lookupPrintServices(flavor, aset);
    ArrayList<String> names = new ArrayList<String>();
    for (PrintService p : services) {
        Attribute at = p.getAttribute(PrinterIsAcceptingJobs.class);
        if (at == PrinterIsAcceptingJobs.ACCEPTING_JOBS) {
            names.add(p.getName());
        }

    }
    return names;
}

输出:

[HPRT PPTII-A(USB), THERMAL]

问题是:这段代码显示了系统曾经安装过的所有打印机。

我需要什么:这个列表应该只包含真正可用的打印机来打印。在这个例子中,它应该只显示“THERMAL”,而不应该显示“HPRT PPTII-A(USB)”

如何实现?

最佳答案

如果特定于 Windows 的解决方案没问题,请尝试 WMI4Java .这是我的情况:

Printers list

如您所见,我的默认打印机“Kyocera Mita FS-1010”处于非 Activity 状态(灰色),因为我只是将其关闭。

现在将其添加到您的 Maven POM 中:

<dependency>
  <groupId>com.profesorfalken</groupId>
  <artifactId>WMI4Java</artifactId>
  <version>1.4.2</version>
</dependency>

然后就可以很容易地列出所有打印机及其各自的状态:

package de.scrum_master.app;

import com.profesorfalken.wmi4java.WMI4Java;
import com.profesorfalken.wmi4java.WMIClass;

import java.util.Arrays;

public class Printer {
    public static void main(String[] args) {
        System.out.println(
            WMI4Java
                .get()
                .properties(Arrays.asList("Name", "WorkOffline"))
                .getRawWMIObjectOutput(WMIClass.WIN32_PRINTER)
        );
    }
}

控制台日志如下所示:

Name        : WEB.DE Club SmartFax
WorkOffline : False

Name        : Send To OneNote 2016
WorkOffline : False

Name        : Microsoft XPS Document Writer
WorkOffline : False

Name        : Microsoft Print to PDF
WorkOffline : False

Name        : Kyocera Mita FS-1010 KX
WorkOffline : True

Name        : FreePDF
WorkOffline : False

Name        : FinePrint
WorkOffline : False

Name        : Fax
WorkOffline : False

请注意,对于 Kyocera 打印机,WorkOfflineTrue。可能这就是您想了解的内容。

现在稍微修改一下以过滤打印机列表,以便仅显示 Activity 打印机:

            WMI4Java
                .get()
                .properties(Arrays.asList("Name", "WorkOffline"))
                .filters(Arrays.asList("$_.WorkOffline -eq 0"))
                .getRawWMIObjectOutput(WMIClass.WIN32_PRINTER)

更新:有人问我如何获取 Activity 打印机名称的列表。好吧,由于 shortcoming in WMI4Java,这并不容易我刚刚为此提交了一个拉取请求。它使我们能够解析和过滤原始 WMI 输出,但代码仍然非常简单:

package de.scrum_master.app;

import com.profesorfalken.wmi4java.WMI4Java;
import com.profesorfalken.wmi4java.WMIClass;

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public class Printer {
    public static void main(String[] args) {
        String rawOutput = WMI4Java
            .get()
            .properties(Arrays.asList("Name", "WorkOffline"))
            .filters(Arrays.asList("$_.WorkOffline -eq 0"))
            .getRawWMIObjectOutput(WMIClass.WIN32_PRINTER);
        List<String> printers = Arrays.stream(rawOutput.split("(\r?\n)"))
            .filter(line -> line.startsWith("Name"))
            .map(line -> line.replaceFirst(".* : ", ""))
            .sorted()
            .collect(Collectors.toList());
        System.out.println(printers);
    }
}

控制台输出如下所示:

[Fax, FinePrint, FreePDF, Microsoft Print to PDF, Microsoft XPS Document Writer, Send To OneNote 2016, WEB.DE Club SmartFax]

关于java - 查找打印机是否在线并准备好打印,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41775357/

相关文章:

java - 为什么创建一个大的 Java 数组会消耗这么多内存?

java - 有哪些 java api 可以帮助使用反射进行注释处理?

Macbook Bootcamp Windows 上的 Java Html 呈现器

css - 如何使用CSS将打印机的页面设置为A4尺寸?

java - Spring 4 Framework Internationalization 无法使用 thymeleaf 识别来自资源属性文件的消息

java - Primefaces 键盘组件未在后端设置值

pdf - 同一个 PDF 文档的打印方式与在屏幕上查看的方式是否不同?

c++ - WINAPI 打印 - 具有相同尺寸的两种纸张类型

c - 有没有办法使用 CUPS 库获取打印机的字节命令列表?

ios - 发送命令到斑马打印机xcode