Java可打印只打印一页

时间:2013-02-12 18:12:03

标签: java printing

在我正在研究的Java项目中,我需要使用Java Printable接口向硬件打印机打印一些东西。该对象可以跨越多个页面。我已根据http://docs.oracle.com/javase/tutorial/2d/printing/index.html课程中指定的准则转换了对象。在我的代码中,我的可打印跨度为2页。在print方法中,我有以下代码:

// ...
if (pageIndex > amountOfPages) {
    return NO_SUCH_PAGE;
}
// ...

其中amountOfPages是我的文档跨越的页面数量,pageIndex是系统在调用print方法时填写的参数,表示打印机正在请求打印页面目的。
在相同的函数中,我总是以return PAGE_EXISTS;结束,以防if(...)在打印页面内容后失败。

但是,在运行时,打印机会在第一页后停止打印。我在每次返回之前都添加了日志消息,并且我注意到if子句中的返回永远不会到达,因此打印机在获得NO_SUCH_PAGE信号之前就停止了。

如果我检查打印机的属性,它声称没有发生错误。我非常难过,我不明白为什么打印机在作业完成之前就停止了,或者为什么它认为工作完成之前就已经完成了。

有没有人看到可以指出这种行为的原因?

由于

1 个答案:

答案 0 :(得分:0)

当您实现Printable接口时,您应该实现一些逻辑来确定将打印多少页,例如:  public int numPages(Graphics g,PageFormat pf) 如果此逻辑可能需要一些处理时间,则应存储答案,因为可能会多次调用打印 - 甚至每页多次调用。打印可能会调用numPages(...),因此这就是存储计算的好主意。

Printable接口要求您实现一个知道要写入每个页面的内容的打印方法:public int print(Graphics g, PageFormat pf, int page) throws PrinterException

如果要打印多行文本,可能会发现类包org.jfree.text很有帮助。由于Graphics drawString方法不会为您自动换行,因此这可以节省大量时间。例如:

        TextBlock notesBlock = TextUtilities.createTextBlock(
              someLongString, plainFont, g2.getPaint());
        notesBlock.setLineAlignment(HorizontalAlignment.LEFT);
        notesBlock.draw(g2, indent, y, TextBlockAnchor.TOP_LEFT);

我需要实现Printable来为对象列表生成打印机输出,其中每个对象的打印输出可能需要多达半页或少至几行。我确实从Oracle Java打印教程/ docs中学到了我所需要的大部分内容,但这是一场斗争。计算分页符的放置位置是最具挑战性的部分,实际上要求我编写几乎完全相同的代码来进行打印。 如果你想从我的项目中获得一些示例代码,我可以在这里发布一些代码。