2009-09-07 87 views
0

我能够得到我以前在我的PC上安装过的打印机的名称,但现在它的物理上并没有连接到我的电脑上。在Java中移动到Print()之前,我应该如何检查它。如何检查打印机是否通过Java连接到您的PC?

+0

如果它是好的,该解决方案是针对Windows的,看到http://stackoverflow.com/a/41808295/1082681。 – kriegaex 2017-01-23 14:13:04

回答

2

看看javax.print API。一个好的起点是PrintServiceLookup

+0

从什么时候起,SO upvote“阅读文档”的评论? – th3byrdm4n 2017-09-26 20:35:54

3

您可以使用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"); 
     } 
+2

在过去的几天里,我一直在测试很多连接到操作系统的打印机和网络打印机,并且似乎无法检查打印机的状态。上面的代码片段什么都不做。 (如在;所有“离线”。)(我是Windows 7与Java 7) – Philipp 2013-12-03 12:03:32

+0

你知道为什么PrinterState总是空? – whizzzkey 2014-11-18 01:25:45

+0

没有为我们工作,谢谢。 – th3byrdm4n 2017-09-26 20:36:11

0

中有没有设定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> 
0

另一种方法是使用PowerShell和查询:

Get-WmiObject -Query "Select * From Win32_PnPEntity where deviceid like 'USBPRINT\\%' and caption like '%Canon%'" 

这样,你得到的只是,如果打印机结果连接的。

可以从Java查询WMI有许多图书馆,搜索 “WMI Java库”。

相关问题