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

发布于 2021-01-30 16:48:36

这是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页。是否有某种方式可以访问该信息?

我需要它来显示进度条,该进度条随着每打印一页的增加而增加,但是为此,我需要知道将要打印的总页数。

那我怎么得到那个数字呢?

关注者
0
被浏览
87
1 个回答
  • 面试哥
    面试哥 2021-01-30
    为面试而生,有面试问题,就找面试哥。

    我设法找到了解决方案。

    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 范围,但是比后悔更安全。



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看