此 Java 教程是针对 JDK 8 编写的。本页面描述的示例和实践不利用后续版本中引入的改进,并且可能使用不再可用的技术。
请参阅 Java 语言更改,了解 Java SE 9 及其后续版本中更新的语言功能的摘要。
请参阅 JDK 发行说明,了解所有 JDK 发行版的新功能、增强功能以及已删除或弃用选项的信息。
您已经学会了如何使用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()
方法计算可打印区域的原因如下:
FontRenderContext
,这在打印机图形返回的FontMetrics
对象中是隐含的,而该对象只有在print()
方法内部才可用。print()
方法的PageFormat
对象提供了此信息。页面分页位置在以下代码片段中表示:
/* 绘制在此页上的每一行。 * 对于每一行,通过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
代码使用了以下简化因素: