Estou tendo 2 problemas ao utilizar o PrinterJob.
1º, Quando eu mando imprimir demora uma eternidade para a impressora começar a imprimir
2º, Não esta formatando corretamente, Exemplo, Se eu mando imprimir em uma impressora virtual para gerar um PDF, ele não demora pra gerar, e fica perfeito, mas quando eu mando imprimir em minha impressora jato de tinta, alem de demorar muito para iniciar a impressão, quando imprime ele não aplica as magens e corta 1/4 do lado direito do JPanel que esta sendo impresso, o mesmo não acontece com a impressora virtual.
segue abaixo meu código do PrinterJob (PS. o código foi pego de varios lugares na net e só adaptado as minhas necessidades.)
import java.awt.Component;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.print.PageFormat;
import java.awt.print.Paper;
import java.awt.print.Printable;
import java.awt.print.PrinterException;
import java.awt.print.PrinterJob;
public class Imprimir implements Printable {
private PageFormat pageFormat;
private Paper paper;
private PrinterJob printerJob;
private Component comp;
boolean scaleWidthToFit = true;
public Imprimir(Component comp, double width, double height, double Marge) {
pageFormat = new PageFormat();
paper = new Paper();
paper.setSize(width, height);
paper.setImageableArea(Marge, 1, width - ((Marge + 7) * 2), height);
pageFormat.setOrientation(PageFormat.PORTRAIT);
pageFormat.setPaper(paper);
printerJob = PrinterJob.getPrinterJob();
this.comp = comp;
printDialog();
}
private void printDialog() {
if (printerJob.printDialog()) {
printerJob.setPrintable(this, pageFormat);
try {
printerJob.print();
} catch (PrinterException e) {
System.out.println("MSG: ");
}
}
}
@Override
public int print(Graphics graphics, PageFormat pageFormat, int pageIndex) throws PrinterException {
Graphics2D graphics2D;
graphics2D = (Graphics2D) graphics;
/* As coordenadas (0, 0) costumam ficar fora da área de impressão,
* portanto traduzimos as coordenadas (X, Y) de acordo com o PageFormat
*/
graphics2D.translate(paper.getImageableX(), paper.getImageableY());
// Carrega a largura e a altura da página com base no PageFormat
double pageWidth = paper.getImageableWidth();
double pageHeight = paper.getImageableHeight();
// Carrega a largura e a altura do componente a ser impresso
double compWidth = (double) comp.getWidth();
double compHeight = (double) comp.getHeight();
/* Redimensiona o graphics se a largura do componente for
* maior que a largura da página
*/
if (compWidth >= pageWidth) {
double scale = pageWidth / compWidth;
graphics2D.scale(scale, scale);
compHeight *= scale;
}
/* Redimensiona o graphics se a altura do componente for
* maior que a altura da página
*/
if (compHeight >= pageHeight) {
double scale = pageHeight / compHeight;
graphics2D.scale(scale, scale);
}
if (pageIndex > 0) {
return Printable.NO_SUCH_PAGE;
}
graphics2D.translate(graphics2D.getClipBounds().getX(), graphics2D.getClipBounds().getY());
comp.paint(graphics2D);
return Printable.PAGE_EXISTS;
}
}
JFrame f = new JFrame();
DuplicataPDF Dpdf = new DuplicataPDF();
Dpdf.setPanelSize(632,484);
Dpdf.setBackground(Color.white);
f.setSize(Dpdf.getPanelPx(), Dpdf.getPanelPy());
f.getContentPane().add(Dpdf);
f.setVisible(true);
Dpdf.setVisible(true);
Imprimir printer = new Imprimir(Dpdf, 632, 484, 40);