на главную обучение сертификация статьи литература ссылки гостевая книга
  Список статей Оглавление Текст статьи  

Печать документов на принтере в Java

Автор:Качалов Михаил Викторович
Создан:07.05.2002


2. Простой способ печати

    Печать на принтере в Java 1.0 API была возможна для любого наследника от класса java.awt.Component. Для этого в классе Component был предусмотрен специальный метод public void print(Graphics g) предназначенный для печати внешнего вида компонента. При этом, что именно будет выводиться печать программист должен описать самостоятельно, переопределив этот метод. Переопределение метода print() очень похоже на переопределение метода public void paint(Graphics g), использующегося для отрисовки внешнего вида компонента на экране. В обоих методах используется понятие графического контекста, только в одном случае это контекст принтера, а в другом экрана.

   Для того чтобы воспользоваться методом print(), необходимо создать класс наследник от класса Component или одного из его наследников (обычно используется создание наследников от класса java.awt.Frame) и преопределить унаследованный метод print(), описав внутри него действия по "рисованию" на графическом контексте принтера, получаемом в качестве аргумента в методе print(). При этом компонент как бы "отрисовывается", но не на экране, а на принтере. Для "рисования" компонента на принтере необходимо использовать методы класса java.awt.Graphics, ссылку на экземпляр которого метод print() получает как аргумент. Единственным отличием такой отрисовки компонента на принтере от отрисовки его на экране является то, что метод print() получает в качестве аргумента ссылку на графический контекст принтера, а не экрана.

   Обычно печать осуществляется явным вызовом метода print() распечатываемого компонента (например окна). В этом случае необходимо передать методу print() ссылку на графический контекст принтера, также явным образом. Для получения ссылки на графический контекст принтера необходимо проделать следующие действия:
  1. Получить ссылку на объект типа java.awt.Toolkit
  2. Получить ссылку на объект типа java.awt.PrintJob, связывающий Java-приложение с системным принтером, установленым по умолчанию.
  3. Получить ссылку на графический контекст принтера.
Эти действия могут выглядеть следующим образом:
	Toolkit toolkit=Toolkit.getDefaultToolkit();
	PrintJob printJob=toolkit.getPrintJob(...);
	Graphics graphics=printJob.getGraphics();
   Метод public PrintJob getPrintJob(Frame, String, Properties) класса Toolkit предназначен для получения ссылки на системный принтер установленный по умолчанию. При вызове этого метода запускается стандартное для ОС диалоговое окно принтера.

Диалоговое окно (ОС Windows 98)

Методу getPrintJob() передаются в качестве аргументов:
  • ссылка на окно (объект экземпляр класса java.awt.Frame или его наследника), породившее принтерный диалог (т. е. печать на принтере таким способом возможна только из предварительно созданного окна!)

  • текстовое обозначение задания принтера (появлется в списке заданий принтера на печать). Этот аргумент может принимать значение null, что эквивалентно имени задания: ""

  • дополнительные параметры для принтера (список этих параметров заранее неизвестен и зависит от принтера) в виде объекта типа java.util.Prperties. В качестве значения этого аргумента допускается использование значения null.
   При вызове этого метода предварительно проверяется имеет ли приложение права доступа к принтеру. Такая проверка выполняется менеджером безопасности (security manager) с помощью метода checkPrintJobAccess. В случае ограничения доступа к системным ресурсам, например в апплете, возникает исключительная ситуация типа java.lang.SecurityException.
   У появившегося диалогового окна имеются кнопки для подтверждения печати и ее отмены. В случае отмены метод getPrintJob() вернет значение null, а вслучае подтверждения печати вернет ссылку на объект типа PrintJob. После получения ссылки на объект типа PrintJob, связывающий приложение с системным принтером, необходимо использовать метод public Graphics getGraphics() класса PrintJob, возвращающий ссылку на графический контекст принтера. Этот графический контекст можно использовать также, как и графический контекст экрана, для формирования изображения выводимого на печать, при этом можно использовать все методы класса java.awt.Graphics применяемые для рисования (например: drawString(), drawImage(), drawRect(), setFont(), setColor() и т. д.).
   В момент получения ссылки на графический контекст принтера операционная система производит постановку задания на печать в очередь печати (при этом сама печать еще не начинается!).

Окно очереди на печать (ОС Windows 98)

   Для того, чтобы сформированное на графическом контексте принтера изображение могло действительно отпечататься необходимо вызвать метод public void end() класса PrintJob, в результате чего завершается работа с принтером, освобождаются все ресурсы, связанные с принтером и происходит печать подготовленного изображения на принтере.

Такие действия могут выглядеть следующим образом:
	graphics.drawString("Test printing in Java",10,50);
	printJob.end();
   Как результат принтер отпечатает одну страницу и очистит очередь печати от этого задания.
Пример реализующий описаные выше действия: SimplePrinting.java. Полученая страница изображена ниже:

Результат печати на принтере

   Необходимо отметить, что после использования метода end() ссылка на объект типа PrintJob не уничтожается, однако воспользоваться ей для дальнейшей печати документов уже нельзя и для того, чтобы осуществить печать следующего документа необходимо повторно вызывать метод getPrintJob() класса Toolkit. Это довольно неудобно, так как в этом случае повторно появляется принтерный диалог операционной системы. Еще одно замечание к описаному примеру печати: если сформированное изображение не умещается в область печати, то не уместившаяся часть изображения обрезается.

   Таким образом этот способ печати подходит лишь для случая печати одного несложного документа, состоящего из одной страницы. Причем печать возможна лишь в графических приложениях с оконным интерфейсом.


назад оглавление дальше