Java 教程是针对 JDK 8 编写的。本页面中描述的示例和实践不利用后续版本中引入的改进,并且可能使用不再可用的技术。
请参阅Java 语言更改了解 Java SE 9 及其后续版本中更新的语言功能的摘要。
请参阅JDK 发行说明了解有关所有 JDK 发行版的新功能、增强功能和已删除或已弃用选项的信息。
本节将介绍如何创建一个基本的打印程序,该程序显示打印对话框并将文本“Hello World”打印到所选打印机。
打印任务通常包括两个部分:
首先创建打印作业。表示打印作业的类和其他相关类位于java.awt.print包中。
import java.awt.print.*; PrinterJob job = PrinterJob.getPrinterJob();
然后提供将内容呈现到页面的代码,通过实现Printable接口。
class HelloWorldPrinter
implements Printable { ... }
...
job.setPrintable(new HelloWorldPrinter());
应用程序通常显示打印对话框,以便用户可以调整各种选项,例如副本数量、页面方向或目标打印机。
boolean doPrint = job.printDialog();
该对话框将一直显示,直到用户批准或取消打印。如果doPrint变量为true,则表示用户命令继续打印。如果doPrint变量为false,则表示用户取消了打印作业。由于显示对话框是可选的,返回的值仅供参考。
如果doPrint变量为true,则应用程序将通过调用PrinterJob.print方法请求打印作业。
if (doPrint) {
try {
job.print();
} catch (PrinterException e) {
// 作业未能成功完成
}
}
如果将作业成功发送到打印机,则会抛出PrinterException异常。然而,由于PrinterJob.print方法在作业发送到打印机后立即返回,用户应用程序无法检测到纸张卡住或纸张用完的问题。对于基本的打印用途,这个作业控制样板足够了。
Printable接口只有一个方法:
public int print(Graphics graphics,
PageFormat pf, int page)
throws PrinterException;
PageFormat类描述了页面方向(纵向或横向)、页面大小和可打印区域,单位为1/72英寸。可打印区域考虑了大多数打印机的边距限制(硬件边距)。可打印区域是这些边距内部的空间,在实践中通常进一步限制以留出头部或页脚的空间。
page参数是基于零的页码,将被渲染。
以下代码表示完整的Printable实现:
import java.awt.print.*;
import java.awt.*;
public class HelloWorldPrinter
implements Printable {
public int print(Graphics g, PageFormat pf, int page)
throws PrinterException {
// 我们只有一页,'page'是基于零的
if (page > 0) {
return NO_SUCH_PAGE;
}
// 用户(0,0)通常位于图像可打印区域之外,因此我们必须通过PageFormat中的X和Y值进行平移,以避免裁剪。
Graphics2D g2d = (Graphics2D)g;
g2d.translate(pf.getImageableX(), pf.getImageableY());
// 现在我们进行渲染
g.drawString("你好世界!", 100, 100);
// 告诉调用者此页是打印文档的一部分
return PAGE_EXISTS;
}
}
这个示例的完整代码在HelloWorldPrinter.java中。
向打印机发送Graphics实例基本上与将其呈现到屏幕相同。在这两种情况下,您需要执行以下步骤:
Graphics2D的其他操作一样简单。Printable.print()方法由打印系统调用,就像Component.paint()方法在显示器上绘制组件一样。打印系统将在页码0、1等调用Printable.print()方法,直到print()方法返回NO_SUCH_PAGE。print()方法可能会多次使用相同的页索引调用,直到文档完成。当用户指定多个副本与逐份选项时,将应用此功能。print()方法的调用。