Spec-Zone .ru
спецификации, руководства, описания, API
Содержание документации
Содержание | Предыдущий | Затем

  Глава 7

Печать

Java, Печатающий API, включает приложениям к:

Не все эти функции поддерживаются в Java™ 2 API Печати SDK и реализация. API будет расширен, чтобы поддерживать все эти функции в будущих выпусках. Например, дополнительные средства управления принтером будут добавлены, увеличивая набор именованных свойств задания печати, которым может управлять приложение.

7.1 Интерфейсы и Классы

Интерфейс
Описание
Printable
Printable интерфейс реализуется каждым живописцем страницы, класс (ы) приложений, вызванный системой печати, чтобы представить страницу. Системные вызовы живописец страницы print метод, чтобы запросить, что страницу быть представленным.
Pageable
Pageable интерфейс реализуется документом, который должен быть напечатан системой печати. Через Pageable методы, система может определить число страниц в документе, формат, чтобы использовать для каждой страницы, и живописца страницы, чтобы использовать, чтобы представить каждую страницу.
PrinterGraphics
Graphics2D объекты, которые живописец страницы использует, чтобы представить реализацию страницы PrinterGraphics интерфейс. Это позволяет приложению добраться PrinterJob объект, который управляет печатью.
Класс
Описание
Book
Реализации: Pageable
Представляет документ, в котором у страниц могут быть различные форматы страницы и живописцы страницы. Этот класс использует Pageable интерфейс, чтобы взаимодействовать с a PrinterJob.
PageFormat
Описывает размер и ориентацию страницы, которая будет напечатана, так же как Paper используемый, чтобы напечатать это. Например, портрет и альбомные бумажные ориентации представляются PageFormat.
Paper
Описывает физические характеристики листка бумаги.
PrinterJob
Основной класс, который управляет печатью. Вызовы приложения PrinterJob методы, чтобы установить задание, выведите на экран диалоговое окно печати (дополнительному) пользователю, и напечатать страницы на задании.

7.2 Печать Понятий

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

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

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

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

7.2.1 Поддержка Печати

Приложение должно выполнить две задачи поддерживать печать:

7.2.1.1 Управление заданиями

Пользователь часто инициирует печать, нажимая кнопку или выбирая пункт меню в приложении. Когда работа печати инициирована пользователем, приложение создает a PrinterJob объект и использование это, чтобы управлять процессом печати.

Приложение ответственно за установку задания печати, выводя на экран диалоговые окна печати пользователю, и запуская процесс печати.

7.2.1.2 Обработка изображений

Когда документ печатается, приложение должно представить каждую страницу, когда система печати запрашивает это. Чтобы поддерживать этот механизм, приложение предоставляет живописцу страницы, который реализует Printable интерфейс. Когда система печати нуждается в представленной странице, она вызывает живописца страницы print метод.

Когда живописец страницы print метод вызывают, его передают a Graphics контекст, чтобы использовать, чтобы представить изображение страницы. Это также передают a PageFormat объект, который определяет геометрическое расположение страницы, и целочисленный индекс страницы, который идентифицирует порядковую позицию страницы на задании печати.

Система печати поддерживает обоих Graphics и Graphics2D рендеринг, Чтобы напечатать Java 2D™ Shapes, Text, и Images, Вы бросаете Graphics объект, который передают в print метод к a Graphics2D.

Чтобы напечатать документы, в которых страницы используют различных живописцев страницы и имеют различные форматы, Вы используете листаемое задание. Чтобы создать листаемое задание, можно использовать Book класс или Ваша собственная реализация Pageable интерфейс. Чтобы реализовать простые операции печати, Вы не должны использовать листаемое задание печати; Printable может использоваться, пока все страницы совместно используют тот же самый формат страницы и живописца.

7.2.2 Живописцы страницы

Основное задание живописца страницы должно представить страницу, используя графический контекст, который обеспечивается системой печати. Живописец страницы реализует Printable.print метод:

public int print(Graphics g, PageFormat pf, int pageIndex)  

Графический контекст, который передают к 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, и составление композита. Эти операции могут замедлить рендеринг, и результаты могли бы быть непоследовательными.

7.2.3 Печатаемые Задания и Листаемые Задания

A Printable задание обеспечивает самый простой способ напечатать. Живописец на только одну страницу используется; приложение обеспечивает единый класс, который реализует Printable интерфейс. Когда пора напечатать, системные вызовы печати живописец страницы print метод, чтобы представить каждую страницу. Страницы требуют в порядке, запускающемся с индекса 0 страницы. Однако, живописца страницы можно было бы попросить представить каждую страницу несколько раз прежде, чем она будет совершенствоваться к следующей странице. Когда последняя страница была напечатана, метод печати живописца страницы возвращает NO_SUCH_PAGE.

