2009-12-22 16 views
10

Da sun's documentationPerché il metodo di stampa di java Printable viene chiamato più volte con lo stesso numero di pagina?

"Il sistema di stampa potrebbe richiedere che una pagina essere reso più volte prima di passare alla pagina successiva."

Gli esempi mostrano sempre qualcosa di simile:

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

Se si segue questo modello il codice funziona in genere bene perché è esplicito in base al numero di pagina. Non seguire questo schema mi ha causato un grande dolore fino a quando ho realizzato che veniva chiamato più volte con lo stesso numero di pagina e iniziato a memorizzare le pagine.

Perché il metodo di stampa di java Printable viene chiamato più volte con lo stesso numero di pagina?

risposta

13

Il sistema di stampa Java è in balia del sistema di stampa del sistema operativo sottostante e tale sistema può richiedere che una singola pagina venga sottoposta a rendering più volte.

Una ragione è fasciato stampa - se la stampante non dispone di memoria sufficiente per rendere l'intera pagina in una sola volta - in questo caso, il sistema operativo chiederà Java per la pagina di nuovo in modo che possa stampare la pagina a strisce ("bande"). Questo è il caso specifico menzionato nella Guida del Programmatore 2D Java, nella sezione "Printing Concepts".

Ci possono essere altri motivi; è davvero all'altezza del sistema di stampa del sistema operativo.

+0

Devo notare che in realtà non ricordo di aver visto questo comportamento quando stavo lavorando su un sistema di report basato su Java alcuni anni fa. Potrebbe essere perché eravamo su Linux in quel momento. – ZoogieZork

+0

I sistemi di stampa su Linux generalmente convertono l'intero documento in PostScript (se non è quello che è già) come linguaggio intermedio anche quando si lavora con stampanti basate su banda, quindi il sistema di stampa sta facendo il buffering per voi. –

+0

Ah, lo sospettavo come tale. Buono a sapersi, grazie! – ZoogieZork

2

Ci sono una serie di motivi per cui ciò potrebbe accadere.

A seconda del sistema di stampa sottostante, potrebbe essere necessario calcolare alcune proprietà "in primo piano" (ad esempio: pagine estese, utilizzo dell'inchiostro, ecc.) Senza dover bufferizzare l'intero documento.

Inoltre, alcuni sistemi di stampa sono "basati su banda", piuttosto che basati su pagine. Inkjet, ad esempio, stamperà una banda orizzontale di dati raster alla volta. Anziché bufferizzare i dati raster di una pagina (circa 100 MB per una pagina di lettere USA a 600 dpi), il sistema di stampa Java può bufferizzare solo alcune bande (o eventualmente anche solo una banda) alla volta.

Problemi correlati