文档

Java™教程
隐藏目录
打印多页文档
路径: 2D 图形
课程: 打印

打印多页文档

您已经学会了如何使用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类创建表示(x,y)位置的点。

要计算单行文本的高度,请使用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()方法计算可打印区域的原因如下:

页面分页位置在以下代码片段中表示:

/* 绘制在此页上的每一行。
 * 对于每一行,通过lineHeight增加'y'位置。
 */
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代码使用了以下简化因素:


上一页: 使用打印设置对话框
下一页: 使用打印服务和属性