Spec-Zone .ru
спецификации, руководства, описания, API
|
Вы уже изучили, как использовать Printable
взаимодействуйте через интерфейс, чтобы напечатать единственный документ страницы. Однако, документы обычно являются больше чем одной физической страницей в длине. Разбиение на страницы является процессом идентификации расположения в документе где разрывы страницы и печатающий соответственно.
В случае печати нескольких графических изображений, один на страницу, использование страница индексируют, чтобы выполнить итерации через эти страницы и напечатать один на каждой странице. Например, если несколько изображений представляются в следующем массиве:
BufferedImage[] images = new BufferedImage[10];
тогда используйте print()
метод как показано в следующем фрагменте кода:
public int print(Graphics graphics, PageFormat pageFormat, int pageIndex) throws PrinterException { if (pageIndex < images.length) { graphics.drawImage(images[pageIndex], 100, 100, null); return PAGE_EXISTS; } else { return NO_SUCH_PAGE: } }
Если документ непрерывен, приложение должно вычислить, сколько контента может соответствовать на каждой странице, и повредить страницу в той точке. Если текстовый документ состоит из многих строк, то приложение должно вычислить, сколько из этих строк может соответствовать полностью на странице. Point
Чтобы вычислить height одной строки текста, используйте FontMetrics
Font font = new Font("Serif", Font.PLAIN, 10); FontMetrics metrics = graphics.getFontMetrics(font); int lineHeight = metrics.getHeight();
PageFormat
параметр описывает печатаемую область страницы. В частности чтобы найти вертикальный промежуток страницы используют следующий фрагмент кода:
double pageHeight = pageFormat.getImageableHeight();
Используйте следующий фрагмент кода, чтобы вычислить число строк, которые соответствуют на странице и числе разрывов страницы:
int linesPerPage = ((int)pageHeight)/lineHeight); int numBreaks = (textLines.length-1)/linesPerPage; int[] pageBreaks = new int[numBreaks]; for (int b=0; b < numBreaks; b++) { pageBreaks[b] = (b+1)*linesPerPage; }
Используйте print()
метод, чтобы вычислить печатаемую область по следующим причинам:
FontRenderContext
и это неявно в FontMetrics
объект, возвращенный графикой принтера, которая не доступна кроме внутренней части print()
метод.PageFormat
объект, который передают в print()
метод предоставляет эту информацию.Позиции разрыва страницы используются как представлено в следующем фрагменте кода:
/* Draw each line that is on this page. * Increment 'y' position by lineHeight * for each line. */ int y = 0; int start = (pageIndex == 0) ? 0 : pageBreaks[pageIndex-1]; int end = (pageIndex == pageBreaks.length) ? textLines.length : pageBreaks[pageIndex]; for (int line=start; line<end; line++) { y += lineHeight; g.drawString(textLines[line], 0, y); }
Если документ содержит 100 строк и только 48 подгонок строк на странице, то приложение печатает 3 страницы с разрывами страницы после 48 и 96 строк текста. Оставление 4 строками печатается на последней странице. Полный код для этого примера находится в PaginationExample.java
.
Следующие факторы упрощения используются в PaginationExample
код: