HERVAL FREIRE
Em Java, o acesso aos recursos de impressão pode ser feito não por uma, mas por duas APIs
complementares: a Java 2D Printing API ("Print API") e o Java Print Service (JPS). A Print API,
teve sua primeira versão no JDK 1.1 e permite a manipulação e a impressão de textos e objetos
gráficos. A JPS, que foi introduzida mais recentemente, no J2SE 1.4, traz facilidades para interação
com filas de impressão inspirada no padrão Internet Printing Protocol (IPP).
Inicialmente alvo de críticas por parte de muitos desenvolvedores devido às suas constantes
mudanças desde a primeira versão, as APIs de impressão de Java hoje têm um bom grau de
maturidade. A facilidade de utilizar a JPS para realizar tarefas como localizar e selecionar a
impressora adequada ou imprimir arquivos fechados complementa a flexibilidade da Print API na
formatação e organização de conteúdos gráficos para impressão.
Este artigo apresenta uma visão geral dos vários recursos das duas APIs de impressão de Java, bem
como ilustrar os seus modos de utilização mais comuns.
Print API
A Print API utiliza o mecanismo de desenho do Java 2D. Através de um objeto do tipo
Graphics (ou sua subclasse, Graphics2D. A Graphics2D costuma ser mais utilizada na
manipulação de objetos geométricos e transformação de coordenadas. No restante deste artigo,
faremos referência apenas à Graphics2D), a aplicação renderiza o conteúdo a ser impresso, da
mesma forma que é feito para exibir o conteúdo em um componente visual na tela. Dessa forma,
qualquer informação que possa ser criada para visualização na tela pode também ser impressa.
Para realizar a impressão com a Print API, devemos cumprir quatro etapas:
1. Criar uma job (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 chamando print() do PrinterJob.
Para que um objeto possa ser impresso, a sua classe deve implementar a interface Printable ou
Pageable. Printable define um método de renderização print(), semelhante ao método
paint() de componentes gráficos. A chamada a print() é feita pelo PrinterJob (como um
callback), à medida que o sistema operacional solicita a impressão de páginas. A Tabela 1 resume
os elementos da API.
Páginas simples com Printable
Conteúdos simples, como documentos de uma única página ou conjuntos de páginas sem variações
de layout (tamanho de papel, orientação etc.) podem ser implementados utilizando a interface
Printable. Quando requisitado para imprimir um objeto Printable, o sistema de impressão
faz chamadas sucessivas ao método print() do objeto, informando ao objeto o índice da página a
ser impressa (que começa em zero). Assim, um objeto Printable pode imprimir um número
arbitrário de páginas.
Nada obriga a impressão a iniciar da primeira página e páginas não precisam ser
impressas em seqüência. O objeto Printable tem que ser capaz de lidar com “saltos”
na numeração de páginas, e também com páginas que sejam impressas várias vezes
seguidas, sem passar para uma página seguinte.
Conclusões
As APIs de impressão do Java evoluíram juntamente com a linguagem, ganhando recursos e
maturidade a cada release do JDK. Tratam-se de duas APIs bastante flexíveis e poderosas, que
garantem ao desenvolvedor Java um alto grau de controle sobre a impressão de documentos dos
mais variados tipos e formatos.
Links
java.sun.com/products/java-media/2D/forDevelopers/sdk12print.html
Tutorial sobre o Java 2D Printing API
java.sun.com/j2se/1.4.2/docs/guide/jps
Java Print Service User Guide
javaworld.com/javaworld/jw-10-2000/jw-1020-print.html
Printing in Java
jcp.org/en/jsr/detail?id=6
JSR-6 (Java Print Service)
w3schools.com/media/media_mimeref.asp
Sobre tipos MIME
public Livro() {
PageFormat formatoCapa = new PageFormat();
formatoCapa.setOrientation(PageFormat.PORTRAIT);
return Printable.PAGE_EXISTS;
}
return Printable.PAGE_EXISTS;
}
}
public ImagePrintExample() {
// Obtem um job de impressao
PrinterJob job = PrinterJob.getPrinterJob();
return PAGE_EXISTS;
}
linha = quebrador.nextLayout(larguraTexto);
}
} // fim dos paragrafos
return PAGE_EXISTS;
}
// Localiza todas as impressoras com suporte a impressão de PDFs e com suporte a cores
DocFlavor pdfFlavor = DocFlavor.BYTE_ARRAY.PDF;
if (showDialog) {
// exibe um dialogo de configuracoes de impressao
PrintService service = ServiceUI.printDialog(null, 320, 240,
printerServices, printer, docFlavor, printerAttributes);
if (service != null) {
DocPrintJob printJob = service.createPrintJob();
printJob.print(textDocument, printerAttributes);
}
}
else {
// Cria um job de impressão
DocPrintJob printJob = printer.createPrintJob();
try {
// Define que o printer job vai utilizar a
// impressora localizada pela JPS
job.setPrintService(service);
} catch (PrinterException e1) {
System.out.println("Erro acessando impressora: " + e1.getMessage());
}