Estoy intentando agregar la funcionalidad de impresión a nuestra UI basculante. He intentado lo siguiente:¿Cómo puedo imprimir una ventana abatible para que se ajuste bien en una sola página?
protected void print() {
PrinterJob job = PrinterJob.getPrinterJob();
if(job.printDialog()){
try {
job.setPrintable(new Printable() {
@Override
public int print(Graphics graphics, PageFormat pageFormat, int pageIndex) throws PrinterException {
if(pageIndex == 0){
Graphics2D g2d = (Graphics2D)graphics;
g2d.translate(pageFormat.getImageableX(), pageFormat.getImageableY());
// BufferedImage snapshot = AnimUtilities.createSnapshotOfFrame(ApplicationFrame.this, Transparency.TRANSLUCENT);
// double scaleX = pageFormat.getWidth()/snapshot.getWidth();
// double scaleY = pageFormat.getHeight()/snapshot.getHeight();
//
// double scaleValue = Math.min(scaleX, scaleY);
// g2d.scale(scaleValue, scaleValue);
// g2d.drawImage(snapshot, 0, 0, snapshot.getWidth(), snapshot.getHeight(), ApplicationFrame.this);
// ApplicationFrame.this.print(g2d);
ApplicationFrame.this.printAll(g2d);
return PAGE_EXISTS;
}
return NO_SUCH_PAGE;
}
});
job.print();
} catch (PrinterException e) {
e.printStackTrace();
}
} else {
System.err.println("Error printing");
}
}
El código que no está comentada funciona muy bien en que lo que se ve muy bien impresa en el papel. Sin embargo, el JFrame es más grande que el papel, por lo que simplemente lo corta. También probé el código comentado que crea una imagen del JFrame, escala la imagen apropiadamente para que se ajuste a la página y mantenga la misma relación de aspecto, pero la escala hace que el texto en la pantalla se vea horrible. Encontré esto advanced tutorial from Oracle, pero eso indica cómo dividir la pantalla en varias páginas. Solo quiero imprimir una buena captura de pantalla del JFrame. ¿Cómo puedo imprimir el JFrame sin cortarlo o causar que los artefactos se escalen?
Agregué g2d.setRenderingHint (RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC) y activé el anti-aliasing y eso soluciona el problema de escala. Gracias. Todavía tengo algunos otros problemas, pero probablemente guardaré eso para otra pregunta si no puedo resolverlo. –
¡Excelente! ['AffineTransformOp'] (http://download.oracle.com/javase/6/docs/api/java/awt/image/AffineTransformOp.html) es otra forma de obtener interpolación bicúbica también. – trashgod