基本的打印程序

本节说明如何创建一个基本的打印程序,该程序显示一个打印对话框,并将文本“ 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方法在作业发送到打印机后立即返回,因此用户应用程序无法检测到卡纸或缺纸问题。该作业控制样板足以用于基本的打印用途。

Printableinterface只有一种方法:

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