我设法找到了解决方案。
该
printDialog()方法显示一个本机打印对话框,但是该
printDialog(PrintRequestAttributeSetattributes)方法显示一个跨平台对话框。
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) { }}注意,该方法
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 范围,但是比后悔更安全。



