我设法找到了解决方案.
printDialog()方法显示本机打印对话框,但printDialog(PrintRequestAttributeSet属性)方法显示跨平台对话框.使用用户的选择填写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范围,但比抱歉更安全.