Мне удалось найти решение.
Метод printDialog()
отображает собственное диалоговое окно печати, а метод printDialog(PrintRequestAttributeSet attributes)
- межплатформенное диалоговое окно. Параметр PrintRequestAttributeSet
заполняется параметрами, выбранными пользователем, включая диапазон страниц, выбранный для печати. Таким образом, после возврата из метода printDialog
можно запросить диапазон страниц, как в следующей кодовой последовательности:
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 */
}
}
Обратите внимание, что printParams
должен быть дан и для метода print()
. Из объекта PageRanges
диапазоны страниц могут быть получены в формате массива, то есть массив массивов длиной 1, означающих одну страницу, или массивы длиной 2, означающие смежные диапазоны страниц. См. javadoc для более подробной информации. Подсчитать общее количество страниц просто:
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;
}
Если пользователь выбирает не диапазон страниц, а параметр «Все страницы», тогда PageRanges
будет содержать диапазон (1, Integer.MAX_VALUE). Поэтому я говорю, что если вычисленное значение превышает количество страниц документа, то количество страниц, которые должны быть напечатаны, - это общее количество страниц документа (которое, я надеюсь, вы откуда-то знаете).
Алгоритм, возможно, излишний, так как, вероятно, PageRanges
будет только простым диапазоном n - m , но лучше безопасен, чем извините.