我正在尝试为swing UI添加打印功能。我尝试了以下方法:
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");
}
}
未注释掉的代码非常适用于打印的内容在纸张上看起来非常好看。但是,JFrame比纸张大,所以它只是将其切断。我还尝试了注释掉的代码,它创建了JFrame的图像,适当地缩放图像,使其适合页面并保持相同的宽高比,但缩放使得屏幕上的文本看起来很糟糕。我找到了这个advanced tutorial from Oracle,但它告诉我们如何将屏幕分成多个页面。我只想打印JFrame的漂亮截图。如何打印JFrame而不将其切断或导致工件缩放?
答案 0 :(得分:4)
您可以从RenderingHints
获得一些好处。我会特别关注KEY_ANTIALIASING
,KEY_TEXT_ANTIALIASING
和KEY_FRACTIONALMETRICS
。
编辑:
RenderingHints.KEY_INTERPOLATION
也有帮助,AffineTransformOp.TYPE_BICUBIC
是另一种选择。