[Resolvido]Perda de qualidade ao imprimir JPanel

Bom dia, possuo um array de JPanel o qual crio um BufferedImage e mando imprimir o mesmo.

BufferedImage bufferedImage;

for(Component c : arrJPanel){
	bufferedImage = new BufferedImage(c.getWidth(), c.getHeight(), BufferedImage.TYPE_INT_RGB);
	c.printAll(bufferedImage.getGraphics());

	arrImagensBuferizadas.add(bufferedImage);
}

na minha classe de impressão utilizo.

		Graphics2D graphics2D = (Graphics2D) graphics;
		graphics2D.drawImage(arrayBufferedImage.get(pageIndex), null, 0, 0);

Tudo ocorre de acordo com o planejado, o problema é que ao imprimir a imagem a mesma perde qualidade.

estou tendo como base uma folha A4 de 595x842 px.

Não é que a imagem perde qualidade - é que, para você manter a mesma qualidade que a tela, você teria de lidar com o fato que a folha impressa contém muito mais pixels que os que você citou (592 x 894 px). Uma impressora típica tem resolução de 600 dpi (pixels por polegada).
Se uma folha de papel A4 tem 11,7 polegadas, isso d[a 70 mil pixels na largura - na prática, você não precisa mandar uma imagem tão grande assim.

Você precisa criar uma outra imagem com resolução melhor e mandá-la para a impressora.

bezier curve, realmente não havia pensado desta forma, até desconhecia esta diferença na hora da impressão, haveria a possibilidade de me ajudar a gerar essa imagem com uma ?maior qualidade? como devo proceder para que isso ocorra com sucesso?

Pois é, a idéia de imprimir diretamente um JPanel parece legal até que ocorre isso de perder a qualidade - na verdade é que você está tentando imprimir uma tela e uma tela normalmente fica ruim quando impressa diretamente.

É inevitável que isso ocorra; normalmente as pessoas costumam usar, para imprimir alguma coisa, algo como o JasperReports, iText etc.

entanglement , boa tarde, então o iReport e o iText não suprem as necessidades que possuo, estou a meses brigando com os mesmos sem sucesso, tanto que estou fazendo um “visualizador de relatórios” totalmente no braço, o mesmo já esta pronto e suprindo todas as minhas necessidades, o meu único problema agora é a parte da impressão.

Olá

Como disse o bezier curve o problema é de resolução e não de código java.
Veja isso,

[quote]DPI (dots per inch), ou pontos por polegada, é a medida utilizada para resolução em fotos digitais. Neste caso, 1 dpi significa um ponto por polegada quadrada.

Resolução é quantidade de DPIs de uma imagem. Quanto maior, melhor.

Para visualização em monitor, 72dpi, a resolução na qual as câmera digitais fotografam, são um valor bem aceitável. Para impressão, a situação muda de figura. Antes de imprimir qualquer imagem, é necessário alterar essa resolução para 300 dpi (240 é um mínimo aceitável para um boa impressão).

Mãos à obra.

O primeiro passo, é converter o dpi, que é calculado em polegadas, para centímetros. Neste caso, dividmos o valor de DPI escolhido para impressão (ex.: 300), por 2,54, que é o valor em centímetros referente a uma polegada.

Depois, basta dividir o valor em pixels da imagem, pelo resultado da divisão anterior.

Usando o excel, podemos montar a planilha da seguinte forma:

Tamanho em pixel horizontal inserir
Tamanho em pixel vertical inserir
Resolução em DPI inserir
Tamanho em CM horizontal =B1/(B3/2,54)
Tamanho em CM vertical =B2/(B3/2,54)

O cálculo também pode ser feito de forma inversa, informando o tamanho em centímetros e obtendo o resultado em pixels.

Tamanho em CM Horizontal inserir
Tamanho em CM Vertical inserir
Resolução em DPI inserir
Tamanho em pixel horizontal =B1*(B3/2,54)
Tamanho em pixel vertical =B2*(B3/2,54) [/quote]

Que achei em:
http://www.forumdigitalfoto.com/threads/548-Resolu%C3%A7%C3%A3o-em-pixel-x-cm-como-calcular-o-tamanho-final-de-impress%C3%A3o

Em suma, você deve calcular o tamanho da imagem a imprimir em função da resolução em dpi (240 mínimo) da impressão, e não o contrário.
Abs.

joagostini , e como eu faria para trabalhar essa resolução em DPI para que a imagem seja impressa corretamente?

Se você quer ter melhor qualidade, deve abandonar a idéia de imprimir um JPanel.

Não sei por que é que o iText ou o JasperReports não preenchem seus requisitos.

Você precisa imprimir um gráfico de barras, é isso?

http://docs.oracle.com/javase/tutorial/2d/printing/printable.html

http://jasperforge.org/uploads/publish/jasperreportswebsite/trunk/sample.reference/charts/index.html

entanglement, estou trabalhando com um projeto para cartórios, no qual gero documentos que podem ter de 1 a N paginas, nas mesmas todo o texto digitado deve ficar Justificado (este texto pode se prolongar por varias paginas), e sempre na ultima linha de cada folha o mesmo não ocorre (problema do iReport), já vi outras pessoas com o mesmo problema no GUJ mas sem solução, sem falar em questão de controle das assinaturas e seus espaçamentos o que não consigo no iReport, montando o JPanel no ?Braço? consigo ter total controle sobre o texto e todos os demais componentes, cabeçalhos específicos assim como rodapés, sendo assim um documento totalmente dinâmicos e configurável pelo cliente.

Pelo que imagino, você vai ter de criar, para impressão, um JPanel com tamanho muito grande e desenhar tudo nesse JPanel (para evitar que o cara veja um JPanel monstruoso, você pode criá-lo minimizado, mas com esse tamanho monstruoso).
Em vez de ele ser de 800 por 600 (por exemplo), ele teria de ser de 12000 por 9000 pixels, e obviamente você terá de escalar todas as fontes e outros componentes de texto - em vez de usar uma fonte de tamanho 12, você teria de usar uma fonte de tamanho 180, e assim por diante.
Sem contar que você vai ter de reposicionar todos os JTextAlgumaCoisa para ficarem nessas posições.
Isso vai dar um pouquinho de dor de cabeça também, não?

Sem contar que o arquivo de impressão que é gerado para spool desse JPanel gigante vai deixar sua impressão bem lenta.

Se eu estivesse no seu lugar, e tivesse brigado com essas coisas chatas, e não pudesse gastar um centavo usando um sistema de preparação de relatórios como alguma coisa que substituísse o JasperReports mas fosse pago, provavelmente iria usar uma coisa meio esdrúxula - provavelmente iria usar o Java para gerar um arquivo LaTeX (que é um formato texto, cheio de anotações esquisitas) que seria transformado em um PDF ou PS, e mandaria esse PDF ou PS para a impressora.
É que infelizmente eu sou meio bitolado com o LaTeX e por isso eu acabo levando as coisas para esse lado.

O seu problema é sempre imprimir texto puro, certo?

entanglement, era isso mesmo que eu tinha em mente, pois a meu painel atual tem o tamanho exato de uma folha A4 ( 595x842 ), realmente terei muito trabalho por isso estou a procura de uma outra forma de tratar este problema, o ?relatório? por assim dizer é realmente peculiar em relação aos demais.

Não tenho apenas texto no documento, tenho imagens, tabelas, texto (RTF), assinaturas e selos digitais.

Para ficar um pouco mais claro o projeto consiste em um editor de texto com N facilidades para a geração dos documentos a sua visualização e finalmente impressão.

Hum, se é assim, você precisa então guardar as coisas que você vai mostrar na página com coordenadas que podem ser escaladas, não em pixels.

Por exemplo, você posicionou os elementos no pixel 10, 20, mas na verdade eles têm de ficar na posição x = 12.5 mm, y = 20.7 mm do seu relatório.

Desculpe a demora para responder mas hoje até a internet esta me deixando na mão^^

entanglement não captei muito bem a sua ideia, não entendo como isso me ajudaria na hora da impressão, teria como me explicar de uma outra forma se não for incomodo?

Por exemplo, digamos que você tenha criado um JPanel de 800 por 600 e posicionado as coisas dentro desse JPanel.
O texto, por exemplo, vai ficar em um JTextArea (ou sei lá onde) que vai da coordenada (em pixels) 10,10 até 700, 500.
Quando você for imprimir, provavelmente vai ter de criar um JPanel que seja 15 vezes maior (exemplificando - você vai ter de fazer algumas contas, é claro) e então você faz a sua JTextArea ir de 150,150 até 70015, 50015.
Se suas fontes têm tamanho 12, por exemplo, na hora de criar o JPanel para impressão vai ter de usar fontes do tamanho 12 * 15 = 180, e assim por diante.

entanglement agora sim, entendi, era o que você tinha falando antes, estou com tanta coisa na cabeça que acabei me confundindo.

Muito obrigado pela ajuda, realmente terei que fazer isso, muito obrigado pela paciência e atenção.

Um grande abraço a todos e um ótimo resto de semana.