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:
- Criar uma tarefa de impressão, representada por um objeto PrinterJob.
- Definir o conteúdo a ser impresso através dos métodos setPrintable() ou setPageable() do PrinterJob.
- Opcionalmente, exibir um diálogo de configuração de impressão.
- 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;
...