收听打印作业请求状态更改

对于大多数打印客户端,了解打印作业是否已完成或失败非常有用。

Java Print Service API 提供了一些功能,可以了解这些方案。我们所要做的就是:

  • PrintJobListener 接口提供实现
  • 在打印作业中注册此实现。

当打印作业状态发生变化时,我们会收到通知。我们可以做任何事情,例如:

  • 更新用户界面,
  • 开始另一个业务流程,
  • 记录数据库中的内容,
  • 或者只是记录它。

在下面的示例中,我们将记录每个打印作业状态更改:

import javax.print.event.PrintJobEvent;
import javax.print.event.PrintJobListener;

public class LoggerPrintJobListener implements PrintJobListener {

    // Your favorite Logger class goes here!
    private static final Logger LOG = Logger.getLogger(LoggerPrintJobListener.class);

    public void printDataTransferCompleted(PrintJobEvent pje) {
        LOG.info("Print data transfer completed ;) ");
    }

    public void printJobCompleted(PrintJobEvent pje) {
        LOG.info("Print job completed =) ");
    }

    public void printJobFailed(PrintJobEvent pje) {
        LOG.info("Print job failed =( ");
    }

    public void printJobCanceled(PrintJobEvent pje) {
        LOG.info("Print job canceled :| ");
    }

    public void printJobNoMoreEvents(PrintJobEvent pje) {
        LOG.info("No more events to the job ");
    }

    public void printJobRequiresAttention(PrintJobEvent pje) {
        LOG.info("Print job requires attention :O ");
    }
}

最后,我们可以在打印请求本身之前在打印作业上添加我们的打印作业侦听器实现,如下所示:

DocPrintJob printJob = printService.createPrintJob();

printJob.addPrintJobListener(new LoggerPrintJobListener());

printJob.print(doc, pras);

PrintJobEvent 司法警察的说法

请注意,每个方法都有一个 PrintJobEvent pje 参数。出于简单的目的,我们不在此示例中使用它,但你可以使用它来探索状态。例如:

pje.getPrintJob().getAttributes();

将返回一个 PrintJobAttributeSet 对象实例,你可以以各种方式运行它们。

实现同一目标的另一种方式

实现相同目标的另一个选择是扩展 PrintJobAdapter 类,正如其名称所示,是 PrintJobListener 的适配器。我们强制执行接口必须实现所有这些接口。这种方式的优点是我们只需要覆盖我们想要的方法。让我们看看它是如何工作的:

import javax.print.event.PrintJobEvent;
import javax.print.event.PrintJobAdapter;

public class LoggerPrintJobAdapter extends PrintJobAdapter {

    // Your favorite Logger class goes here!
    private static final Logger LOG = Logger.getLogger(LoggerPrintJobAdapter.class);

    public void printJobCompleted(PrintJobEvent pje) {
        LOG.info("Print job completed =) ");
    }

    public void printJobFailed(PrintJobEvent pje) {
        LOG.info("Print job failed =( ");
    }
}

请注意,我们只覆盖一些特定的方法。

在实现接口 PrintJobListener 的示例中,我们将侦听器添加到打印作业,然后再将其发送到打印:

printJob.addPrintJobListener(new LoggerPrintJobAdapter());

printJob.print(doc, pras);