基本印刷计划
原文: https://docs.oracle.com/javase/tutorial/2d/printing/printable.html
本节介绍如何创建显示打印对话框的基本打印程序,并将文本“Hello World”打印到所选打印机。
打印任务通常由两部分组成:
- 作业控制 - 创建打印作业,将其与打印机关联,指定份数和用户打印对话框交互。
- 页面映像 - 将内容绘制到页面,以及管理跨页面的内容(分页)。
首先创建打印机作业。表示打印机作业和大多数其他相关类的类位于 java.awt.print 包中。
import java.awt.print.*;PrinterJob job = PrinterJob.getPrinterJob();
接下来提供通过实现 Printable 接口将内容呈现给页面的代码。
class HelloWorldPrinterimplements 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) {// The job did not successfully// complete}}
如果将作业发送到打印机时出现问题,则会抛出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 HelloWorldPrinterimplements Printable {public int print(Graphics g, PageFormat pf, int page)throws PrinterException {// We have only one page, and 'page'// is zero-basedif (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 renderingg.drawString("Hello world!", 100, 100);// tell the caller that this page is part// of the printed documentreturn PAGE_EXISTS;}}
此示例的完整代码位于 HelloWorldPrinter.java 中。
将 Graphics 实例发送到打印机与将其呈现到屏幕基本相同。在这两种情况下,您都需要执行以下步骤:
- 绘制测试字符串就像描述绘制到
Graphics2D所描述的其他操作一样简单。 - 打印机图形具有更高的分辨率,对于大多数代码而言应该是透明的。
Printable.print()方法由打印系统调用,就像调用Component.paint()方法在显示器上绘制 Component 一样。打印系统将调用页面 0,1,…等的Printable.print()方法,直到print()方法返回NO_SUCH_PAGE。- 在文档完成之前,可以多次使用相同的页面索引调用
print()方法。当用户使用 collate 选项指定多个副本等属性时,将应用此功能。 PageFormat 的可成像区域决定剪辑区域。可计算区域在计算分页或如何跨打印页面跨越内容时也很重要,因为分页符取决于每页可以容纳多少。
注意:如果用户指定了不涉及特定页面索引的不同页面范围,则可能会跳过对某些页面索引的
print()方法调用。
