`
longgangbai
  • 浏览: 7339283 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

在 JDK 1.4 中打印

阅读更多
从版本 1.1 以后,好像 Java 平台的每个新发行版都更改了平台的打印支持框架。Merlin 也不例外。在这个月的 Merlin 的魔力中,John Zukowski 开始分两部分对最新功能进行讨论。请单击文章顶部或底部的 讨论讨论论坛与作者和其他读者分享您对本文的心得。
<!--START RESERVED FOR FUTURE USE INCLUDE FILES--><!-- include java script once we verify teams wants to use this and it will work on dbcs and cyrillic characters --><!--END RESERVED FOR FUTURE USE INCLUDE FILES-->

如果您已经使用过一段时间 Java 平台,您可能会象我一样因打印 API 的无休止更改而感到沮丧。Merlin 已经为 Java 平台带来了另一套打印功能和技术。这个被称为“Java 打印服务 API”(Java Print Service API)的最新的再版从 1999 起就已经应用于 Java Community Process 了。幸运的是,新 API 是积极的补充,应该在一段时间里代表对打印支持的最终重要修改。

使用新的“打印服务 API”进行打印的过程包括三部分:发现、规范和打印。第四部分是当打印任务有进展时进行通知,这部分是可选的。本文中将用到的所有类和接口都在 javax.print 包,或者它的其中一个子包中(请参阅 参考资料)。

定位一台打印机

执行打印作业的第一步是识别您想用来打印的一个或一组打印机。打印机对象被称为 打印服务,识别过程被称为 查找。支持查找任务的类被恰如其分地命名为 PrintServiceLookup 。要查找打印服务,您需要使用清单 1 中所示的三个方法的其中之一。


清单 1. 查找一个打印服务

  public static final PrintService 
    lookupDefaultPrintService()
  public static final PrintService[] 
    lookupPrintServices(DocFlavor flavor, AttributeSet attributes)
  public static final MultiDocPrintService[] 
    lookupMultiDocPrintServices(DocFlavor[] flavors, 
        AttributeSet attributes)

 

清单 1 中所示的这三个方法中的每一个都被用于不同的任务:

  • lookupDefaultPrintService() 返回缺省的打印服务。
  • lookupPrintServices() 返回支持打印特定文档类型(比如 GIF)的打印机集,和一个特定的属性集(比如双面打印)。
  • lookupMultiDocPrintServices() 支持一次打印多个文档。

定位了自己想使用的打印服务后,您需要创建一个打印作业。 稍后,您将向这个作业发送输出。查找过程返回的 PrintService 可以用其 createPrintJob() 方法创建作业,如下所示:

  PrintService printService = 
    PrintServiceLookup.lookupDefaultPrintService();
  DocPrintJob job = printService.createPrintJob();

指定输出格式

除了指定要打印到什么地方之外,您还必须指定打印文档的格式

 

这时,使用 DocFlavor 类(或它的其中一个子类)就很方便。 DocFlavor 类被用于识别您要打印的对象的 MIME(Multipurpose Internet Mail Extensions,多用途因特网邮件扩展)类型。MIME 类型描述应该如何解释电子数据。在处理电子邮件和附件时,您可能已经遇到过 MIME 类型,但 MIME 规范描述了识别数据格式的更通用的机制。

Merlin 提供了 DocFlavor 的七个子类,作为它自身用来定义格式的内部类。

 

这些类可以分为三个 MIME 类型子集:面向字节的、面向字符的和面向服务的。

 

面向字节的风格有:

  • BYTE_ARRAY
  • INPUT_STREAM
  • URL

面向字符的有:

  • CHAR_ARRAY
  • READER
  • STRING

面向服务的内部类是 SERVICE_FORMATTED

 

内部类中的内部类

每种风格类型支持它自己的 MIME 类型集。这些 MIME 类型也被定义为内部类。有 19 种面向字节的风格,如下所示:

  • AUTOSENSE
  • GIF
  • JPEG
  • PCL
  • PDF
  • PNG
  • POSTSCRIPT
  • TEXT_HTML_HOST
  • TEXT_HTML_US_ASCII
  • TEXT_HTML_UTF_16
  • TEXT_HTML_UTF_16BE
  • TEXT_HTML_UTF_16LE
  • TEXT_HTML_UTF_8
  • TEXT_PLAIN_HOST
  • TEXT_PLAIN_US_ASCII
  • TEXT_PLAIN_UTF_16
  • TEXT_PLAIN_UTF_16BE
  • TEXT_PLAIN_UTF_16LE
  • TEXT_PLAIN_UTF_8

面向字符的流比较单调,只提供两种格式:

  • TEXT_HTML
  • TEXT_PLAIN

面向服务的流包含三种格式:

  • PAGEABLE
  • PRINTABLE
  • RENDERABLE_IMAGE

您可以象下面这样配置风格(在这个示例中,将其配置为 PNG 图像):

DocFlavor flavor = DocFlavor.INPUT_STREAM.PNG;

指定打印属性

打印时,您可以指定一些属性来描述您想如何打印文档。示例属性包括副本数目、要打印哪一页和文档图像类型(例如横向和纵向)。要指定属性,您需要使用下面两个类的其中之一:

  • DocAttributeSet 为单个文档指定特性。
  • PrintRequestAttributeSet 指定单个打印作业的特性。

    要为打印运行指定属性,您需要创建一个适当的属性集( DocAttributeSetPrintRequestAttributeSet )的实例并用您期望的打印运行属性填充它

    对于未指定的那些属性,还要为其配置合理的缺省值。 javax.print.attribute 包拥有大约 70 个不同的属性,每个属性都被定义为单独的类。每个属性都使用一个或多个属性集。除本文中描述的两个属性集外,另外还有两个属性集可用于查询信息。 javax.print.attribute 包提供一个公共空间用来查找所有的类型。

下面我们将看到一个打印运行,它使用 PrintRequestAttributeSet 并把对象打印五份:

  PrintRequestAttributeSet pras = new HashPrintRequestAttributeSet();
  pras.add(new Copies(5));

 

请务必看一下 javax.print.attribute 包中所有可用属性的列表。

 

 

设置内容

Doc 接口为打印作业提供数据。该接口的实现者是 SimpleDoc 类。使用一个构造函数,提供内容作为第一个参数,风格作为第二个参数,属性作为第三个参数。该构造函数如下所示:

public SimpleDoc(Object printData, DocFlavor flavor, 
  DocAttributeSet attributes)

这就为我们留下了数据问题。答案取决于 DocFlavor。

如果您指定了 DocFlavor.INPUT_STREAM 这种风格,那么数据将由它的 InputStream 识别。

 

如果您的风格是 DocFlavor.BYTE_ARRAY ,那么数据就是一个字节数组( byte [ ] )。

所以,要打印 PNG 图像文件,您需要使用清单 2 中所示的语法。


清单 2. 设置内容

  DocFlavor flavor = DocFlavor.INPUT_STREAM.PNG;
  String filename = ...;
  FileInputStream fis = new FileInputSteam(filename);
  DocAttributeSet das = new HashDocAttributeSet();
  Doc doc = new SimpleDoc(fis, flavor, das);

 

打印

一旦您识别了打印机,并指定了输出格式、属性和内容,那么只要打印一下就行了。实际的打印作业是通过 DocPrintJob (是从 PrintService 检索到的)的 print() 来执行,如清单 3 所示。


清单 3. 一个打印作业

  DocPrintJob job = ...;
  PrintRequestAttributeSet pras = ...;
  Doc doc = ...;
  job.print(doc, pras);

通过调用 print() ,您触发了一个机制,该机制在一个单独的线程中向打印服务发送内容。

 

 

打印机对话框

很明显,目前为止我们还没有提到打印对话框。该对话框是由系统弹出的,允许您通过图形方式配置打印机属性。图 1 显示新“Java 打印服务 API”的打印对话框。


图 1. 打印机对话框
 

有趣的是,打印机对话框的缺省行为已经用新的 API 更改了:缺省情况下对话框不显示。

 

所以我们必须使用 ServiceUI 类创建如上面所示的打印对话框。

ServiceUI 类提供一个单独的方法来显示打印机选择对话框:

printDialog(GraphicsConfiguration gc, int x, int y, 
  PrintService[] services, PrintService defaultService, 
  DocFlavor flavor, PrintRequestAttributeSet attributes)

然后您使用返回的 PrintService 获取打印要用的 DocPrintJob ,如清单 4 所示。


清单 4. 使用对话框打印

  String filename = ...;
  PrintRequestAttributeSet pras = ...;
  DocFlavor flavor = ...;
  PrintService printService[] = 
    PrintServiceLookup.lookupPrintServices(flavor, pras);
  PrintService defaultService = 
    PrintServiceLookup.lookupDefaultPrintService();
  PrintService service = ServiceUI.printDialog(null, 200, 200,
    printService, defaultService, flavor, pras);
  if (service != null) {
    DocPrintJob job = service.createPrintJob();
    FileInputStream fis = new FileInputStream(filename);
    DocAttributeSet das = new HashDocAttributeSet();
    Doc doc = new SimpleDoc(fis, flavor, das);
    job.print(doc, pras);
  }

一个可运行的示例

我们将以一个可运行的示例结束本文,该示例将让您试验新的“打印服务 API”的功能。下面的代码本质上是由先前所有的代码示例组合而成的一个可运行程序。运行该程序时,请确保在命令行上输入了 PNG 图像文件的名称。如果您更倾向于打印一种不同的格式,只需更改 DocFlavor 即可。


清单 5. 一个打印示例

import javax.print.*;
import javax.print.attribute.*;
import java.io.*;
public class Printing {
  public static void main(String args[]) throws Exception {
    String filename = args[0];
    PrintRequestAttributeSet pras = 
      new HashPrintRequestAttributeSet();
    DocFlavor flavor = DocFlavor.INPUT_STREAM.PNG;
    PrintService printService[] = 
      PrintServiceLookup.lookupPrintServices(flavor, pras);
    PrintService defaultService = 
      PrintServiceLookup.lookupDefaultPrintService();
    PrintService service = ServiceUI.printDialog(null, 200, 200,
      printService, defaultService, flavor, pras);
    if (service != null) {
      DocPrintJob job = service.createPrintJob();
      FileInputStream fis = new FileInputStream(filename);
      DocAttributeSet das = new HashDocAttributeSet();
      Doc doc = new SimpleDoc(fis, flavor, das);
      job.print(doc, pras);
      Thread.sleep(10000);
    }
    System.exit(0);
  }
}

 

Merlin 的魔力的下一部分,您将了解如何打印屏幕或组件的内容。我们还将讨论与打印相关的事件处理任务,并且,我还将向您展示如何从打印操作中除去 sleep() 调用。

 

http://www.ibm.com/developerworks/cn/java/j-merlin/part10/

分享到:
评论

相关推荐

    jdk1.4java调用斑马打印机

    以前有人传过1.5下的调用方法,但是现在有的项目是在1.4下的,该方法就是解决这个问题的

    java打印控件

    在 jdk1.4 中则还可以通过 javax.print.PrintSerivceLookup 来查找定位一个打印服务对象。 2.需要开始一个打印工作。这也有几种实现方法:在 jdk1.4 之前可以通过 java.awt.print.PrintJob(jdk1.1 提供的,现在已经...

    Java打印程序设计.pdf

    在早期的Java版本中,打印功能相对较弱,但在Java2平台和后续的JDK1.4中,打印功能得到了显著增强。 Java中的打印API主要集中在`java.awt.print`包中,这个包提供了实现打印的基本类和接口。在JDK1.4之后,`javax....

    Java打印程序设计全攻略-打印预览.doc

    在 jdk1.4 中则可以通过 javax.print.ServiceUI 的 printDialog 显示打印对话框,然后调用 print 方法开始一个打印工作。 打印机对话框 打印机对话框是 Java 打印程序设计中一个重要的组件。它可以帮助用户选择...

    java相关打印程序全集

    在jdk1.4之前,`PrinterJob.printDialog`是主要的对话框展示方式,但在jdk1.4中,`ServiceUI.printDialog`提供了更为灵活和定制化的打印对话框体验。这些对话框不仅能够提供基本的打印选项,还能根据用户的选择动态...

    Java中的打印程序设计技术探索.pdf

    在 jdk1.4 中则可以通过 javax.print.ServiceUI 的 printDialog 显示打印对话框,然后调用 print 方法开始一个打印工作。 打印机对话框是打印程序设计的重要组成部分。开始打印工作之前,可以通过 PrinterJob....

    Java打印程序的设计说明.doc

    Java打印程序设计主要涉及到Java的打印API,这些API在`java.awt.print`包中,以及在JDK1.4及以后版本中增加的`javax.print`包及其子包`javax.print.event`和`javax.print.attribute`。Java的打印功能在早期版本中...

    Java打印程序设计全攻略

    Java的打印API主要分布在`java.awt.print`包中,而在JDK1.4之后,新增了`javax.print`包,提供了更强大的打印服务API,使得开发者能够实现复杂的打印任务,如打印文字、图形、文件以及预览功能。 在Java中实现打印...

    2022年Java打印程序设计全攻略Java教程.docx

    在 jdk1.4 中则可以通过 javax.print.ServiceUI 的 printDialog 显示打印对话框,然后调用 print 方法起先一个打印工作。 打印机对话框 3.1 Printable 的打印对话框 起先打印工作之前,可以通过 PrinterJob....

    java打印程序设计

    Java打印API主要分布在`java.awt.print`包中,针对JDK 1.4及后续版本,更多的打印相关类位于`javax.print`包及其子包`javax.print.event`和`javax.print.attribute`中。`javax.print`包集中处理打印服务的各类对象,...

    java调用打印机打印的相关教程

    在JDK 1.4之前的版本中,实现打印通常涉及到继承`java.awt.print.Printable`接口并实现其`print`方法。从JDK 1.4开始,可以通过`javax.print.PrintService`查找并选择合适的打印服务,进一步提高了打印的灵活性和...

    java打印程序设计.pdf

    随后,在JDK 1.4中,官方推出了一整套名为“Java打印服务API”(Java Print Service API)的强大工具集,极大地提升了Java程序的打印能力。 本篇文章将详细介绍如何设计Java打印程序,并通过一个具体的例子来演示如何...

    java定位打印

    而在JDK 1.4中,则可以通过`javax.print.PrintServiceLookup`查找定位打印服务。 2. **启动打印任务**:在JDK 1.4之前,通常通过`PrinterJob`类的`print`或`printAll`方法开始打印;也可以通过`PrinterJob....

    详细介绍JDK1.5的各种新特性

    8. **NIO.2(New I/O 2)**:虽然NIO(非阻塞I/O)是在JDK1.4引入的,但JDK1.5对其进行了扩展,添加了文件系统操作和文件观察者等功能,使得文件操作更加高效和灵活。 9. **类型安全的异常检查(Checked Exceptions...

    Base64编码API.rar

    Base64编码是一种在网络上传输二进制数据时常用的编码方式,它将任意二进制数据转换成可打印的ASCII字符序列,以便在不支持二进制传输的邮件系统或其他文本环境中安全地传递。Base64编码是通过将每3个字节(24位)的...

    linux上多版本JDK和Tomcat的配制过程

    Linux 上多版本 JDK 和 Tomcat 的配置过程 Linux 作为一个流行的开源操作系统,广泛应用于服务器端和云计算领域。...在实际应用中,我们可以根据需要选择不同的 JDK 和 Tomcat 版本,以满足不同的需求。

    Java打印程序设计

    更令人鼓舞的是,新发布的jdk1.4则提供了一套完整的"Java 打印服务 API" (Java Print Service API),它对已有的打印功能是积极的补充。利用它,我们可以实现大部分实际应用需求,包括打印文字、图形、文件及打印...

    JDK8新特性(pdf版)

    OpenJDK是Sun在2006年末把Java开源而形成的项目,也就是说Open JDK是Java SE平台版的开源和免费实现,由SUN和Java社区提供支持。Oracle JDK完全由Oracle公司开发,Oracle JDK是基于Open JDK源代码的商业版本。 二、...

    SLF4J全称为Simple Logging Facade for Java (简单日志门面),作为各种日志框架的简单门面或者抽

    slf4j-log4j12-1.7.32.jar:用于绑定 1.2版的log4j , 这是一个广泛使用的日志系统,当然你还要把log4j包加到classpath中slf4j-jdk14-1.7.32.jar:用于绑定 java.util.logging, 作为JDK 1.4 的loggingslf4j-simple-...

    JDK1.6的九大新特性

    - **JAXP1.4**:JDK1.6中JAXP(Java API for XML Processing)的版本为1.4,这标志着StAX正式成为JAXP家族的一员。 #### 四、使用CompilerAPI - **CompilerAPI**(JSR199)允许开发者动态编译Java源代码。这对于...

Global site tag (gtag.js) - Google Analytics