Olá pessoal postei uma pergunta sobre PrinterJob mas ninguem se manisfestou a respeito… então gostaria de saber alguma coisa sobre impressão de relatórios em uma aplicação java… porque usando printerJob ele perde configuração… sou novo em java e gostaria de saber o que geralmente é usado para fazer impressão de relatórios…estou com uma certa urgência se alguém puder me ajudar mandando alguns exemplos e dicas agradeço muito…
muito obrigado…
Não sei se alguém por aqui já trabalhou com impressão usando PrinterJob, mas eu te recomendo dar uma lida nisso aqui:
http://www-106.ibm.com/developerworks/java/library/j-mer0322/
http://www-106.ibm.com/developerworks/java/library/j-mer0424.html
Eu uso num programa que fiz pra um jogo, pra imprimir o mapa dele.
Basicamente, eu tenho uma classe que é a responsável pelo desenho do mapa na tela. Ela implementa a interface Printable, e no método print faço algumas alterações no objeto Graphics (como alterar o tamanho para que caiba numa única página, rotacioná-lo para que seja impresso em paisagem e não em retrato, etc.).
[code]public int print(Graphics g, PageFormat format, int pageIndex) throws PrinterException {
Graphics2D g2 = (Graphics2D) g;
g2.translate(format.getImageableX(), format.getImageableY());
g2.translate(format.getImageableWidth() / 2, format.getImageableHeight() / 2);
g2.rotate(Math.toRadians(-90.0));
Dimension d = new Dimension(hexFinalX - hexInicialX, hexFinalY - hexInicialY);
double scale = Math.min(format.getImageableWidth() / d.height, format.getImageableHeight() / d.width);
if (scale < 1.0) {
g2.scale(scale, scale);
}
g2.translate(-d.width / 2.0, -d.height / 2.0);
paint(g2);
return Printable.PAGE_EXISTS;
}[/code]
Obs.: as variáveis hexFinal? e hexInicial? possuem as coordenadas da área que vou imprimir.
E este é o código que faz a impressão:
[code]PrinterJob printerJob = PrinterJob.getPrinterJob();
Book book = new Book();
MiddleEarthMap mapa = new MiddleEarthMap(config, hexOrigem, hexFim);
book.append((Printable)mapa, new PageFormat());
/* Set the object to be printed (the Book) into the PrinterJob.
- Doing this before bringing up the print dialog allows the
- print dialog to correctly display the page range to be printed
- and to dissallow any print settings not appropriate for the
- pages to be printed.
*/
printerJob.setPageable(book);
/* Show the print dialog to the user. This is an optional step
- and need not be done if the application wants to perform
- ‘quiet’ printing. If the user cancels the print dialog then false
- is returned. If true is returned we go ahead and print.
*/
boolean doPrint = printerJob.printDialog();
if (doPrint) {
try {
printerJob.print();
} catch (PrinterException exception) {
System.err.println("Printing error: " + exception);
}
}[/code]
A classe MiddleEarthMap é a classe que desenha o mapa.
Olá fenrir…
Estou usando desta forma em meu prog… ele até imprime legal só que ele não reconhece pula linha nem centraliza… o texto que quero que imprima esta na String Dados… e nela contem pula linha e palavras centralizadas… ou posso pegar dados de um TextArea por exemplo e mesmo se as palavras contidas estiverem centralizadas no textArea na hora de imprimir ele imprimi tudo junto só respeita as margens que defini mas pula linha e centralização… não …oq ue pode ser feito neste caso hein???
se der pra vc dar uma ajuda agradeço muito pois tenho urgencia nisto…
muito obrigado…
[code]public void imprimir()
{
PrinterJob printerJob = PrinterJob.getPrinterJob();
PageFormat format = new PageFormat();
format = printerJob.pageDialog(format);
Book book = new Book();
TextWithFooter footer = new TextWithFooter(Dados);//Dados String contendo os dados a serem impressos…
book.append(footer, format);
printerJob.setPageable(book);
boolean doPrint = printerJob.printDialog();
if (doPrint)
{
try
{
printerJob.print();
}
catch (PrinterException exception)
{
System.err.println("Printing error: " + exception);
}
}
}
import java.awt.;
import java.awt.font.;
import java.awt.geom.;
import java.awt.print.;
import java.text.*;
public class TextWithFooter implements Printable
{
AttributedString mStyledText;
public TextWithFooter(String mText)
{
mStyledText = new AttributedString(mText);
}
public int print(Graphics g, PageFormat format, int pageIndex) throws PrinterException
{
Graphics2D g2d = (Graphics2D) g.create();
g2d.translate(format.getImageableX(), format.getImageableY());
g2d.setPaint(Color.black);
Point2D.Float pen = new Point2D.Float();
AttributedCharacterIterator charIterator = mStyledText.getIterator();
LineBreakMeasurer measurer = new LineBreakMeasurer(charIterator, g2d.getFontRenderContext());
float wrappingWidth = (float) format.getImageableWidth();
while (measurer.getPosition() < charIterator.getEndIndex())
{
TextLayout layout = measurer.nextLayout(wrappingWidth);
pen.y += layout.getAscent();
float dx = layout.isLeftToRight() ? 0 : (wrappingWidth - layout.getAdvance());
layout.draw(g2d, pen.x + dx, pen.y);
pen.y += layout.getDescent() + layout.getLeading();
}
g2d.dispose();
g2d = null;
try
{
Printable formatPainter = (Printable) format;
formatPainter.print(g, format, pageIndex);
}
catch (ClassCastException exception)
{ }
return Printable.PAGE_EXISTS;
}
} [/code]
Eu não estou com muito tempo para ficar fazendo testes, infelizmente…rodei seu programa aqui pra ver o que acontecia e testei algumas alternativas, mas sem sucesso. 
Mas acho que uma boa forma de você ver isso é tentar desenhar o texto num JPanel. À partir do momento em que o texto aparecer corretamente nele, basta mandar imprimí-lo…apesar que acho que você terá que fazer essas centralizações tudo na mão!
Não acha que seria mais prático usar pacotes específicos de impressão para relatórios??
As classes de impressão da JVM são úteis para imprimir gráficos…pois é só mandar o objeto [i]Graphics[/b] e pronto! Mas com texto…
Olá fenrir…
obrigado pela ajuda… vc poderia me dar umas dicas a respeito desses pacotes específicos de impressão aglum exemplo, algum codigo, nomes pra eu buscar algo a respeito, pois não tenho idéia de nada a este respeito…
obrigado …
http://www.google.com/search?hl=en&lr=&ie=UTF-8&oe=UTF-8&q=reports+%2Bjava&btnG=Google+Search 
Mas eu ouço o pessoal falar bastante no JasperReports (http://jasperreports.sourceforge.net).
E parece que o Crytal Reports na última versão também se integra com o Java.