précédent | suivant | table des matières
|
Principes de base
On utilise l'API « Print » du paquetage java.awt.print.
Cette API permet d'imprimer des textes contenus dans un composant texte (TextArea, JTextPane, JEditorPane, etc...) aussi bien qu'une interface utilisateur complète.
Processus d'impression
Le processus d'impression est l'ensemble des actions que réalise un programme pour envoyer des données vers une imprimante.
Printable
Pour être imprimable, une classe doit implémenter l’interface l'interface Printable.
L’interface Printable définit deux constantes et une méthode :
La méthode print est la méthode appelée par une instance de la classe PrinterJob.
Les paramètres de print sont :
Exemple :
import java.awt.*; import java.awt.print.*; public class PremierExemple extends JPanel implements Printable { public PremierExemple() { } public int print( Graphics g, PageFormat pf, int pi){ // Imprime 2 pages if(pi>=2) return NO_SUCH_PAGE; g.setFont(new Font("arial", Font.BOLD, 30)); FontMetrics fm = g.getFontMetrics(); int X = (int) pf.getImageableX(), Y = (int) pf.getImageableY(); int W = (int) pf.getImageableWidth(), H = (int) pf.getImageableHeight(); java.awt.geom.Rectangle2D r = fm.getStringBounds("" + pi, g); // Cadre noir autour de la partie Imageable... g.drawRect(X+1, Y+1, W-2, H-2); // impression du numéro de page // en rouge et au milieu de la page int x = (int) (W - r.getWidth()) / 2; int y = (int) ((H - r.getHeight()) / 2); g.setColor(Color.red); g.drawString("" + pi, X+x, (int)(Y+y+r.getHeight())); return PAGE_EXISTS; } }
Lorsque print retourne NO_SUCH_PAGE l’instance de PrintJob arrête d’appeler la méthode print.
PrinterJob
La classe PrinterJob permet de créer des jobs d’impression et de les lancer :
PrinterJob printJob = PrinterJob.getPrinterJob(); //le dialogue d’impression du système if (printJob.printDialog()){ if (pageFormat == null) pageFormat = printJob.defaultPage(); printJob.setPrintable( l’objet Printable, pageFormat); try{ printJob.print() }catch (PrinterException e){ JOptionPane.showMessageDialog( this, e); } } |
PrinterJob printJob = PrinterJob.getPrinterJob(); HashPrintRequestAttributeSet prs = new HashPrintRequestAttributeSet(); printRequestSet.add(DialogTypeSelection.COMMON) //le dialogue d’impression de Java if (printJob.printDialog(prs)){ PageFormat pageFormat = printJob.getPageFormat(prs); printJob.setPrintable( l’objet Printable, pageFormat); try{ printJob.print(prs) }catch (PrinterException e){ JOptionPane.showMessageDialog( this, e); } } |
Méthodes de PrinterJob
static PrinterJob getPrinterJob() |
Un PrinterJob doit être créé en appelant cette méthode. |
void cancel() |
Supprime un PrinterJob |
PageFormat defaultPage() |
Crée un PageFormat par défaut |
PageFormat defaultPage(PageFormat page) |
Clone le PageFormat en paramètre. |
int getCopies() |
Retourne le nombre de copies à imprimer |
abstract String getJobName() |
Retourne le nom du document à imprimer |
abstract String getUserName() |
Retourne le “user name” |
abstract boolean isCancelled() |
Retourne true si le PrinterJob va être supprimé dès que possible. |
abstract PageFormat pageDialog (PageFormat page) PageFormat pageDialog (PrintRequestAttributeSet prs) |
Affiche un dialogue de configuration de la page, à partir du PageFormat en paramètre (boîte de dialogue système), ou de l'ensemble d'attributs (boîte de dialogue Java). |
abstract void print() abstract void print(PrintRequestAttributeSet prs) |
Imprime. |
abstract boolean printDialog() abstract boolean printDialog( PrintRequestAttributeSet prs) |
Affiche un dialogue d’impression. Ce dialogue d'impression est le dialogue natif du système, ou de l'imprimante si la méthode printDialog est appelée sans paramètre. Sinon celà dépend du paramètre prs. Voir PrintRequestAttributeSet. |
abstract void setCopies(int copies) |
Positionne le nombre de copies à imprimer. |
abstract void setJobName(String jobName) |
Donne un nom au document à imprimer. |
abstract void setPageable( Pageable document ) |
|
abstract void setPrintable (Printable p) abstract void setPrintable (Printable p, PageFormat f) |
Affecte au PrinterJob l'objet à imprimer. |
abstract PageFormat validatePage(PageFormat page) |
configuration de la page
pageFormat = printJob.pageDialog(pageFormat); |
HashPrintRequestAttributeSet prs = new HashPrintRequestAttributeSet(); ... pageFormat = printJob.pageDialog(prs); |
Les mesures dans la classe PageFormat sont exprimées en 1/72ème de pouce. Une feuille de format A4 est une feuille de 21/29,7 cm ou 595.27/841.881/72ème de pouce
La zone imprimable d’une feuille est la feuille moins les marges.
La classe PageFormat contient les attributs et méthodes suivantes :
static int LANDSCAPE |
static int PORTRAIT |
static int REVERSE_LANDSCAPE |
PageFormat() |
Crée un PageFormat par défaut, portrait |
double getHeight() |
Retourne la hauteur , en 1/72ème de pouce, de la page |
double getImageableHeight() |
Retourne la hauteur, en 1/72ème de pouce, de la zone imprimable de la page |
double getWidth() |
Retourne la largeur, en 1/72ème de pouce, de la page |
double getImageableWidth() |
Retourne la largeur, en 1/72ème de pouce, de la zone imprimable de la page |
double getImageableX() |
Retourne la coordonnée x du coin haut gauche de la zone imprimable de la page. |
double getImageableY() |
Retourne la coordonnée y du coin haut gauche de la zone imprimable de la page. |
int getOrientation() |
Retourne l’orientation de ce PageFormat |
void setOrientation(int orientation) |
Positionne l’orientation de la page. |
double[]getMatrix() |
Retourne une matrice de transformation qui traduit l’espace de l’utilisateur ves l’orientation requise pour la page. |
Paper getPaper() |
La classe Paper décrit les caractéristiques physiques de la feuille. |
void setPaper(Paper paper) |
Impression dans un fichier .PS
Pour diriger l'impression d'un Graphics 2D vers un fichier Postscript, on écrira :
PrinterJob job = PrinterJob.getPrinterJob(); String psMimeType = "application/postscript"; StreamPrintServiceFactory []factories = PrinterJob.lookupStreamPrintServices(psMimeType); if (factories.length > 0) { try { FileOutputStream outstream = new FileOutputStream(le nom du fichier sortie); StreamPrintService psPrinter = factories[0].getPrintService(outstream); job.setPrintService(psPrinter); PrintRequestAttributeSet aset = new HashPrintRequestAttributeSet(); job.setPrintable(l'objet Printable); job.print(aset); } catch (FileNotFoundException ex) { } catch (PrinterException ex) {} }
Book
Il est possible d’empiler des documents au sein d’un même job.
Book monLivre = new Book(); monLivre.append(l’objet Printable, pageFormat); monLivre.append(un autre objet Printable, pageFormat); printJob.setPageable(monLivre);
Le nombre de pages qui apparaît dans le dialogue d’impression est alors égal au nombre de append effectué dans le livre. Chaque document doit connaître la taille des documents imprimés avant lui, car il reçoit dans le paramètre pi, son numéro de page dans le document entier…