Printable
, описаный выше, вполне подходит для печати многостраничных документов, так как
методу print()
передается в качестве аргумента номер страницы, которую собирается печатать принтер.
При этом, в зависимости от номера печатаемой страницы можно формировать на графическом контексте принтера различное изображение.
Однако все печатаемые страницы будут иметь одинаковый размер, поля и ориентацию, в соответствии с настройками формата страницы
хранящимися в объекте типа PageFormat
. Для многостраничных документов это не всегда удобно.
Кроме того, иногда при печати может возникнуть задача пропустить при выводе на принтер ту или иную страницу.
В вышеописаном подходе это невозможно, так как при этом завершается и сам процесс печати.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
.