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()
方法的调用。