当前位置: 首页 > 面试题库 >

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

乜嘉悦
2023-03-14
问题内容

这是Sunhtml" target="_blank">教程中的基本打印程序示例:

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



 类似资料:
  • 问题内容: 我正在寻找一种获取已安装打印机列表的可能性。我在Windows操作系统上使用JDK 1.6。有人知道解决方案吗? 先感谢您。 问题答案: 只是想添加一些片段:

  • 问题内容: 我有一个填充有动态数据的表,要处理在打印中的问题,我在其中应用了一些分页符,一切正常,但是在打印时,我需要在每页下方显示一个分页,例如“ Page 1 of 3 ”,依此类推。我已经尝试过使用CSS,但是我只能用它打印当前页码。还有其他方法可以实现吗?这是我的代码 问题答案: 您是否尝试过:

  • 问题内容: 我生成了x的两个矩阵: 第一矩阵:和。 第二矩阵:和。 使用以下代码,第一个矩阵花费了8.52秒完成: 使用此代码,第二个矩阵花费了259.152秒来完成: 运行时间显着不同的原因是什么? 正如评论所说,仅打印需要秒,而给。 正如其他指出它对他们正常工作的人一样,例如,我尝试了Ideone.com,这两段代码以相同的速度执行。 测试条件: 我从 Netbeans 7.2 运行了此测试,

  • 问题内容: 我正在使用SQLite访问数据库并检索所需的信息。我正在Python 2.6版中使用ElementTree来创建具有该信息的XML文件。 码 尝试次数 我已经尝试使用它代替上面的最后一行代码,但是它根本没有编辑XML的布局- 仍然是一团糟。 我还决定摆弄一下,然后尝试做:而不是将其打印到Python shell上,这会产生错误 AttributeError:’unicode’对象没有属

  • 问题内容: 我正在使用ASP NetSprites包在我的网站上创建CSSSprites。 它正在工作,但是生成的图像在打印时不会出现。 在HTML级别生成的代码是: 当用户打印页面时,如何显示徽标图像? 我尝试将其添加到我的print.css样式表中,但没有成功: print.css工作正常,它正在格式化页面,如我所希望的那样,用于页面上的其他元素。我唯一的问题是在打印时无法显示网站徽标图像。

  • 问题内容: 我实际上正在开发一个将打印机共享到服务器的Java应用程序,并且我需要这个应用程序来获取它共享的打印机的品牌和型号。 我知道这个问题被问过三四次,但似乎没有人找到答案。 我已经试过这段代码: 第一次打印总是返回一个 空 字符串,第二个打印得到 NullPointerException 。 一些研究将我引导至此页面:http : //bugs.sun.com/bugdatabase/vi