|
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:
}
}
Если документ непрерывен, приложение должно вычислить, сколько контента может соответствовать на каждой странице, и повредить страницу в той точке. Если текстовый документ состоит из многих строк, то приложение должно вычислить, сколько из этих строк может соответствовать полностью на странице. class создает точку, представляющую расположение в (x, y)
Чтобы вычислить height одной строки текста, используйте class.
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 код: