Java打印 - 页面

时间:2009-10-26 15:42:34

标签: java swing printing

我的应用程序允许用户打印由多个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打印机和几台客户打印机进行了测试 - 结果很好。

然而,在我的一个用户的打印机上 - 似乎有些东西不能用于计算,因为它会破坏图像中间的页面。

有更优雅的方式进行这些计算吗? 我可以在某处添加“分页符”通知吗?

由于

2 个答案:

答案 0 :(得分:1)

过去我发现尝试自己实现可打印的界面会导致格式化问题,例如您遇到的问题。我过去做过的一件事就是使用JasperReports来管理这件事,这大大减少了我的努力,并且运作良好。您可以创建一个具有一个图像/页面的jrxml定义,然后将图像传递到jasperreport。从这里您可以使用JasperPrint对象并将其直接发送到打印机。这对我来说效果很好。此外,它还有几个好处,如果需要,已经在jasper报告(例如pdf)中构建了导出。

答案 1 :(得分:0)

代码本身看起来不错,特别是考虑到它适用于PDF打印机。我只是有一些调试的想法:

1)您是否检查过用户打印机的打印机设置?可能页面大小设置不正确。 2)您可以将开发机器连接到该打印机并进行调试吗? 3)如果没有,你可以添加日志记录,告诉你pg.getImageableWidth和pg.getImageableHeight以及整个计算过程中的其他信息,看看它的错误。