有没有办法在单个打印作业中打印(多个)缓冲图像列表?提前致谢。
1 回答
如果要打印多个图形图像,每页一个,请使用页面索引遍历这些页面并在每页上打印一个。例如,如果在以下数组中表示多个图像:
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 对象提供了这些信息。分页符位置的使用如以下代码片段所示:
/* 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 中。