Поиск…


Вступление

API службы печати Java предоставляет функциональные возможности для обнаружения служб печати и отправки запросов на печать для них.

Он включает в себя расширяемые атрибуты печати на основе стандартных атрибутов, указанных в протоколе IP Printing (IPP) 1.1, из спецификации IETF, RFC 2911 .

Обнаружение доступных служб печати

Чтобы обнаружить все доступные службы печати, мы можем использовать класс PrintServiceLookup . Давайте посмотрим, как:

import javax.print.PrintService;
import javax.print.PrintServiceLookup;

public class DiscoveringAvailablePrintServices {

    public static void main(String[] args) {
        discoverPrintServices();
    }

    public static void discoverPrintServices() {
        PrintService[] allPrintServices = PrintServiceLookup.lookupPrintServices(null, null);
        
        for (Printservice printService : allPrintServices) {
            System.out.println("Print service name: " + printService.getName());
        }
    }

}

Эта программа, выполняемая в среде Windows, напечатает что-то вроде этого:

Print service name: Fax
Print service name: Microsoft Print to PDF
Print service name: Microsoft XPS Document Viewer

Обнаружение службы печати по умолчанию

Чтобы обнаружить службу печати по умолчанию, мы можем использовать класс PrintServiceLookup . Посмотрим, как:

import javax.print.PrintService;
import javax.print.PrintServiceLookup;

public class DiscoveringDefaultPrintService {

    public static void main(String[] args) {
        discoverDefaultPrintService();
    }

    public static void discoverDefaultPrintService() {
        PrintService defaultPrintService = PrintServiceLookup.lookupDefaultPrintService();
        System.out.println("Default print service name: " + defaultPrintService.getName());
    }

}

Создание задания печати из службы печати

Задание печати - это запрос на печать чего-либо в конкретной службе печати. Он состоит, в основном, путем:

После выбора правильного экземпляра службы печати мы можем запросить создание задания на печать:

DocPrintJob printJob = printService.createPrintJob();

Интерфейс DocPrintJob предоставляет нам метод print :

printJob.print(doc, pras);

doc аргумент Doc : данные, которые будут напечатаны.

И pras аргумент является PrintRequestAttributeSet интерфейс: набор PrintRequestAttribute . Являются примерами атрибутов запроса печати:

  • количество копий (1, 2 и т. д.),
  • ориентация (портрет или пейзаж)
  • хромкость (монохромный, цветной)
  • качество (черновик, нормальный, высокий)
  • стороны (односторонние, двухсторонние и т. д.)
  • и так далее...

Метод печати может PrintException .

Создание документа, который будет распечатан

Doc - это интерфейс, а API службы печати Java предоставляет простую реализацию под названием SimpleDoc .

Каждый экземпляр Doc в основном состоит из двух аспектов:

  • сам контент данных печати (электронная почта, изображение, документ и т. д.),
  • формат данных печати, называемый DocFlavor (тип MIME + класс представления).

Перед созданием объекта Doc нам нужно загрузить наш документ откуда-то. В этом примере мы загрузим конкретный файл с диска:

FileInputStream pdfFileInputStream = new FileInputStream("something.pdf");

Итак, теперь нам нужно выбрать DocFlavor который соответствует нашему контенту. Класс DocFlavor содержит кучу констант для представления наиболее обычных типов данных. INPUT_STREAM.PDF :

DocFlavor pdfDocFlavor = DocFlavor.INPUT_STREAM.PDF;

Теперь мы можем создать новый экземпляр SimpleDoc :

Doc doc = new SimpleDoc(pdfFileInputStream, pdfDocFlavor , null);

Объект doc теперь можно отправить в запрос на задание на печать (см. « Создание задания печати из службы печати» ).

Определение атрибутов запроса печати

Иногда нам нужно определить некоторые аспекты запроса на печать. Мы будем называть их атрибутом .

Являются примерами атрибутов запроса печати:

  • количество копий (1, 2 и т. д.),
  • ориентация (портрет или пейзаж)
  • хромкость (монохромный, цветной)
  • качество (черновик, нормальный, высокий)
  • стороны (односторонние, двухсторонние и т. д.)
  • и так далее...

Прежде чем выбрать один из них и какое значение у каждого будет иметь, сначала нам нужно создать набор атрибутов:

PrintRequestAttributeSet pras = new HashPrintRequestAttributeSet();

Теперь мы можем добавить их. Вот некоторые примеры:

pras.add(new Copies(5));
pras.add(MediaSize.ISO_A4);
pras.add(OrientationRequested.PORTRAIT);
pras.add(PrintQuality.NORMAL);

Объект pras теперь можно отправить на запрос задания на печать (см. « Создание задания печати из службы печати» ).

Прослушивание статуса запроса на печать

Для большинства клиентов печати чрезвычайно полезно знать, закончилось или не выполнено задание на печать.

API службы печати Java предоставляет некоторые функции для получения информации об этих сценариях. Все, что нам нужно сделать, это:

  • обеспечить реализацию интерфейса 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 pje

Обратите внимание, что каждый метод имеет аргумент PrintJobEvent pje . Мы не используем его в этом примере для простоты, но вы можете использовать его для изучения состояния. Например:

pje.getPrintJob().getAttributes();

PrintJobAttributeSet экземпляр объекта 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);


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow