更新:
WMI「win32_printer」オブジェクトをクエリする代わりに、このように Powershell を直接使用することをお勧めします。よりクリーンな API です。
Get-Printer | where PrinterStatus -like 'Normal' | fl
すべてのプリンターとステータスを表示するには:
Get-Printer | fl Name, PrinterStatus
すべての属性を表示するには:
Get-Printer | fl
以下で説明するように、Java で ProcessBuilder を引き続き使用できます。
更新前:
Windows のみのソリューション。Windows では、WMI の「win32_printer」クラスを照会できるため、OS 層の状態を確認します: Win32_Printer クラス
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);
InputStream を String に変換すると、次のようになります。
Name PrinterState PrinterStatus
---- ------------ -------------
POS_PRINTER 0 3
状態とステータスは、さまざまな状況 (プリンターの電源がオフになっている、用紙がない、カバーが開いているなど) で変化するはずです。
これは機能するはずですが、プリンターとドライバーに依存します。これを ESDPRT ポートを備えた EPSON TM プリンタで使用したところ、用紙がない、カバーが開いている、プリンタがオフライン/オフになっている、プリンタが一時停止しているなどの情報を取得できました。
ここでより包括的な答え: -同様の質問に対する私のStackOverflowの答え。