Java学习之打印功能
在很多应用中,需要把程序中生成的图表等文件通过打印机打印出来。需要调用出来windows中的打印机对话框,选择打印机,打印的份数等信息,然后把java中组织的要打印的信息,让打印机打印出来。
1、java中打印流程
PrinterJob类是控制打印的主要类,Java应用程序可以调用此类中的方法实现设置打印任务、打开“打印”对话框、执行页面打印等任务。本节将介绍控制打印任务的常用方法。
1).获取PrinterJob对象
PrinterJob job = PrinterJob.getPrinterJob();
2).打印任务的名称属性
job.setJobName("打印图形"); //会显示在打印任务列表当中,区分不同的打印任务
3).设置打印页面
job.setPrintable(new Printable() {
}
4).获取打印用户
job.getUserName();
5).打印状态
job.isCancelled()
6). 其他:
if (!job.printDialog()) //调出打印对话框
return;
job.print();//实现打印功能
2、设置打印页面
打印页面是指打印任务要执行打印的内容,这些内容可以是文本、图片、网页和图形等,在第26章中所讲的所有绘图内容都可以作为打印内容。打印内容必须实现Printable接口,该接口位于java.awt.print包中,接口中只包含一个方法。
语法如下:
print(Graphics graphics, PageFormat pageFormat, int pageIndex)
graphics:绘制打印页面的图形上下文。
pageFormat:将绘制打印页面的格式属性,如方向和大小。
pageIndex:当前打印页的索引。
下面举一个例子:
PrinterJob job = PrinterJob.getPrinterJob();
if (!job.printDialog())
return;
job.setPrintable(new Printable() {
private final int OVAL_WIDTH = 130; // 圆形的宽
private final int OVAL_HEIGHT = 130; // 圆形的高
public int print(Graphics graphics, PageFormat pageFormat,
int pageIndex) throws PrinterException {
if (pageIndex > 0)
return Printable.NO_SUCH_PAGE;
int x = (int) pageFormat.getImageableX();
int y = (int) pageFormat.getImageableY();
System.out.print("x:"+ x +"y:"+y);
Graphics2D g2 = (Graphics2D) graphics;
g2.setStroke(new BasicStroke(4.0F));
g2.setColor(Color.BLUE);
// 绘制1个圆形
g2.drawOval(x + 10, y + 10, OVAL_WIDTH, OVAL_HEIGHT);
g2.setColor(Color.CYAN);
return Printable.PAGE_EXISTS;
}
});
job.setJobName("打印图形");
job.print();
} catch (PrinterException e) {
e.printStackTrace();
}
3、多页打印
虽然实现Printable接口并重写print()方法,可以实现自己的打印页对象,但是在实际的程序开发中经常需要进行多页打印,这就需要使用java.awt.print包所提供的Book类对多个打印页进行封装。使用Book类的append()方法可以将多个打印页面添加到Book类的实例对象中,这可以看作是为一本书添加多个章节和页码。该方法有两种重载形式。语法如下:
append(Printable painter, PageFormat page)或append(Printable painter, PageFormat page, int numPages)
painter:实现Printable接口的类,也就是打印页。
page:将绘制打印页面的格式属性,如方向和大小。
numPages:要添加到Book中的页数。
static class PrintPage implements Printable {
public int print(Graphics graphics, PageFormat pageFormat,
int pageIndex) throws PrinterException {
// 获取可打印区域坐标的X位置
int x = (int) pageFormat.getImageableX();
// 获取可打印区域坐标的Y位置
int y = (int) pageFormat.getImageableY();
Graphics2D g2 = (Graphics2D) graphics;
// 绘制文本
g2.drawString("多页打印实例的第" + pageIndex + "页", x, y + 10);
return Printable.PAGE_EXISTS; // 返回PAGE_EXISTS
}
}
public static void main(String[] args) {
try {
PrinterJob job = PrinterJob.getPrinterJob();
if (!job.printDialog()) // 如果取消打印对话框
return; // 终止方法执行
Book printBook = new Book();
PageFormat pf = new PageFormat();
printBook.append(new PrintPage(), pf); // 添加1页
printBook.append(new PrintPage(), pf, 5); // 添加5页
job.setPageable(printBook); // 设置打印页
job.setJobName("多页打印"); // 设置打印任务名称
job.print(); // 执行打印
} catch (PrinterException e) {
e.printStackTrace();
}
}
4、打印预览
打印预览机制使用户可以在打印之前,在屏幕上查看要打印的内容及打印样式,从而避免错误打印而造成纸张浪费。各类办公软件、图像处理软件等都提供打印预览功能,而Java Swing技术并没有提供打印预览对话框组件,本节将介绍如何实现自己的打印预览机制。
在Printable接口的print()方法中,操作的graphics是打印机的图形上下文对象。打印预览的实现原理就是将该图形上下文替换为程序界面的图形上下文,在组件的paint()方法中调用Printable接口的print()方法即可实现打印预览。