我能够得到我以前在我的PC上安装过的打印机的名称,但现在它的物理上并没有连接到我的电脑上。在Java中移动到Print()之前,我应该如何检查它。如何检查打印机是否通过Java连接到您的PC?
回答
看看javax.print API。一个好的起点是PrintServiceLookup。
从什么时候起,SO upvote“阅读文档”的评论? – th3byrdm4n 2017-09-26 20:35:54
您可以使用PrinterState
属性如果您的打印机支持。
事情是这样的:
PrintServiceAttributeSet printServiceAttributes = selectedService.getAttributes();
PrinterState printerState = (PrinterState) printServiceAttributes.get(PrinterState.class);
if (printerState != null){
System.out.println(printerName + " is online");
}
else {
System.out.println(printerName + " is offline");
}
在过去的几天里,我一直在测试很多连接到操作系统的打印机和网络打印机,并且似乎无法检查打印机的状态。上面的代码片段什么都不做。 (如在;所有“离线”。)(我是Windows 7与Java 7) – Philipp 2013-12-03 12:03:32
你知道为什么PrinterState总是空? – whizzzkey 2014-11-18 01:25:45
没有为我们工作,谢谢。 – th3byrdm4n 2017-09-26 20:36:11
中有没有设定PrinterState属性。但是你可以加载库Winspool.drv并询问它的属性。存在int Attributes @ 68 =,它具有联机的40值和脱机打印机的e40值。
开始出现 - https://msdn.microsoft.com/cs-cz/library/windows/desktop/dd144911(v=vs.85).aspx。
使用这些类,然后让WinspoolUtilExt.getPrinterInfo2(ps.getName())。toString()和有一个属性。
public interface WinspoolExt extends Winspool {
WinspoolExt INSTANCE = (WinspoolExt) Native.loadLibrary("Winspool.drv", WinspoolExt.class, W32APIOptions.UNICODE_OPTIONS);
boolean GetPrinter(HANDLE hPrinter, int Level, Pointer pPrinter, int cbBuf, IntByReference pcbNeeded);
boolean OpenPrinter(String pPrinterName, HANDLEByReference phPrinter, Pointer pDefault);
public static class PRINTER_INFO_2 extends Structure {
public String pServerName;
public String pPrinterName;
public String pShareName;
public String pPortName;
public String pDriverName;
public String pComment;
public String pLocation;
public INT_PTR pDevMode;
public String pSepFile;
public String pPrintProcessor;
public String pDatatype;
public String pParameters;
public INT_PTR pSecurityDescriptor;
public int Attributes;
public int Priority;
public int DefaultPriority;
public int StartTime;
public int UntilTime;
public int Status;
public int cJobs;
public int AveragePPM;
protected List<String> getFieldOrder() {
return Arrays.asList(new String[] { "pServerName", "pPrinterName", "pShareName", "pPortName", "pDriverName", "pComment", "pLocation", "pDevMode", "pSepFile", "pPrintProcessor", "pDatatype", "pParameters", "pSecurityDescriptor", "Attributes", "Priority", "DefaultPriority", "StartTime", "UntilTime", "Status", "cJobs", "AveragePPM" });
}
public PRINTER_INFO_2() {
}
public PRINTER_INFO_2(int size) {
super(new Memory(size));
}
}
}
public class WinspoolUtilExt extends WinspoolUtil {
public static PRINTER_INFO_2 getPrinterInfo2(String printerName) {
IntByReference pcbNeeded = new IntByReference();
IntByReference pcReturned = new IntByReference();
HANDLEByReference pHandle = new HANDLEByReference();
WinspoolExt.INSTANCE.OpenPrinter(printerName, pHandle, (Pointer) null);
WinspoolExt.INSTANCE.GetPrinter(pHandle.getValue(), 2, null, 0, pcbNeeded);
if (pcbNeeded.getValue() <= 0) {
return new PRINTER_INFO_2();
}
PRINTER_INFO_2 pinfo2 = new PRINTER_INFO_2(pcbNeeded.getValue());
WinspoolExt.INSTANCE.GetPrinter(pHandle.getValue(), 2, pinfo2.getPointer(), pcbNeeded.getValue(), pcReturned);
pinfo2.read();
return (PRINTER_INFO_2) pinfo2;
}
}
Maven依赖:
<dependency>
<groupId>net.java.dev.jna</groupId>
<artifactId>jna</artifactId>
</dependency>
<dependency>
<groupId>net.java.dev.jna</groupId>
<artifactId>jna-platform</artifactId>
<version>${jna.version}</version>
</dependency>
另一种方法是使用PowerShell和查询:
Get-WmiObject -Query "Select * From Win32_PnPEntity where deviceid like 'USBPRINT\\%' and caption like '%Canon%'"
这样,你得到的只是,如果打印机结果连接的。
可以从Java查询WMI有许多图书馆,搜索 “WMI Java库”。
- 1. 如何检查打印机是否与我的PC物理连接?
- 2. 如果PC连接到网络打印机,如何在java中检查?
- 3. 检查打印机是否连接到电脑
- 4. 是否可以通过蓝牙连接iphone到打印机?
- 5. 如何通过python连接到以太网打印机?
- 6. Java:如何检查打印机状态
- 7. Python脚本如何检测耳机/耳机是否连接到PC?
- 8. 检查默认打印机是与否
- 9. 可以通过蓝牙连接android手机到打印机吗?
- 10. 检查PC是否连接到局域网
- 11. 如何检测是否有网络摄像头连接到PC?
- 12. 如何检查客户端是否不再通过Java中的TCP连接?
- 13. 如何通过Android连接网络打印机?
- 14. 如何在java连接池中检查连接是否关闭
- 15. 如何使用C#检查机器是否能够通过mstsc进行连接
- 16. 通过网络直接打印到打印机(如POS打印机)的最佳方式是什么?
- 17. 如何检测连接的USB打印机是打开还是关闭?
- 18. 无法连接到POS打印机通过TCP 9100
- 19. 使用虚拟打印机时,如何检查打印是否完成?
- 20. 如何检查是否有默认打印机(Windows)?
- 21. 如何通过PHP检查我的脚本是否连接到SMTP服务器
- 22. Java:检查PC是否空闲
- 23. 如何通过NSTask检查FTP连接?
- 24. 通过CAN/CANopen从PC连接到PLC
- 25. 通过mailEntryId检查mailWindow是否打开
- 26. Python通过套接字连接访问远程打印机
- 27. API的TOI连接到打印机
- 28. JavaPOS的:无法连接到打印机
- 29. 在ios中打印:如果打印机连接到mac,是否可以从模拟器打印?
- 30. 通过BLE将Arduino101连接到PC中的Java应用程序
如果它是好的,该解决方案是针对Windows的,看到http://stackoverflow.com/a/41808295/1082681。 – kriegaex 2017-01-23 14:13:04