我的应用程序允许用户打印由多个Swing控件(图像,文本等)组成的屏幕内容 - 自己打印的面板很长(几页),宽度约为600像素。
由于我确切地知道每个页面布局(我在图片和组件上放置了确切的数量)(图像总数是动态的),我可以准确计算出打印所需的页数。
我已经实现了Printable接口,如下所示:
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打印机和几台客户打印机进行了测试 - 结果很好。
然而,在我的一个用户的打印机上 - 似乎有些东西不能用于计算,因为它会破坏图像中间的页面。
有更优雅的方式进行这些计算吗? 我可以在某处添加“分页符”通知吗?
由于
答案 0 :(得分:1)
过去我发现尝试自己实现可打印的界面会导致格式化问题,例如您遇到的问题。我过去做过的一件事就是使用JasperReports来管理这件事,这大大减少了我的努力,并且运作良好。您可以创建一个具有一个图像/页面的jrxml定义,然后将图像传递到jasperreport。从这里您可以使用JasperPrint对象并将其直接发送到打印机。这对我来说效果很好。此外,它还有几个好处,如果需要,已经在jasper报告(例如pdf)中构建了导出。
答案 1 :(得分:0)
代码本身看起来不错,特别是考虑到它适用于PDF打印机。我只是有一些调试的想法:
1)您是否检查过用户打印机的打印机设置?可能页面大小设置不正确。 2)您可以将开发机器连接到该打印机并进行调试吗? 3)如果没有,你可以添加日志记录,告诉你pg.getImageableWidth和pg.getImageableHeight以及整个计算过程中的其他信息,看看它的错误。