5. Печать многостраничных документов с помощью Java 1.2 API
Подход к печати документов с помощью класса реализующего интерфейс
Printable
, описаный выше, вполне подходит для печати многостраничных документов, так как
методу
print()
передается в качестве аргумента номер страницы, которую собирается печатать принтер.
При этом, в зависимости от номера печатаемой страницы можно формировать на графическом контексте принтера различное изображение.
Однако все печатаемые страницы будут иметь одинаковый размер, поля и ориентацию, в соответствии с настройками формата страницы
хранящимися в объекте типа
PageFormat
. Для многостраничных документов это не всегда удобно.
Кроме того, иногда при печати может возникнуть задача пропустить при выводе на принтер ту или иную страницу.
В вышеописаном подходе это невозможно, так как при этом завершается и сам процесс печати.
Для решения задач связаных с печатью многостраничных документов в Java 1.2 API существует специальный класс
java.awt.print.Book
,
реализующий интерфейс
java.awt.print.Pageable
.
Использование этого класса позволяет создавать многостраничные документы, в которых формат листа определяется отдельно для каждой страницы,
и также отдельно задается класс "отрисовщик" страницы, т. е. класс реализующий интерфейс
Printable
и формирующий в методе
print()
изображение, выводимое
на принтер при печати соответствующей страницы.
Формирование многостраничного документа начинается с создания объекта типа
Book
, который образует "пустой" документ - документ без страниц.
Затем к этому документу добавляются страницы при помощи метода
public void append(Printable painter,PageFormat page)
класса
Book
.
Этот метод добавляет в конец "книги" новую страницу - объект типа
Printable
.
Причем для каждой добавляемой страницы указывается формат страницы (размер и ориентация области печати), с помощью объекта типа
PageFormat
.
После того как книга сформирована в нее можно внести изменения заменив любую из существующих в книге страниц, указав ее номер (нумерация страниц ведется от 0).
Для внесения изменений в сформированную книгу используется метод
public void setPage(int pageIndex,Printable painter,PageFormat page)
класса
Book
.
Распечатывать сформированную книгу надо с помощью класса
PrinterJob
, при этом выполняется следующая последовательность действий:
- К существующему объекту типа
PrinterJob
с помощью метода public void setPageable(Pageable document)
добавляется объект типа Book, представляющий собой заранее подготовленный многостраничный документ;
- Документ распечатывается с помощью метода
print()
класса PrinterJob
.
Ниже представлен пример кода, реализующего печать многостраничного документа:
PrinterJob printerJob=PrinterJob.getPrinterJob();
Book book=new Book();
book.append(объект типа Printable,объект типа PageFormat);
...
book.append(объект типа Printable,объект типа PageFormat);
/*
при необходимости можно добавить
несколько однотипных страниц
*/
book.append(объект типа Printable,
объект типа PageFormat,
количество однотипных страниц);
printerJob.setPageable(book);
try {
printerJob.print();
}catch(PrinterException e){
...
}
В вышеприведенном коде есть пример использования метода
append()
для добавления нескольких однотипных страниц,
формируемых с помощью объекта типа
Printable
. При этом при вызове метода
append()
указывается сколько именно страниц добавляется
таким образом в книгу. В случае, если программисту заранее не известно количество добавляемых в книгу страниц, например объект
типа
Printable
читает данные из текстового файла, можно указать в качестве количества специально предусмотренную для этого случая
константу
Pagable.UNKNOWN_NUMBER_OF_PAGES
.