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

时间:2010-09-13 15:04:14

标签: java printing

这是Sun tutorial

中的基本打印程序示例
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页。有没有办法访问这些信息?

我需要这样才能显示随每页打印而增加的进度条,但为此我需要知道要打印的页面总数。

那我怎么能得到那个号码呢?

1 个答案:

答案 0 :(得分:4)

我设法找到了解决方案。

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