0

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

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

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

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

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

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

谢谢

4

1 回答 1

0

当您实现 Printable 接口时,您应该实现一些逻辑来确定将打印多少页,例如: public int numPages(Graphics g,PageFormat pf) 如果此逻辑可能需要一些处理时间,您应该存储答案,因为 print 可能会被多次调用 - 甚至每次调用多次页。Print 可能会调用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 打印教程/文档中学到了我需要的大部分内容,但这很困难。计算分页符的放置位置是最具挑战性的部分,实际上需要我编写几乎与打印时完全相同的代码。如果你想从我的项目中获取一些示例代码,我可以在这里发布更多。

于 2013-02-13T02:28:04.567 回答