2009-12-22 15 views
10

De sun's documentation¿Por qué el método de impresión de Java imprimible se llama varias veces con el mismo número de página?

"El sistema de impresión puede solicitar que una página se represente varias veces antes de pasar a la página siguiente."

Los ejemplos muestran siempre algo como esto:

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

Si sigue este patrón de su código normalmente funciona bien porque es explícita basada en el número de página. No seguir este patrón me causó gran dolor hasta que me di cuenta de que lo llamaban varias veces con el mismo número de página y comencé a almacenar en caché las páginas.

¿Por qué el método de impresión de Java imprimible se llama varias veces con el mismo número de página?

Respuesta

13

El sistema de impresión de Java está a merced del sistema de impresión del sistema operativo subyacente, y ese sistema puede solicitar que una sola página se represente varias veces.

Una razón es impresión en banda - si la impresora no tiene suficiente memoria para procesar toda la página a la vez, en ese caso, el sistema operativo volverá a pedirle a Java la página para que pueda imprimir la página en tiras ("bandas"). Este es el caso específico mencionado en la Guía del Programador Java 2D, en la sección "Printing Concepts".

Puede haber otras razones; realmente depende del sistema de impresión del sistema operativo.

+0

Debo notar que realmente no recuerdo haber visto este comportamiento cuando estaba trabajando en un sistema de informes basado en Java hace algunos años. Puede haber sido porque estábamos en Linux en ese momento. – ZoogieZork

+0

Los sistemas de impresión en Linux generalmente convierten todo el documento en PostScript (si no es lo que ya es) como un lenguaje intermedio incluso cuando se trabaja con impresoras basadas en banda, por lo que el sistema de impresión realiza el almacenamiento en memoria intermedia para usted. –

+0

Ah, sospeché como tal. Es bueno saberlo, gracias! – ZoogieZork

2

Hay una serie de razones por las que puede estar haciendo esto.

Dependiendo del sistema de impresión subyacente, es posible que desee calcular ciertas propiedades "por adelantado" (por ejemplo, extensiones de página, uso de tinta, etc.) sin tener que almacenar en búfer todo el documento.

Además, ciertos sistemas de impresión son "basados ​​en banda", en lugar de basados ​​en páginas. Los inyectores de tinta, por ejemplo, imprimirán uno una banda horizontal de datos ráster a la vez. En lugar de almacenar los datos ráster de una página (aproximadamente 100MB para una página de carta de 600 ppp en EE. UU.), El sistema de impresión Java puede almacenar solo algunas bandas (o incluso una sola) a la vez.

Cuestiones relacionadas