J'ai réussi à trouver une solution.
La méthode printDialog()
affiche une boîte de dialogue d'impression native, mais la méthode printDialog(PrintRequestAttributeSet attributes)
affiche une boîte de dialogue multiplate-forme. Le paramètre PrintRequestAttributeSet
est rempli avec les sélections de l'utilisateur, y compris la plage de pages sélectionnée pour être imprimée. Ainsi, après le retour de la méthode printDialog
, la plage de pages peut être interrogé, comme dans la séquence de code suivant:
PrinterJob job = PrinterJob.getPrinterJob();
job.setPrintable(new HelloWorldPrinter());
HashPrintRequestAttributeSet printParams = new HashPrintRequestAttributeSet();
boolean ok = job.printDialog(printParams);
if (ok) {
PageRanges pageRanges = (PageRanges) printParams.get(PageRanges.class);
int pagesToBePrinted = getNumberOfPages(pageRanges);
try {
job.print(printParams);
} catch (PrinterException e) {
/* The job did not successfully complete */
}
}
Notez que le printParams
doit être donnée à la méthode print()
ainsi. A partir de l'objet PageRanges
, les plages de pages peuvent être obtenues en format de tableau, c'est-à-dire un tableau de tableaux de 1 longueur signifiant une seule page chacun ou des tableaux de 2 longueurs signifiant des plages contiguës de pages. Voir le javadoc pour plus de détails. Pour calculer le nombre total de pages est simple:
int getNumberOfPages(PageRanges pageRanges) {
int pages = 0;
int[][] ranges = pageRanges.getMembers();
for (int i = 0; i < ranges.length; i++) {
pages += 1;
if (ranges[i].length == 2) {
pages += ranges[i][1] - ranges[i][0];
}
}
pages = Math.min(pages, totalPagesOfDocument);
return pages;
}
Si l'utilisateur ne sélectionne pas une plage de pages, mais l'option « Toutes les pages » à la place, le PageRanges
contiendra la plage (1, Integer.MAX_VALUE). Donc, je dis que si la valeur calculée dépasse le nombre de pages du document, alors le nombre de pages à imprimer est le nombre total de pages du document (que j'espère que vous connaissez de quelque part).
L'algorithme est peut-être exagéré, comme probablement le PageRanges
ne sera que d'un simple n-m gamme, mais il vaut mieux prévenir que guérir.