基本的打印程序
本节说明如何创建一个基本的打印程序,该程序显示一个打印对话框,并将文本“ Hello World”打印到所选打印机。
打印任务通常包括两部分:
-
作业控制-创建打印作业,将其与打印机关联,指定份数,以及用户打印对话框交互。
-
页面成像—将内容绘制到页面上,并 管理 跨页面的内容(分页)。
首先创建打印机作业。表示打印机作业的类和大多数其他相关类位于java.awt.print包中。
import java.awt.print.*;
PrinterJob job = PrinterJob.getPrinterJob();
接下来,提供通过实现Printableinterface将内容呈现到页面的代码。
class HelloWorldPrinter
implements Printable { ... }
...
job.setPrintable(new HelloWorldPrinter());
应用程序通常会显示一个打印对话框,以便用户可以调整各种选项,例如份数,页面方向或目标打印机。
boolean doPrint = job.printDialog();
出现此对话框,直到用户批准或取消打印为止。如果用户给出了 continue 打印的命令,则doPrint
变量将为 true。如果doPrint
变量为 false,则用户取消打印作业。由于根本不显示对话框,因此返回的值仅是参考信息。
如果doPrint
变量为 true,则应用程序将通过调用PrinterJob.print
方法来请求打印作业。
if (doPrint) {
try {
job.print();
} catch (PrinterException e) {
// The job did not successfully
// complete
}
}
如果将作业发送到打印机有问题,将抛出PrinterException
。但是,由于PrinterJob.print
方法在作业发送到打印机后立即返回,因此用户应用程序无法检测到卡纸或缺纸问题。该作业控制样板足以用于基本的打印用途。
Printable
interface只有一种方法:
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 {
// We have only one page, and 'page'
// is zero-based
if (page > 0) {
return NO_SUCH_PAGE;
}
// User (0,0) is typically outside the
// imageable area, so we must translate
// by the X and Y values in the PageFormat
// to avoid clipping.
Graphics2D g2d = (Graphics2D)g;
g2d.translate(pf.getImageableX(), pf.getImageableY());
// Now we perform our rendering
g.drawString("Hello world!", 100, 100);
// tell the caller that this page is part
// of the printed document
return PAGE_EXISTS;
}
}
此示例的完整代码在HelloWorldPrinter.java中。
将Graphics实例发送到打印机与将其呈现到屏幕上基本相同。在这两种情况下,您都需要执行以下步骤:
-
绘制测试字符串 与描述到绘制
Graphics2D
的其他操作一样容易。 -
打印机图形具有更高的分辨率,这对于大多数代码而言应该是透明的。
-
打印系统调用
Printable.print()
方法,就像调用Component.paint()
方法在显示器上绘制 Component 一样。打印系统将在页面 0、1,..等上调用Printable.print()
方法,直到print()
方法返回NO_SUCH_PAGE
为止。 -
可以使用相同的页面索引多次调用
print()
方法,直到完成文档。当用户使用归类选项指定属性(例如多个副本)时,将应用此功能。 -
PageFormat 的可成像区域确定剪辑区域。可成像区域在计算分页或如何在打印页面上分配内容时也很重要,因为分页符由每个页面上可容纳的页面数量决定。
Note:
如果用户指定了不涉及特定页面索引的其他页面范围,则可以跳过某些页面索引对print()
方法的调用。