在 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
指定单个打印作业的特性。
要为打印运行指定属性,您需要创建一个适当的属性集( DocAttributeSet
或 PrintRequestAttributeSet
)的实例并用您期望的打印运行属性填充它。
对于未指定的那些属性,还要为其配置合理的缺省值。 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/
在 JDK 1.4 中打印相关推荐
- 在Java程序中打印java运行时参数
在Java程序中打印java运行时参数 本文是基于CentOS 7.3系统环境,进行java的学习和使用 CentOS 7.3 1. java运行时参数 Java程序在运行时,主要分为两大类参数,一类 ...
- Java调用python打包的程序.exe,包括获取exec()中打印的日志,亲测有效
python写了一个方法,windows平台上怎么被Java服务调用呢? 最简单的办法,python利用pyinstaller打包成.exe程序,Java程序通过Process调用,想同时获取.exe ...
- 如何在OS X中打印到PDF文件
如何在OS X中打印文件到PDF文件? 其实不需要安装任何其他软件,OS X本身支持打印到PDF文件这个功能. 具体操作详见下面文章: Want to save a document or web p ...
- php提交字段打印,在隱藏的表單字段中提交的JSON編碼的PHP數組 - 在提交表單的頁面中打印時會產生奇怪的輸出...
In the following SSCCE, in index.php, a button is printed. When you click this button, a form is sub ...
- tensorflow中打印一个tensor值
tensorflow中打印一个tensor值 代码: import tensorflow as tf x = tf.ones(shape=[2, 3], dtype=tf.int32,name='x' ...
- JNI的native代码中打印日志到eclipse的logcat中
1 添加ndk对log支持 若需要添加ndk对log的支持,只需要通过以下2步即可实现. 1.1 修改Android.mk 在Android.mk中添加如下内容: LOCAL_LDLIBS:=- ...
- 如何从Java中打印XML?
本文翻译自:How to pretty print XML from Java? I have a Java String that contains XML, with no line feeds ...
- Spring Boot 2.1之后如何在启动日志中打印请求路径列表
点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 作者 | 翟永超 来源 | http://blog.di ...
- Java 理论与实践: JDK 5.0 中更灵活、更具可伸缩性的锁定机制--转载
多线程和并发性并不是什么新内容,但是 Java 语言设计中的创新之一就是,它是第一个直接把跨平台线程模型和正规的内存模型集成到语言中的主流语言.核心类库包含一个 Thread 类,可以用它来构建.启动 ...
- java输出文件中匹配的字段_Java如何从文件中打印与给定模式匹配的所有字符串?...
在Java编程中,如何从文件中打印与给定模式匹配的所有字符串? 以下示例显示了如何使用Util.regex类的Patternname.matcher()方法从文件中打印与给定模式匹配的所有字符串. p ...
最新文章
- mysql不具有的特征是_MySQL中的SQL特征(转)
- Qt Dock Widgets 官方示例的翻译
- (python的坑,坑的我头晕,下行循环写后根遍历)
- Heron:来自Twitter的新一代流处理引擎应用篇
- ^_-诚征BLOG友情连接
- java多线程基本概述(二)——Thread的一些方法
- 计算学生成绩 c语言,c语言项目实战2学生成绩的输入与计算.ppt
- 微信开发者工具命令行_微信开发者工具 Linux版
- 保定2021高考学校成绩查询,2021年保定高考成绩排名查询,成绩什么时候可以查询...
- SpringCloud面试题(一)
- 熊猫烧香.威金.落雪.SXS.ARP.网络执法管.AUTORUN.INF等高危病毒清除
- 手机投屏不是全屏怎么办_手机投屏win10怎么退出全屏详细图文教程
- Web简易二手网购网页
- 生命周期组件框架:带有多状态机的单实现类
- 读书笔记- 韩鹏杰 -《道德经》
- Ubuntu文件权限设置
- t在java语言中是什么意思
- word07如何删除分隔符
- Titan漫谈(二)——安装配置
- 译文Deep Learning in Bioinformatics --深度学习在生物信息学领域的应用(2)