我的应用程序允许用户打印由多个 Swing 控件(图像、文本等)组成的屏幕内容 - 打印的面板本身很长(几页),宽度约为 600 像素。
由于我确切地知道每个页面上的每个页面布局(我放置了图像和组件的确切数量)(图像总数是动态的),因此我可以准确计算打印需要多少页。
我实现了 Printable 接口(interface),如下所示:
public int print(Graphics g, PageFormat pf, int pageIndex) throws PrinterException {
Graphics2D g2 = (Graphics2D) g;
g2.setColor(Color.BLACK); //set default foreground color to black
RepaintManager.currentManager(this).setDoubleBufferingEnabled(false);
Dimension d = this.getSize(); //get size of document
double panelWidth = d.width; //width in pixels
double panelHeight = d.height; //height in pixels
double pageHeight = pf.getImageableHeight(); //height of printer page
double pageWidth = pf.getImageableWidth(); //width of printer page
double scale = pageHeight / panelHeight;
int totalNumPages = (int) Math.ceil(scale * panelWidth / pageWidth);
if (pageIndex >= totalNumPages) {
return Printable.NO_SUCH_PAGE;
}
g2.translate(pf.getImageableX(), pf.getImageableY());
g2.translate(0f, -pageIndex * pageHeight);
g2.scale(scale, scale);
this.paint(g2);
return Printable.PAGE_EXISTS;
}
看起来一切都很好。 由于我没有打印机,因此我使用 PDF 打印机和多个客户端打印机对其进行了测试 - 结果很好。
但是,在我的用户的一台打印机上 - 似乎有些东西无法进行计算,因为它破坏了图像中间的页面。
是否有更优雅的方法来进行这些计算? 我可以在某处添加“分页符”通知吗?
谢谢
最佳答案
过去,我发现尝试自己实现可打印界面会导致格式问题,就像您遇到的那样。我过去做过的一件事是使用 JasperReports 来管理这个问题,这大大减少了我的工作量,而且效果很好。您可以创建一个包含一个图像/页面的 jrxml 定义,然后将图像传递到 jasperreport 中。从这里您可以使用 JasperPrint 对象并将其直接发送到打印机。这对我来说效果很好。此外,如果需要的话,它还有一些好处,导出已经内置到 jasper 报告中,例如 pdf。
关于Java打印页面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1625546/