JDK 1.4 中打印,第 1 部分 英文原文
内容:
定位一个打印机
指定输出格式
指定打印属性
设置内容
打印
打印机对话框
一个可运行的示例
参考资料
关于作者
对本文的评价
相关内容:
Design patterns 101
Merlin 的魔力归档
Java 专区中还有:
教学
工具与产品
代码与组件
所有文章
实用技巧

John Zukowski(jaz@zukowski.net)
总裁,JZ Ventures 公司
2002 年 3 月

从版本 1.1 以后,好像 Java 平台的每个新发行版都更改了平台的打印支持框架。Merlin 也不例外。在这个月的 Merlin 的魔力中,John Zukowski 开始分两部分对最新功能进行讨论。请单击文章顶部或底部的讨论在讨论论坛与作者和其他读者分享您对本文的心得。

如果您已经使用过一段时间 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() 调用。

参考资料

  • 请单击文章顶部或底部的讨论参与本文的讨论论坛。
  • 学习如何使用完整的“Java 打印服务 API”。请参阅 Sun Microsystems 的正式文档。
  • JSR-006 Unified Printing API 简要说明了新打印服务的起源。
  • 通过“San Francisco printing primer with Java 1.1/1.2”(developerWorks,1999 年 4 月),重温在 java 平台上进行打印的朴素开端(还可以了解一点关于 IBM 的 San Francisco 项目的信息)。
  • 了解设计模式如何简化打印应用程序。请阅读“Using design patterns to simplify printing in Java 1.1”这篇文章(developerWorks,1997 年 9 月)。
  • 如果您对设计模式了解不多,您可以先从 David Gallardo 的“Design patterns 101”教程开始学习,该教程归 developerWorks 独家拥有。
  • Craig McElwee 的“Personalizing PDF files”提供了一个简单的基于 Perl 的方法用来将 PDF 文档定义为一个模板和生成动态 PDF(developerWorks,2000 年 2 月)。
  • 细读 John Zukowski 的关于使用 Merlin 的技巧的论文全集。
  • developerWorks 的 Java 技术专区您可以找到数百篇关于 Java 编程的各个方面的文章。
关于作者
John Zukowski 通过 JZ Ventures 公司从事战略性 Java 咨询,同时还担任一些 jGuru 的由社区推动的 Java 常见问题解答的常驻指导。他最近的著作有 Apress 出版的 Java Collections 和 Definitive Guide to Swing for Java 2(第 2 版)。可以通过 jaz@zukowski.net 与 John 联系。

http://www-900.ibm.com/developerWorks/cn/java/j-merlin/part10/index.shtml

JDK 1.4 中打印,相关推荐

  1. 在Java程序中打印java运行时参数

    在Java程序中打印java运行时参数 本文是基于CentOS 7.3系统环境,进行java的学习和使用 CentOS 7.3 1. java运行时参数 Java程序在运行时,主要分为两大类参数,一类 ...

  2. Java调用python打包的程序.exe,包括获取exec()中打印的日志,亲测有效

    python写了一个方法,windows平台上怎么被Java服务调用呢? 最简单的办法,python利用pyinstaller打包成.exe程序,Java程序通过Process调用,想同时获取.exe ...

  3. 如何在OS X中打印到PDF文件

    如何在OS X中打印文件到PDF文件? 其实不需要安装任何其他软件,OS X本身支持打印到PDF文件这个功能. 具体操作详见下面文章: Want to save a document or web p ...

  4. php提交字段打印,在隱藏的表單字段中提交的JSON編碼的PHP數組 - 在提交表單的頁面中打印時會產生奇怪的輸出...

    In the following SSCCE, in index.php, a button is printed. When you click this button, a form is sub ...

  5. tensorflow中打印一个tensor值

    tensorflow中打印一个tensor值 代码: import tensorflow as tf x = tf.ones(shape=[2, 3], dtype=tf.int32,name='x' ...

  6. JNI的native代码中打印日志到eclipse的logcat中

     1 添加ndk对log支持 若需要添加ndk对log的支持,只需要通过以下2步即可实现. 1.1 修改Android.mk 在Android.mk中添加如下内容: LOCAL_LDLIBS:=- ...

  7. 如何从Java中打印XML?

    本文翻译自:How to pretty print XML from Java? I have a Java String that contains XML, with no line feeds ...

  8. Spring Boot 2.1之后如何在启动日志中打印请求路径列表

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 作者 | 翟永超 来源 | http://blog.di ...

  9. Java 理论与实践: JDK 5.0 中更灵活、更具可伸缩性的锁定机制--转载

    多线程和并发性并不是什么新内容,但是 Java 语言设计中的创新之一就是,它是第一个直接把跨平台线程模型和正规的内存模型集成到语言中的主流语言.核心类库包含一个 Thread 类,可以用它来构建.启动 ...

  10. java输出文件中匹配的字段_Java如何从文件中打印与给定模式匹配的所有字符串?...

    在Java编程中,如何从文件中打印与给定模式匹配的所有字符串? 以下示例显示了如何使用Util.regex类的Patternname.matcher()方法从文件中打印与给定模式匹配的所有字符串. p ...

最新文章

  1. SAP PM技术对象的功能
  2. 开始启动OPNsense的汉化工作
  3. c语言链表缓冲区,求助! 链表和scanf()缓冲区问题
  4. RCNN (Regions with CNN) 目标物检测
  5. Swift - 本地消息的推送通知(附样例)
  6. javascript中变量的判断
  7. JZOJ 3871. 【NOIP2014八校联考第4场第1试10.19】无聊的游戏(game)
  8. lvs,haproxy实现负载均衡
  9. Redis源码解析(1)——源码目录介绍
  10. 小白vue_web前端开发:新手学习前端应该先学vue还是react?
  11. 口语技巧-Part2答题逻辑
  12. Audio驱动开发之音频链路学习笔记
  13. VB.NET外部程序调用总结下
  14. Nginx部署前端项目
  15. 计算机组成原理期末考试题库(超级多的那种)
  16. 生物群落多样性——β多样性
  17. linux 改成utc时间_linux – 如何将时区设置为UTC-8
  18. 北邮计算机专硕在微软实习转正,【微软中国(Microsoft)实习生面试】很随意很简单,毕竟实习生转正比率很低。-看准网...
  19. 3D动画展示--3D图片旋转展示
  20. 用html语言制作表白动画,抖音很火的卡通做我女朋友表白html源码

热门文章

  1. 全景视频预测头部移动-Predicting Head Movement in Panoramic Video: A Deep Reinforcement Learning Approach
  2. 调研:暴力恐怖犯罪识别(图像识别)
  3. 编码原则 之 Separation of Concerns
  4. 安全加密邮箱哪个好?
  5. HDU 6438 Buy and Resell (优先队列 or 贪心)
  6. 原来小米手机的电源键不止能用来关机,这么多实用功能,别浪费了
  7. 用以太坊区块链和jwt token保证Asp.Net Core的API交互安全(上)
  8. SSM框架学习(2)CRM项目软件开发周期
  9. 大一C语言 课设(餐厅管理系统)
  10. 经验分享:SecureCRT远程登录树莓派开发板