Как я могу получить общее количество страниц для печати? - PullRequest
1 голос
/ 13 сентября 2010

Это базовый пример программы печати из учебника 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 страниц.Есть ли какой-то доступ к этой информации?

Мне это нужно для того, чтобы показывать индикатор выполнения, который увеличивается с каждой напечатанной страницей, но для этого мне нужно знать общее количество страниц, которые будут напечатаны.

Так как я могу получить этот номер?

1 Ответ

4 голосов
/ 15 сентября 2010

Мне удалось найти решение.

Метод 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 , но лучше безопасен, чем извините.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...