如何获得要打印的总页数?
这是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
只会是一个简单的 n - m 范围,但是比后悔更安全。