# 打印多页文档

> 原文： [https://docs.oracle.com/javase/tutorial/2d/printing/set.html](https://docs.oracle.com/javase/tutorial/2d/printing/set.html)

您已经学习了如何使用 [`Printable`](https://docs.oracle.com/javase/8/docs/api/java/awt/print/Printable.html) 界面打印单页文档。但是，文档的长度通常不止一个。 _ 分页 _ 是识别文档中相应分页和打印的位置的过程。

如果打印多个图形图像，每页一个，使用页面索引来遍历这些页面并在每个页面上打印一个。例如，如果以下数组中表示了多个图像：

```
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`](https://docs.oracle.com/javase/8/docs/api/java/awt/Point.html) 类创建一个表示（x，y）中位置的点

要计算单行文本的高度，请使用 [`FontMetrics`](https://docs.oracle.com/javase/8/docs/api/java/awt/FontMetrics.html) 类。

```
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()`方法之外不可用。
*   在打印之前可能不会公开页面格式。由于用户在打印对话框中选择了横向模式，因此需要考虑此设置。传递给`print()`方法的`PageFormat`对象提供此信息。

使用分页符位置，如以下代码片段所示：

```
/* 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 行，则应用程序将在 48 行和 96 行文本后打印 3 页分页符。其余 4 行打印在最后一页上。此示例的完整代码位于 [`PaginationExample.java`](examples/PaginationExample.java) 中。

`PaginationExample`代码中使用了以下简化因子：

*   每个页面都有相同的高度。
*   使用相同的字体。