3

プリンターの状態を知りたい。Java プログラムを使用してプリンターのステータスを制御する必要があります。例

  1. プリンターの状態を確認し、天気がジョブを受け入れるかどうか、
  2. 紙切れ
  3. プリンタ キュー
  4. トナー
  5. や。。など..

名前やカラー対応の有無などの基本情報を確認する方法があることは知っています。しかし、用紙、トナー、ジョブ キューを確認する例が見つかりません。Java API を使用できるかどうか知りたいです。プリンター機能の大きな API を見つけましたが、その使用方法の簡単な例が示されていませんでした。

4

4 に答える 4

4

このPrinterStateReasonを見てください。また、javax.print

于 2013-04-16T11:37:05.660 に答える
2

プリンターの完全なステータスを取得することはできません。プリンターには、サービスを要求できるネイティブ ドライバーがありますが、可能なプリンター機能が非常に多いため、Java はそのサブセットのみをサポートします。

実際に呼び出すことで、ユーザーにステータスを変更するように提案できます

PrinterJob pj = PrinterJob.getPrinterJob();
pj.printDialog()

ネイティブ プリンター ダイアログが表示されます。プリンターの状態を確認できるという javax.print API の情報にもかかわらず、私のプリンターでは確認できませんでした。(キヤノン)。

チェックするコード:

import javax.print.*;
import javax.print.attribute.DocAttributeSet;
import javax.print.attribute.PrintServiceAttributeSet;
import javax.print.attribute.standard.PrinterStateReason;
import javax.print.attribute.standard.PrinterStateReasons;
import javax.print.attribute.standard.Severity;
import javax.print.event.*;
import java.awt.*;
import java.awt.print.PageFormat;
import java.awt.print.Printable;
import java.awt.print.PrinterException;
import java.awt.print.PrinterJob;
import java.io.*;
import java.util.Set;

/**
 * PrintTest
 */
public class PrintTest implements PrintServiceAttributeListener,PrintJobListener,Doc, Printable, PrintJobAttributeListener {

  private static final transient String TEXT = "12345";

  public static void main(String[] args) {
    PrintTest test = new PrintTest();
    test.checkPrinters();
  }

  public void checkPrinters() {
    Thread newThread = new Thread(new Runnable() {
      public void run() {
    PrintService ps = PrinterJob.getPrinterJob().getPrintService();

    DocFlavor[] myFlavors = ps.getSupportedDocFlavors();
    ps.addPrintServiceAttributeListener(PrintTest.this);
    DocPrintJob docJob = ps.createPrintJob();
      docJob.addPrintJobAttributeListener(PrintTest.this, null);
    docJob.addPrintJobListener(PrintTest.this);
    try {
      docJob.print(PrintTest.this,null);
    }
    catch (PrintException e) {
      e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
    }
    } });

    newThread.start();
    /**
    PrintServiceAttributeSet attSet = ps.getAttributes();
    PrinterStateReasons psr = ps.getAttribute(PrinterStateReasons.class);

    if (psr != null) {
      Set<PrinterStateReason> errors = psr.printerStateReasonSet(Severity.REPORT);
      for (PrinterStateReason reason : errors)
        System.out.printf(" Reason : %s",reason.getName());
      System.out.println();
    }          */
  }

  public void attributeUpdate(PrintServiceAttributeEvent psae) {
    System.out.println(psae.getAttributes());
  }

  public void printDataTransferCompleted(PrintJobEvent pje) {
    System.out.println("Transfer completed");
  }

  public void printJobCompleted(PrintJobEvent pje) {
    System.out.println("Completed");
  }

  public void printJobFailed(PrintJobEvent pje) {
    System.out.println("Failed");
    PrinterStateReasons psr = pje.getPrintJob().getPrintService().getAttribute(PrinterStateReasons.class);
    if (psr != null) {
      Set<PrinterStateReason> errors = psr.printerStateReasonSet(Severity.REPORT);
      for (PrinterStateReason reason : errors)
        System.out.printf(" Reason : %s",reason.getName());
      System.out.println();
    }
  }

  public void printJobCanceled(PrintJobEvent pje) {
    System.out.println("Canceled");
  }

  public void printJobNoMoreEvents(PrintJobEvent pje) {
    System.out.println("No more events");
  }

  public void printJobRequiresAttention(PrintJobEvent pje) {
    System.out.println("Job requires attention");
    PrinterStateReasons psr = pje.getPrintJob().getPrintService().getAttribute(PrinterStateReasons.class);
    if (psr != null) {
      Set<PrinterStateReason> errors = psr.printerStateReasonSet(Severity.REPORT);
      for (PrinterStateReason reason : errors)
        System.out.printf(" Reason : %s",reason.getName());
      System.out.println();
    }
  }

  public DocFlavor getDocFlavor() {
    return DocFlavor.SERVICE_FORMATTED.PRINTABLE;  //To change body of implemented methods use File | Settings | File Templates.
  }

  public Object getPrintData() throws IOException {
    return this;
  }

  public DocAttributeSet getAttributes() {
    return null;  //To change body of implemented methods use File | Settings | File Templates.
  }

  public Reader getReaderForText() throws IOException {
    return null; //To change body of implemented methods use File | Settings | File Templates.
  }

  public InputStream getStreamForBytes() throws IOException {
    return null;  //To change body of implemented methods use File | Settings | File Templates.
  }

  public int print(Graphics graphics, PageFormat pageFormat, int pageIndex) throws PrinterException {
    return pageIndex == 0 ? PAGE_EXISTS : NO_SUCH_PAGE;  //To change body of implemented methods use File | Settings | File Templates.
  }

  public void attributeUpdate(PrintJobAttributeEvent pjae) {
    System.out.println("Look out");
  }
}

故意にケースを開けたり、用紙を取り除いたりして、PrinterReasonsState を取得しようとしましたが、失敗しました。おそらく他の誰かがそれがどのように可能かを示すことができますが、これまでのところ、API は実際には利用できないより多くの機能を提供しているようです.

つまり、少なくとも私のプリンターでは機能しません。

于 2013-04-16T11:36:38.650 に答える
0

更新: 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の答え

于 2017-08-01T14:33:33.027 に答える