Почему метод печати java Printable вызывается несколько раз с тем же номером страницы?

Из документация по солнцу

"Система печати может потребовать многократную визуализацию страницы перед переходом на следующую страницу".

В примерах всегда есть что-то вроде этого:

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

Если вы следуете этому шаблону, ваш код обычно отлично работает, потому что он явно основан на номере страницы. Не следование этой схеме вызвало у меня сильную боль, пока я не понял, что ее вызывали несколько раз с тем же номером страницы и начали кэшировать страницы.

Почему метод печати java Printable вызывается несколько раз с тем же номером страницы?

Ответ 1

Система печати на Java находится во власти базовой системы печати ОС, и эта система может потребовать многократную визуализацию одной страницы.

Одной из причин является групповая печать - если на принтере недостаточно памяти для отображения всей страницы сразу - в этом случае ОС снова спросит Java для страницы, чтобы она могла распечатать страницу в полосах ( "группы" ). Это конкретный случай, упомянутый в Руководстве Java 2D Programmer, в разделе "" Концепции печати".

Могут быть и другие причины; это действительно до системы печати ОС.

Ответ 2

Есть несколько причин, по которым он может это сделать.

В зависимости от базовой системы печати может потребоваться вычислить определенные свойства "вверх" (например, экстенты страниц, использование чернил и т.д.) без необходимости буферизации всего документа.

Кроме того, некоторые системы печати основаны на полосах, а не на основе страниц. Например, струйные принтеры будут печатать одну горизонтальную полосу растровых данных за раз. Вместо того, чтобы буферизировать страницу с растровыми данными (около 100 МБ для страницы с буквенным обозначением на 600 точек на дюйм), система печати на Java может задерживать только несколько полос (или, возможно, даже одну полосу) за раз.