【问题标题】:How can I get the total number of pages to be printed?如何获得要打印的总页数?
【发布时间】:2011-04-11 17:26:32
【问题描述】:

这是来自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 页。有没有办法访问这些信息?

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

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

【问题讨论】:

    标签: java printing


    【解决方案1】:

    我已经设法找到了解决方案。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-09-23
      • 1970-01-01
      • 1970-01-01
      • 2011-01-04
      • 2021-06-19
      • 2018-11-14
      • 1970-01-01
      相关资源
      最近更新 更多