问题 为什么使用相同的页码多次调用java Printable的print方法?


太阳的文件 

“在移动到下一页之前,打印系统可能会要求多次呈现页面。”

示例总是显示如下:

Printable print(Graphics g, PageFormat pageFormat, int page) {
    if (page == 0)
      do...
    else if(page == blah...)
}

如果您遵循此模式,您的代码通常可以正常工作,因为它是基于页码显式的。不遵循这种模式给我带来了巨大的痛苦,直到我意识到它被多次调用相同的页码并开始缓存页面。

为什么使用相同的页码多次调用java Printable的print方法?


1063
2017-12-22 00:42


起源



答案:


Java打印系统受底层OS打印系统的支配,并且该系统可以请求多次呈现单个页面。

一个原因是 带状印刷  - 如果打印机没有足够的内存来一次呈现整个页面 - 在这种情况下,操作系统将再次向Java请求页面,以便它可以打印带状页面(“带”)。这是Java 2D程序员指南中“特殊情况”中的“印刷概念”。

可能还有其他原因;它真的取决于操作系统的打印系统。


13
2017-12-22 01:09



我应该注意到,几年前我在使用基于Java的报告系统时,实际上并没有回忆起这种行为。可能是因为我们当时在Linux上。 - ZoogieZork
Linux上的打印系统通常将整个文档转换为PostScript(如果这不是它已经是),即使在使用基于波段的打印机时也是如此,因此打印系统正在为您进行缓冲。 - Laurence Gonsalves
啊,我怀疑是这样的。很高兴知道,谢谢! - ZoogieZork
从Windows XP SP2或其附近开始,它会绑定更小的频段(因此更多) - Tim Williscroft


答案:


Java打印系统受底层OS打印系统的支配,并且该系统可以请求多次呈现单个页面。

一个原因是 带状印刷  - 如果打印机没有足够的内存来一次呈现整个页面 - 在这种情况下,操作系统将再次向Java请求页面,以便它可以打印带状页面(“带”)。这是Java 2D程序员指南中“特殊情况”中的“印刷概念”。

可能还有其他原因;它真的取决于操作系统的打印系统。


13
2017-12-22 01:09



我应该注意到,几年前我在使用基于Java的报告系统时,实际上并没有回忆起这种行为。可能是因为我们当时在Linux上。 - ZoogieZork
Linux上的打印系统通常将整个文档转换为PostScript(如果这不是它已经是),即使在使用基于波段的打印机时也是如此,因此打印系统正在为您进行缓冲。 - Laurence Gonsalves
啊,我怀疑是这样的。很高兴知道,谢谢! - ZoogieZork
从Windows XP SP2或其附近开始,它会绑定更小的频段(因此更多) - Tim Williscroft


它可能有很多原因。

根据底层打印系统,它可能想要“预先”计算某些属性(例如:页面范围,墨水用量等),而不必缓冲整个文档。

而且,某些打印系统是“基于带”的,而不是基于页面的。例如,喷墨打印机将一次打印出一个水平条带的栅格数据。 Java打印系统可以一次仅缓冲几个频段(或甚至可能只缓冲一个频段),而不是缓存页面的光栅数据(600dpi美国字母页面约为100MB)。


2
2017-12-22 01:16