首页 文章

Java可打印只打印一页

提问于
浏览
0

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

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

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

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

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

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

谢谢

1 回答

  • 0

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

    Printable接口要求您实现一个知道要写入每个页面的内容的print方法: 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中学到了我所需要的大部分内容,但这是一场斗争 . 计算分页符的放置位置是最具挑战性的部分,实际上要求我编写几乎完全相同的代码来进行打印 . 如果你想从我的项目中获得一些示例代码,我可以在这里发布一些代码 .

相关问题