如何获得要打印的总页数?

这是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范围,但比抱歉更安全。