Spec-Zone .ru
спецификации, руководства, описания, API
|
Содержание | Предыдущий | Затем |
Java, Печатающий API, включает приложениям к:
Не все эти функции поддерживаются в Java™ 2 API Печати SDK и реализация. API будет расширен, чтобы поддерживать все эти функции в будущих выпусках. Например, дополнительные средства управления принтером будут добавлены, увеличивая набор именованных свойств задания печати, которым может управлять приложение.
API Печати Java основан на модели печати обратного вызова, в которой система печати, не приложение, управляет, когда страницы печатаются. Приложение предоставляет информацию о документе, который будет напечатан, и система печати просит, чтобы приложение представило каждую страницу, поскольку это нуждается в них.
Система печати могла бы запросить, чтобы определенная страница была представлена не раз или запросила, чтобы страницы были представлены не в порядке. Приложение должно быть в состоянии генерировать надлежащее изображение страницы, независимо от того которые листают системные запросы печати. В этом отношении система печати подобна инструментарию окна, который может запросить компоненты перекрасить в любое время в любом порядке.
Модель печати обратного вызова более гибка чем традиционные управляемые приложением модели печати и поддерживает печать на более широком диапазоне систем и принтеров. Например, если принтер складывает выходные страницы в обратном порядке, система печати может попросить, чтобы приложение генерировало страницы в обратном порядке так, чтобы заключительный стек был в надлежащем порядке чтения.
Эта модель также позволяет приложениям напечатать к растровому принтеру от компьютеров, у которых нет достаточного количества места в памяти или дискового пространства, чтобы буферизовать полностраничный битовый массив. В этой ситуации страница печатается как серия маленьких битовых массивов или полос. Например, если только достаточно памяти, чтобы буферизовать одну десятую страницы доступно, страница делится на десять полос. Система печати просит, чтобы приложение представило каждую страницу десять раз, однажды заполнить каждую полосу. Приложение не должно знать о числе или размере полос; это просто должно быть в состоянии представить каждую страницу когда требующийся.
Приложение должно выполнить две задачи поддерживать печать:
Пользователь часто инициирует печать, нажимая кнопку или выбирая пункт меню в приложении. Когда работа печати инициирована пользователем, приложение создает a PrinterJob
объект и использование это, чтобы управлять процессом печати.
Приложение ответственно за установку задания печати, выводя на экран диалоговые окна печати пользователю, и запуская процесс печати.
Когда документ печатается, приложение должно представить каждую страницу, когда система печати запрашивает это. Чтобы поддерживать этот механизм, приложение предоставляет живописцу страницы, который реализует Printable
интерфейс. Когда система печати нуждается в представленной странице, она вызывает живописца страницы print
метод.
Когда живописец страницы print
метод вызывают, его передают a Graphics
контекст, чтобы использовать, чтобы представить изображение страницы. Это также передают a PageFormat
объект, который определяет геометрическое расположение страницы, и целочисленный индекс страницы, который идентифицирует порядковую позицию страницы на задании печати.
Система печати поддерживает обоих Graphics
и Graphics2D
рендеринг, Чтобы напечатать Java 2D™ Shapes
, Text
, и Images
, Вы бросаете Graphics
объект, который передают в print
метод к a Graphics2D
.
Чтобы напечатать документы, в которых страницы используют различных живописцев страницы и имеют различные форматы, Вы используете листаемое задание. Чтобы создать листаемое задание, можно использовать Book
класс или Ваша собственная реализация Pageable
интерфейс. Чтобы реализовать простые операции печати, Вы не должны использовать листаемое задание печати; Printable
может использоваться, пока все страницы совместно используют тот же самый формат страницы и живописца.
Основное задание живописца страницы должно представить страницу, используя графический контекст, который обеспечивается системой печати. Живописец страницы реализует Printable
.print
метод:
Графический контекст, который передают к print
метод является любой экземпляром Graphics
или Graphics2D
, В зависимости от пакетов, загруженных в Вашей виртуальной машине Java. Использовать Graphics2D
функции, можно бросить Graphics
возразите против a Graphics2D
. Graphics
экземпляр, к которому передают print
также реализации PrinterGraphics
интерфейс.
PageFormat
переданный к a Printable
описывает геометрию напечатанной страницы. Система координат графического контекста, к которому передают print
фиксируется к странице: источник системы координат в левом верхнем углу бумаги, X увеличений направо, Y увеличивается вниз, и модули являются дюймом 1/72. Если страница находится в портретной ориентации, ось X выравнивается с "шириной" бумаги, в то время как ось Y выравнивается с "высотой" бумаги. (Обычно, но не всегда, высота бумаги превышает свою ширину.), Если страница находится в альбомной ориентации, роли инвертируются: ось X выравнивается с "высотой" бумаги и осью Y с ее "шириной".
Поскольку много принтеров не могут напечатать на всей бумажной поверхности, PageFormat
определяет вызывающую мысленный образ область страницы: это - часть страницы, в которой безопасно представить. Спецификация вызывающей мысленный образ области не изменяет систему координат; это обеспечивается так, чтобы содержание страницы могло быть представлено так, чтобы они не расширились в область, где принтер не может напечатать.
Графический контекст, к которому передают print
имеет область клипа, которая описывает часть вызывающей мысленный образ области, которая должна быть оттянута. Всегда безопасно вовлечь всю страницу в контекст; система печати обработает необходимое отсечение. Однако, чтобы устранить издержки рисования частей страницы, которая не будет напечатана, можно использовать область отсечения, чтобы ограничить области, которые Вы представляете. Чтобы получить область отсечения от графического контекста, вызвать Graphics.getClip
. Вы строго поощряетесь использовать область клипа, чтобы уменьшить издержки рендеринга.
Это является иногда требуемым, чтобы запустить всю работу печати "в фоновом режиме" так, чтобы пользователь мог продолжать взаимодействовать с приложением, в то время как страницы представляются. Чтобы сделать это, вызвать PrinterJob.print
в отдельном потоке.
Если возможный, следует избежать графических операций, которые требуют знания предыдущего содержания изображения, такой как copyArea
, setXOR
, и составление композита. Эти операции могут замедлить рендеринг, и результаты могли бы быть непоследовательными.
A Printable
задание обеспечивает самый простой способ напечатать. Живописец на только одну страницу используется; приложение обеспечивает единый класс, который реализует Printable
интерфейс. Когда пора напечатать, системные вызовы печати живописец страницы print
метод, чтобы представить каждую страницу. Страницы требуют в порядке, запускающемся с индекса 0 страницы. Однако, живописца страницы можно было бы попросить представить каждую страницу несколько раз прежде, чем она будет совершенствоваться к следующей странице. Когда последняя страница была напечатана, метод печати живописца страницы возвращает NO_SUCH_PAGE.
В a Printable
задание:
PageFormat
. Если диалоговое окно печати будет представлено, то оно не будет выводить на экран число страниц в документе, потому что та информация не доступна системе печати.A Pageable
задание более гибко чем a Printable
задание. В отличие от страниц в a Printable
задание, страницы в a Pageable
задание может отличаться по расположению и реализации. Управлять a Pageable
задание, можно использовать Book
класс или реализация Ваше собственное Pageable
класс. Через Pageable
, система печати может определить число страниц, чтобы напечатать, живописец страницы, чтобы использовать для каждой страницы, и PageFormat
использовать для каждой страницы. Приложения, которые должны напечатать документы, у которых есть запланированная структура и формат, должны использовать Pageable
задания.
В a Pageable
задание:
PageFormats
.Pageable
задания не должны знать заранее, сколько страниц находится в документе. Однако, в отличие от этого Printable
задания, они должны быть в состоянии представить страницы в любом порядке. Могли бы быть разрывы в упорядочивании, и система печати могла бы запросить, чтобы страница была представлена многократно прежде, чем переместиться в следующую страницу. Например, запрос, чтобы напечатать страницы 2 и 3 документа мог бы привести к последовательности вызовов, которые запрашивают страницы с индексами 2,2,1,1, и 1.Приложение держится PrinterJob
объект через последовательность шагов, чтобы завершить задание печати. Самая простая последовательность, используемая приложением:
PrinterJob
объект, вызывая PrinterJob.getPrinterJob
.PageFormat
использовать для того, чтобы напечатать. Значение по умолчанию PageFormat
может быть получен, вызывая defaultPage
или можно вызвать pageDialog
представить диалоговое окно, которое позволяет пользователю определять формат.PrinterJob
. Для a Printable
задание, вызвать setPrintable
; для a Pageable
задание, вызвать setPageable
. Отметьте это a Book
объект идеален для того, чтобы передать к setPageable
.printDialog
представить диалоговое окно пользователю. Это является дополнительным. Содержание и появление этого диалогового окна могут измениться через различные платформы и принтеры. На большинстве платформ пользователь может использовать это диалоговое окно, чтобы изменить выбор принтера. Если пользователь отменяет задание печати, printDialog
возвраты метода FALSE
.Printerjob.print
напечатать задание. Этот метод поочередно вызывает print
на соответствующих живописцах страницы.Задание может быть прервано во время печати если:
PrinterException
бросается — исключение поймано print
метод и задание останавливаются. Живописец страницы бросает a PrinterException
если это обнаруживает фатальную ошибку.PrinterJob.cancel
вызывается — цикл печати завершается, и задание отменяется. cancel
метод можно вызвать от отдельного потока, который выводит на экран диалоговое окно и позволяет пользователю отменять печать, нажимая кнопку в поле.Страницы, сгенерированные перед заданием печати, останавливаются, мог бы или не мог бы быть напечатан.
Задание печати обычно не заканчивается когда print
возвраты метода. Работа обычно все еще делается драйвером принтера, сервером печати, или принтером непосредственно. Состояние PrinterJob
объект не мог бы отразить состояние фактического напечатанного задания.
Поскольку состояние a PrinterJob
изменения во время его жизненного цикла, это недопустимо, чтобы вызвать определенные методы в определенные времена. Например, вызов setPageable
после того, как Вы вызвали print
не имеет никакого смысла. Когда недопустимые вызовы обнаруживаются, PrinterJob
броски a java.lang.IllegalStateException
.
API Печати Java требует, чтобы приложения вызвали диалоговые окна пользовательского интерфейса явно. Эти диалоговые окна могли бы быть обеспечены программным обеспечением платформы (таким как Windows) или Java™ 2 реализации программного обеспечения SDK. Для интерактивных приложений это общепринято, чтобы использовать такие диалоговые окна. Для производственных приложений печати, однако, диалоговые окна не необходимы. Например, Вы не хотели бы выводить на экран диалоговое окно, автоматически генерируя и печатая ночной отчет базы данных. Задание печати, которое не требует никакого взаимодействия с пользователем, иногда вызывают тихим заданием печати.
Можно позволить пользователю изменять информацию об установке страницы, содержавшуюся в a PageFormat
выводя на экран страницу устанавливают диалоговое окно. Чтобы вывести на экран страницу устанавливают диалоговое окно, Вы вызываете PrinterJob.pageDialog
. Диалоговое окно установки страницы инициализируется, используя параметр, к которому передают pageDialog
. Если пользователь щелкает по кнопке OK в диалоговом окне, PageFormat
экземпляр клонируется, изменяется, чтобы отразить выборы пользователя, и затем возвращается. Если пользователь отменяет диалоговое окно, pageDialog
возвращает неизменный оригинал PageFormat
.
Как правило, приложение представляет диалоговое окно печати пользователю, когда пункт меню печати или кнопка активируются. Чтобы вывести на экран это диалоговое окно печати, Вы вызываете PrinterJob’s printDialog
метод. Варианты пользователя в диалоговом окне ограничиваются основанные на числе и формате страниц в Printable
или Pageable
это было оснащено к PrinterJob
. Если пользователь нажимает OK в диалоговом окне печати, printDialog
возвраты TRUE
. Если пользователь отменяет диалоговое окно печати, FALSE
возвращается и задание печати нужно считать отказавшимся.
Оказывать основную поддержку печати:
Printable
интерфейс, чтобы предоставить живописцу страницы, который может представить каждую страницу, которая будет напечатана.PrinterJob
.setPrintable
сказать PrinterJob
как напечатать Ваш документ.print
на PrinterJob
возразите, чтобы запустить задание.В следующем примере, a Printable
задание используется, чтобы напечатать пять страниц, каждые из которых выводят на экран зеленый номер страницы. Управлением заданиями управляют в main
метод, который получает и управляет PrinterJob
. Рендеринг выполняется в живописце страницы print
метод.
import java.awt.*; import java.awt.print.*; public class SimplePrint implements Printable { private static Font fnt = new Font("Helvetica",Font.PLAIN,24); public static void main(String[] args) { // Get a PrinterJob PrinterJob job = PrinterJob.getPrinterJob(); // Specify the Printable is an instance of SimplePrint job.setPrintable(new SimplePrint()); // Put up the dialog box if (job.printDialog()) { // Print the job if the user didn't cancel printing try { job.print(); } catch (Exception e) { /* handle exception */ } } System.exit(0); } public int print(Graphics g, PageFormat pf, int pageIndex) throws PrinterException { // pageIndex 0 to 4 corresponds to page numbers 1 to 5. if (pageIndex >= 5) return Printable.NO_SUCH_PAGE; g.setFont(fnt); g.setColor(Color.green); g.drawString("Page " + (pageIndex+1), 100, 100); return Printable.PAGE_EXISTS; } }
Можно вызвать Graphics2D
функции в Вас метод печати живописца страницы первым кастингом Graphics
контекст к a Graphics2D
.
В следующем примере номера страниц представляются, используя красно-зеленый градиент. Сделать это, a GradientPaint
устанавливается в Graphics2D
контекст.
import java.awt.*; import java.awt.print.*; public class SimplePrint2D implements Printable { private static Font fnt = new Font("Helvetica",Font.PLAIN,24); private Paint pnt = new GradientPaint(100f, 100f, Color.red, 136f, 100f, Color.green, true); public static void main(String[] args) { // Get a PrinterJob PrinterJob job = PrinterJob.getPrinterJob(); // Specify the Printable is an instance of SimplePrint2D job.setPrintable(new SimplePrint2D()); // Put up the dialog box if (job.printDialog()) { // Print the job if the user didn't cancel printing try { job.print(); } catch (Exception e) { /* handle exception */ } } System.exit(0); } public int print(Graphics g, PageFormat pf, int pageIndex) throws PrinterException { // pageIndex 0 to 4 corresponds to page numbers 1 to 5. if (pageIndex >= 5) return Printable.NO_SUCH_PAGE; Graphics2D g2 = (Graphics2D) g; // Use the font defined above g2.setFont(fnt); // Use the gradient color defined above g2.setPaint(pnt); g2.drawString("Page " + (pageIndex+1), 100f, 100f); return Printable.PAGE_EXISTS; } }
Когда метод печати живописца страницы вызывается несколько раз для той же самой страницы, он должен генерировать тот же самый вывод каждый раз.
Есть много способов гарантировать, что повторные запросы, чтобы представить страницу приводят к тому же самому выводу. Например, чтобы гарантировать, что тот же самый вывод сгенерирован каждый раз, когда система печати запрашивает определенную страницу текстового файла, живописец страницы мог или сохранить и указатели файла повторного использования для каждой страницы или хранить фактические данные страницы.
В следующем примере печатается "перечисление" текстового файла. Имя файла передают как параметр main
метод. PrintListingPainter
класс хранит указатель файла в действительности в начале каждой новой страницы, которую просят представить. Когда та же самая страница представляется снова, указатель файла сбрасывается к помнившей позиции.
import java.awt.*; import java.awt.print.*; import java.io.*; public class PrintListing { public static void main(String[] args) { // Get a PrinterJob PrinterJob job = PrinterJob.getPrinterJob(); // Ask user for page format (e.g., portrait/landscape) PageFormat pf = job.pageDialog(job.defaultPage()); // Specify the Printable is an instance of // PrintListingPainter; also provide given PageFormat job.setPrintable(new PrintListingPainter(args[0]), pf); // Print 1 copy job.setCopies(1); // Put up the dialog box if (job.printDialog()) { // Print the job if the user didn't cancel printing try { job.print(); } catch (Exception e) { /* handle exception */ } } System.exit(0); } } class PrintListingPainter implements Printable { private RandomAccessFile raf; private String fileName; private Font fnt = new Font("Helvetica", Font.PLAIN, 10); private int rememberedPageIndex = -1; private long rememberedFilePointer = -1; private boolean rememberedEOF = false; public PrintListingPainter(String file) { fileName = file; try { // Open file raf = new RandomAccessFile(file, "r"); } catch (Exception e) { rememberedEOF = true; } } public int print(Graphics g, PageFormat pf, int pageIndex) throws PrinterException { try { // For catching IOException if (pageIndex != rememberedPageIndex) { // First time we've visited this page rememberedPageIndex = pageIndex; // If encountered EOF on previous page, done if (rememberedEOF) return Printable.NO_SUCH_PAGE; // Save current position in input file rememberedFilePointer = raf.getFilePointer(); } else raf.seek(rememberedFilePointer); g.setColor(Color.black); g.setFont(fnt); int x = (int) pf.getImageableX() + 10; int y = (int) pf.getImageableY() + 12; // Title line g.drawString("File: " + fileName + ", page: " + (pageIndex+1), x, y); // Generate as many lines as will fit in imageable area y += 36; while (y + 12 < pf.getImageableY()+pf.getImageableHeight()) { String line = raf.readLine(); if (line == null) { rememberedEOF = true; break; } g.drawString(line, x, y); y += 12; } return Printable.PAGE_EXISTS; } catch (Exception e) { return Printable.NO_SUCH_PAGE;} } }
Pageable
задания подходят для приложений, которые создают явное представление документа, постранично. Book
класс является удобным способом использовать Pageables
, но можно также создать свое собственное Pageable
структуры, если Book
не удовлетворяет Вашим потребностям. Этот раздел показывает Вам, как использовать Book
.
Хотя немного более включенный, Pageable
задания предпочитаются Printable
задания, потому что у системы печати есть больше гибкости. Главное преимущество Pageables
это, число страниц в документе обычно известно и может быть выведено на экран пользователю в диалоговом окне печати. Это помогает пользователю подтвердить, что задание определяется правильно или выбрать диапазон страниц для того, чтобы напечатать.
A Book
представляет набор страниц. Страницы в книге не должны совместно использовать тот же самый размер, ориентацию, или живописца страницы. Например, a Book
мог бы содержать две страницы размера буквы в портретной ориентации и страницу размера буквы в альбомной ориентации.
Когда a Book
сначала создается, это пусто. Добавить страницы к a Book
, Вы используете append
метод. Этот метод берет a PageFormat
объект, который определяет размер страницы, печатаемую область, и ориентацию и живописца страницы, который реализует Printable
интерфейс.
Многократные страницы в a Book
может совместно использовать тот же самый формат страницы и живописца. append
метод перегружается, чтобы позволить Вам добавить серию страниц, у которых есть те же самые атрибуты, определяя третий параметр, число страниц.
Если Вы не знаете общее количество страниц в a Book
, можно передать UNKNOWN_NUMBER_OF_PAGES
к append
метод. Система печати тогда вызовет Ваших живописцев страницы в порядке увеличивающегося индекса страницы до одного из них возвраты NO_SUCH_PAGE
.
setPage
метод может использоваться, чтобы изменить формат страницы страницы или живописца. Страница, которая будет изменена, идентифицируется индексом страницы, который указывает на расположение страницы в Book
.
Вы вызываете setPageable
и передача в Book
подготовить задание печати. setPageable
и setPrintable
методы являются взаимоисключающими; то есть, следует вызвать один или другой, но не оба, готовясь PrinterJob
.
В следующем примере, a Book
используется, чтобы воспроизвести первый простой пример печати. (Поскольку этот случай настолько прост, есть небольшое преимущество в использовании a Pageable
задание вместо a Printable
задание, но это иллюстрирует основы использования a Book
.) Отмечают, что все еще необходимо реализовать Printable
соедините интерфейсом и выполните рендеринг страницы в живописце страницы print
метод.
import java.awt.*; import java.awt.print.*; public class SimplePrintBook implements Printable { private static Font fnt = new Font("Helvetica",Font.PLAIN,24); public static void main(String[] args) { // Get a PrinterJob PrinterJob job = PrinterJob.getPrinterJob(); // Set up a book Book bk = new Book(); bk.append(new SimplePrintBook(), job.defaultPage(), 5); // Pass the book to the PrinterJob job.setPageable(bk); // Put up the dialog box if (job.printDialog()) { // Print the job if the user didn't cancel printing try { job.print(); } catch (Exception e) { /* handle exception */ } } System.exit(0); } public int print(Graphics g, PageFormat pf, int pageIndex) throws PrinterException { g.setFont(fnt); g.setColor(Color.green); g.drawString("Page " + (pageIndex+1), 100, 100); return Printable.PAGE_EXISTS; } }
В следующем примере используются два различных живописца страницы: один для титульного листа и один для страниц контента. Титульный лист печатается в альбомном режиме, и страницы содержания печатаются в режиме портрета.
import java.awt.*; import java.awt.print.*; public class PrintBook { public static void main(String[] args) { // Get a PrinterJob PrinterJob job = PrinterJob.getPrinterJob(); // Create a landscape page format PageFormat pfl = job.defaultPage(); pfl.setOrientation(PageFormat.LANDSCAPE); // Set up a book Book bk = new Book(); bk.append(new PaintCover(), pfl); bk.append(new PaintContent(), job.defaultPage(), 2); // Pass the book to the PrinterJob job.setPageable(bk); // Put up the dialog box if (job.printDialog()) { // Print the job if the user didn't cancel printing try { job.print(); } catch (Exception e) { /* handle exception */ } } System.exit(0); } } class PaintCover implements Printable { Font fnt = new Font("Helvetica-Bold", Font.PLAIN, 72); public int print(Graphics g, PageFormat pf, int pageIndex) throws PrinterException { g.setFont(fnt); g.setColor(Color.black); int yc = (int) (pf.getImageableY() + pf.getImageableHeight()/2); g.drawString("Widgets, Inc.", 72, yc+36); return Printable.PAGE_EXISTS; } } class PaintContent implements Printable { public int print(Graphics g, PageFormat pf, int pageIndex) throws PrinterException { Graphics2D g2 = (Graphics2D) g; int useRed = 0; int xo = (int) pf.getImageableX(); int yo = (int) pf.getImageableY(); // Fill page with circles or squares, alternating red & green for (int x = 0; x+28 < pf.getImageableWidth(); x += 36) for (int y = 0; y+28 < pf.getImageableHeight(); y += 36) { if (useRed == 0) g.setColor(Color.red); else g.setColor(Color.green); useRed = 1 - useRed; if (pageIndex % 2 == 0) g.drawRect(xo+x+4, yo+y+4, 28, 28); else g.drawOval(xo+x+4, yo+y+4, 28, 28); } return Printable.PAGE_EXISTS; } }
Содержание | Предыдущий | Затем |