2010-09-13 2 views
1

C'est l'exemple du programme d'impression de base du Sun tutorial:Comment puis-je obtenir le nombre total de pages à imprimer?

PrinterJob job = PrinterJob.getPrinterJob(); 
job.setPrintable(new HelloWorldPrinter()); 
boolean doPrint = job.printDialog(); 
if (doPrint) { 
    try { 
     job.print(); 
    } catch (PrinterException e) { 
     /* The job did not successfully complete */ 
    } 
} 

Lorsque l'utilisateur affiche la boîte de dialogue d'impression (sur la deuxième ligne), il peut choisir d'imprimer uniquement une série de pages du document. Puis-je obtenir le nombre de pages à imprimer? Par exemple, si j'ai un document de 25 pages, mais que l'utilisateur choisit d'imprimer la plage 4-10, alors seulement 7 pages seront imprimées. Y a-t-il un moyen d'accéder à cette information?

J'ai besoin de cela pour afficher une barre de progression qui augmente avec chaque page imprimée, mais pour cela j'ai besoin de connaître le nombre total de pages qui vont être imprimées.

Alors, comment puis-je obtenir ce numéro?

Répondre

4

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.

Questions connexes