如何获得要打印的总页数?
这是Sun教程中的基本打印程序示例:
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 */ } }
当用户显示打印对话框(在第二行)时,他可以选择仅打印文档中的一系列页面。 我可以以某种方式获得要打印的页数吗? 例如,如果我有25页文档,但用户选择打印4-10范围,则只打印7页。 有什么方法可以访问这些信息吗?
我需要这个以显示一个进度条,随着每页打印的增加,但为此我需要知道要打印的页面总数。
那我怎么能得到这个数字呢?
我设法找到了解决方案。
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
过分,因为PageRanges
可能只是一个简单的n - m范围,但比抱歉更安全。