}
catch (PrinterException exception) { ... }
Au cours de l'impression, la méthode print() de la classe PrinterJob effectue des appels répétés à la méthode print() de l'objet implémentant l'interface Printable
associé à la tâche.
Etant donné que le travail d'impression ne sait pas combien de pages vous souhaitez imprimer, il se contente d'appeler plusieurs fois la méthode print().
Tant que la méthode print() renvoie la valeur Printable.PAGE_EXISTS, le travail d'impression continue de produire des pages. Lorsque la méthode print()
renvoie Printable.NO_SUCH_PAGE, le travail d'impression s'arrête.
Attention ! Le nombre de pages que le travail d'impression passe à la méthode print() commence par 0.
§
Par conséquent, le travail d'impression ne sait pas précisément combien de pages il faut imprimer, avant que l'impression totale ne soit terminée. C'est
pour cette raison que la boîte de dialogue d'impression affiche une plage d'impression correspondant aux pages 1 à 1. Vous verrez dans le prochain
chapitre comment éviter cet inconvénient en fournissant un objet java.awt.print.Book au travail d'impression.
Processus d'impression (avancement par bandes)
Pendant le processus d'impression, le travail d'impression appelle plusieurs fois la méthode print() de l'objet Printable. Ce travail d'impression a l'autorisation d'effectuer
plusieurs appels pour la même page. Par conséquent, il ne faut pas compter les pages dans la méthode print(), mais plutôt se fonder sur le paramètre de nombre de pages.
Il existe une bonne raison pour que le travail d'impression puisse appeler plusieurs fois la méthode print() pour la même page. Certaines imprimantes, en particulier
les imprimantes matricielles et à jet d'encre, utilisent un effet de bandes. Elles impriment une bande à la fois, avancent la feuille de papier, puis impriment la bande
suivante. Cela fournit au travail d'impression une technique pour gérer la taille du fichier d'impression.
Si le travail d'impression demande à l'objet Printable d'imprimer une bande, il définit une zone de clipping dans le contexte graphique correspondant à la bande
sélectionnée, puis appelle la méthode print(). Ses opérations d'affichage seront alors restreintes au rectangle de la bande, et seuls les éléments graphiques qui se
trouvent dans cet bande seront affichés.
Votre méthode print() n'a pas forcément besoin d'être au courant de ce procédé, à une seule exception près : elle ne doit pas interférer avec le rectangle de clipping.
Attention : L'objet Graphics que votre méthode print() récupère est également restreint à la zone imprimable, c'est-à-dire que les marges y sont imprimées. Si vous
remplacez la zone de clipping, il se peut que vous imprimiez en dehors des marges. En particulier dans un contexte graphique d'impression, vous devez respecter la
zone de clipping. Appelez donc clip() et non setClip(), pour réduire la zone de clipping. Si vous êtes amenés à réduire la zone de clipping, vérifiez que vous appelez
bien getClip() au début de votre méthode print() et que vous restaurez cette zone de clipping.
Pour en savoir plus sur le cliping, revoir les cours sur le Graphisme 2D.
§
Le paramètre PageFormat de la méthode print()
Le paramètre PageFormat de la méthode print() contient des informations sur la page imprimée. Ainsi, les méthodes getWidth() et getHeight() renvoient la taille du papier,
mesurée en points.
Un point correspond à 1/72
ème
de pouce, un pouce valant 25,4 millimètres. Par exemple une feuille de papier A4 contient 595 par 842 points. La bibliothèque
d'impression se sert de points pour deux raisons.
1. Les tailles de papier et les marges sont mesurées en points.
2. L'unité par défaut pour tous les contextes graphiques d'impression est aussi le point.
Les méthodes getWidth() et getHeight() de la classe PageFormat fournissent la taille complète du papier. Vous ne pouvez pas imprimer à n'importe quel endroit d'une
page. La plupart du temps, les utilisateurs sélectionnent des marges, et même s'ils ne le font pas, les imprimantes ont besoin d'un faible espace pour entraîner la
feuille sur laquelle elles impriment ; cet espace n'est par conséquent pas imprimable.
Les méthodes getImageableWidth() et getImageableHeight() fournissent les dimensions de la zone réellement imprimable. Cependant les marges doivent être
symétriques : il vous faut également connaître le coin supérieur gauche de la zone graphique, qui peut être obtenu grâce aux méthodes suivantes : getImageableX()
et getImageableY().