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

标签 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 页。有什么办法可以访问这些信息吗?

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

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

最佳答案

我设法找到了解决方案。

printDialog() 方法显示 native 打印对话框,但 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 范围,但安全总比后悔好。

关于java - 如何获得要打印的总页数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3701644/

相关文章:

android - 为Android选择热敏打印机

javascript - windows.print 结果为空页

windows - 在 Windows 上打印源代码

javascript - 如何使用 JS 打印 HTML 部分?

java - 应用程序 sati(进程 com.example.sati)意外停止。请重试。[强制关闭]

Java 泛型 : Restricting a class to specific implementations.

java - Eclipse (IBM AST) 找不到现有文件的导入

java - Akka Camel 和 Spring

java - 在 Java 中带参数运行 Windows .exe

java - 在java中等待输入时打印到控制台?