Java打印页面

标签 java swing printing

我的应用程序允许用户打印由多个 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/

相关文章:

java - 将字符串转换为 byte[] 并将 byte[] 转换为字符串

java - 需要找到线程错误

java - 如何使用 Apache Poi 更改工作表的选项卡颜色

java - JList 项目删除后回来?

java - 如何让我的 TreeCellRenderer 填充我的 JTree?

java - 有什么办法可以避免这段代码吗?

java - 带按钮的 table

使用 ProGuard 发布的应用程序中的 Android 错误

css - 分页符在 Bootstrap 模式中不起作用

apache-flex - 在 Adob​​e AIR 中打印 - 独立 PDF 生成