Moi*_*Col 3 java printing printers
以下 4 个问题没有帮助,因此这不是重复的:
我需要找到一种方法来发现我的系统报告的打印机是否可以打印。
打印机页面:
图中打印机“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;
}
Run Code Online (Sandbox Code Playgroud)
输出:
[HPRT PPTII-A(USB), THERMAL]
Run Code Online (Sandbox Code Playgroud)
问题是:此代码显示了系统曾经安装过的所有打印机。
我需要什么:这个列表应该只包含真正可用的打印机来打印。在这个例子中,它应该只显示“THERMAL”,而不显示“HPRT PPTII-A(USB)”
如何做到这一点?
如果解决方案特定于 Windows 没有问题,请尝试WMI4Java。这是我的情况:
如您所见,我的默认打印机“Kyocera Mita FS-1010”处于非活动状态(变灰),因为我只是将其关闭。
现在将其添加到您的 Maven POM 中:
<dependency>
<groupId>com.profesorfalken</groupId>
<artifactId>WMI4Java</artifactId>
<version>1.4.2</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)
然后就可以很容易地列出所有打印机及其各自的状态:
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)
);
}
}
Run Code Online (Sandbox Code Playgroud)
控制台日志如下所示:
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
Run Code Online (Sandbox Code Playgroud)
请注意,这WorkOffline是True用于京瓷打印机。大概这就是你想知道的。
现在进行一些修改以过滤打印机列表,以便仅显示活动打印机:
WMI4Java
.get()
.properties(Arrays.asList("Name", "WorkOffline"))
.filters(Arrays.asList("$_.WorkOffline -eq 0"))
.getRawWMIObjectOutput(WMIClass.WIN32_PRINTER)
Run Code Online (Sandbox Code Playgroud)
更新:有人问我如何获取活动打印机名称列表。嗯,这并不容易,因为我刚刚提交了一个拉取请求的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);
}
}
Run Code Online (Sandbox Code Playgroud)
控制台输出如下所示:
[Fax, FinePrint, FreePDF, Microsoft Print to PDF, Microsoft XPS Document Writer, Send To OneNote 2016, WEB.DE Club SmartFax]
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3463 次 |
| 最近记录: |