Esse artigo faz parte da revista Java Magazine edição 27. Clique aqui para ler todos os artigos desta edição

Atenção: por essa edição ser muito antiga não há arquivo PDF para download.Os artigos dessa edição estão disponíveis somente através do formato HTML. 

Impressão com Java

Java Printing API e Java Print Service

Uma visão geral das duas APIs de impressão do J2SE, com exemplos práticos de utilização

 

Em Java, o acesso a recursos de impressão pode ser feito não por uma mas por duas APIs: a Java. 2D Printing API ("Printing API") e a Java PrintService (JPS). Embora tenha inicialmente sido alvo de críticas devido às constantes mudanças desde a primeira versão, a Printing API tem hoje um bom grau de maturidade,

e é complementada pelas facilidades da JPS para realizar tarefas como localizar e selecionar impressoras, imprimir arquivos fechados (PDF, RTF etc.) e definir

atributos de impressão.

Este artigo apresenta uma visão geral dos recursos das duas APIs e ilustra os seus modos de uso mais comuns.

 

Conceitos da Printing API

A Printing API utiliza o mecanismo de desenho do Java 2D. Por meio de um objeto Graphics2D, a aplicação renderiza o conteúdo a ser impresso da mesma forma que faria para gerar desenhos, ou componentes visuais na tela.

Para realizar a impressão com a Printing API, devemos cumprir quatro etapas:

  1. Criar uma tarefa de impressão, representada por um objeto PrinterJob.
  2. Definir o conteúdo a ser impresso através dos métodos setPrintable() ou setPageable() do PrinterJob.
  3. Opcionalmente, exibir um diálogo de configuração de impressão.
  4. Iniciar o processo de impressão chamando o método print() do objeto PrinterJob.

 

A Tabela 1 resume os elementos da Printing API.

Para que um objeto possa ser impresso, a sua classe deve implementar a interface Printable ou Pageable. Printable define um método print() semelhante ao paint() de componentes gráficos do Swing/AWT. Chamadas a este método são feitas pelo PrinterJob, à medida que o sistema operacional solicita a impressão de páginas.

 

Páginas simples com Printable

Para a impressão de conteúdos simples, como documentos com uma única página ou com páginas sem variações de layout (tamanho de papel, orientação etc.) podem ser usados objetos Printable.

Quando requisitado para imprimir um objeto Printable, o sistema de impressão

faz chamadas sucessivas ao método print() desse objeto, informando o índice da

página a ser impressa (que começa em zero). Um objeto Printable pode ser usado

para imprimir um número arbitrário de páginas.

Veja um exemplo que imprime apenas uma página na Listagem 1. Note

que depois de ser impressa a primeira página, print() retorna uma constante Printable.NO_SUCH_PAGE informando ao PrinterJob que não existem páginas subseqüentes, e permitindo que seja encerrada a impressão.

A Printing API também possibilita exibir um diálogo de impressão para o usuário; como a seguir:

 

PrinterJob job = PrinterJob.getPrinterJob();

PageFormat pf =job.pageDialog(job.defaultPage());

 

As preferências selecionadas são armazenadas num objeto PageFormat,que pode

então ser associado aos objetos Printable (ou Pageable) a serem impressos.

 

Listagem 1. Imprimindo um objeto Printable

 

package jm.impressao;

 

import java.awt.*;

import java.awt.geom.*;

import java.awt.print.*;

 

public class ExemploPrintable {

public ExemploPrintable() {

// Obté uma tarefa de impressão

PrinterJob job = PrinterJob.getPrinterJob();

// Define o objeto a ser impresso

job.setPrintable(new Desenho());

// Exibe o dialogo de config. de impressão

if (job.printDialog()) {

try {

job.print(); //Imprime 0 objeto printable

}

catch (PrinterException e) { /* ... */}

}

}

 

public static void main(String[] args) {

new ExemploPrintable();

}

}

 

// Definição de uma classe 'printable'

class Desenho implements Printable {

public int print(Graphics graphics. PageFormat format. int pageIndex)

throws PrinterException

{

if (pageIndex > 0) {

return Printable.NO_SUCH_PAGE;

}

else {

// Desenha um retângulo na pagina

Graphics2D g2d = (Graphics2D) graphics;

...

Quer ler esse conteúdo completo? Tenha acesso completo