В a Printable задание:

A Pageable задание более гибко чем a Printable задание. В отличие от страниц в a Printable задание, страницы в a Pageable задание может отличаться по расположению и реализации. Управлять a Pageable задание, можно использовать Book класс или реализация Ваше собственное Pageable класс. Через Pageable, система печати может определить число страниц, чтобы напечатать, живописец страницы, чтобы использовать для каждой страницы, и PageFormat использовать для каждой страницы. Приложения, которые должны напечатать документы, у которых есть запланированная структура и формат, должны использовать Pageable задания.

В a Pageable задание:

7.2.4 Типичный Жизненный цикл PrinterJob

Приложение держится PrinterJob объект через последовательность шагов, чтобы завершить задание печати. Самая простая последовательность, используемая приложением:

Задание может быть прервано во время печати если:

Страницы, сгенерированные перед заданием печати, останавливаются, мог бы или не мог бы быть напечатан.

Задание печати обычно не заканчивается когда print возвраты метода. Работа обычно все еще делается драйвером принтера, сервером печати, или принтером непосредственно. Состояние PrinterJob объект не мог бы отразить состояние фактического напечатанного задания.

Поскольку состояние a PrinterJob изменения во время его жизненного цикла, это недопустимо, чтобы вызвать определенные методы в определенные времена. Например, вызов setPageable после того, как Вы вызвали print не имеет никакого смысла. Когда недопустимые вызовы обнаруживаются, PrinterJob броски a java.lang.IllegalStateException.

7.2.5 Диалоговые окна

API Печати Java требует, чтобы приложения вызвали диалоговые окна пользовательского интерфейса явно. Эти диалоговые окна могли бы быть обеспечены программным обеспечением платформы (таким как Windows) или Java™ 2 реализации программного обеспечения SDK. Для интерактивных приложений это общепринято, чтобы использовать такие диалоговые окна. Для производственных приложений печати, однако, диалоговые окна не необходимы. Например, Вы не хотели бы выводить на экран диалоговое окно, автоматически генерируя и печатая ночной отчет базы данных. Задание печати, которое не требует никакого взаимодействия с пользователем, иногда вызывают тихим заданием печати.

7.2.5.1 Диалоговое окно установки страницы

Можно позволить пользователю изменять информацию об установке страницы, содержавшуюся в a PageFormat выводя на экран страницу устанавливают диалоговое окно. Чтобы вывести на экран страницу устанавливают диалоговое окно, Вы вызываете PrinterJob.pageDialog. Диалоговое окно установки страницы инициализируется, используя параметр, к которому передают pageDialog. Если пользователь щелкает по кнопке OK в диалоговом окне, PageFormat экземпляр клонируется, изменяется, чтобы отразить выборы пользователя, и затем возвращается. Если пользователь отменяет диалоговое окно, pageDialog возвращает неизменный оригинал PageFormat.

7.2.5.2 Диалоговое окно печати

Как правило, приложение представляет диалоговое окно печати пользователю, когда пункт меню печати или кнопка активируются. Чтобы вывести на экран это диалоговое окно печати, Вы вызываете PrinterJob’s printDialog метод. Варианты пользователя в диалоговом окне ограничиваются основанные на числе и формате страниц в Printable или Pageable это было оснащено к PrinterJob. Если пользователь нажимает OK в диалоговом окне печати, printDialog возвраты TRUE. Если пользователь отменяет диалоговое окно печати, FALSE возвращается и задание печати нужно считать отказавшимся.

7.3 Печать с Printables

Оказывать основную поддержку печати:

В следующем примере, 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;    
  }  
} 

7.3.1 Используя Graphics2D для Рендеринга

Можно вызвать 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;    
  }  
} 

7.3.2 Печать Файла

Когда метод печати живописца страницы вызывается несколько раз для той же самой страницы, он должен генерировать тот же самый вывод каждый раз.

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

В следующем примере печатается "перечисление" текстового файла. Имя файла передают как параметр 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;} 
  }  
} 

7.4 Печать с Pageables и Books

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.

7.4.1 Используя Листаемое Задание

В следующем примере, 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;    
  } 
} 

7.4.2 Используя Многократных Живописцев Страницы

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

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;    
  }  
} 

 


Содержание | Предыдущий | Затем

Oracle и/или его филиалы Авторское право © 1993, 2011, Oracle и/или его филиалы. Все права защищены.
Свяжитесь с Нами