- 浏览: 7339411 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (1546)
- 企业中间件 (236)
- 企业应用面临的问题 (236)
- 小布Oracle学习笔记汇总 (36)
- Spring 开发应用 (54)
- IBatis开发应用 (16)
- Oracle基础学习 (23)
- struts2.0 (41)
- JVM&ClassLoader&GC (16)
- JQuery的开发应用 (17)
- WebService的开发应用 (21)
- Java&Socket (44)
- 开源组件的应用 (254)
- 常用Javascript的开发应用 (28)
- J2EE开发技术指南 (163)
- EJB3开发应用 (11)
- GIS&Mobile&MAP (36)
- SWT-GEF-RCP (52)
- 算法&数据结构 (6)
- Apache开源组件研究 (62)
- Hibernate 学习应用 (57)
- java并发编程 (59)
- MySQL&Mongodb&MS/SQL (15)
- Oracle数据库实验室 (55)
- 搜索引擎的开发应用 (34)
- 软件工程师笔试经典 (14)
- 其他杂项 (10)
- AndroidPn& MQTT&C2DM&推技术 (29)
- ActiveMQ学习和研究 (38)
- Google技术应用开发和API分析 (11)
- flex的学习总结 (59)
- 项目中一点总结 (20)
- java疑惑 java面向对象编程 (28)
- Android 开发学习 (133)
- linux和UNIX的总结 (37)
- Titanium学习总结 (20)
- JQueryMobile学习总结 (34)
- Phonegap学习总结 (32)
- HTML5学习总结 (41)
- JeeCMS研究和理解分析 (9)
最新评论
-
lgh1992314:
[u][i][b][flash=200,200][url][i ...
看看mybatis 源代码 -
尼古拉斯.fwp:
图片根本就不出来好吧。。。。。。
Android文件图片上传的详细讲解(一)HTTP multipart/form-data 上传报文格式实现手机端上传 -
ln94223:
第一个应该用排它网关吧 怎么是并行网关, 并行网关是所有exe ...
工作流Activiti的学习总结(八)Activiti自动执行的应用 -
ZY199266:
获取不到任何消息信息,请问这是什么原因呢?
ActiveMQ 通过JMX监控Connection,Queue,Topic的信息 -
xiaoyao霄:
DestinationSourceMonitor 报错 应该导 ...
ActiveMQ 通过JMX监控Connection,Queue,Topic的信息
从版本 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 中所示的三个方法的其中之一。
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 中所示的语法。
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 所示。
DocPrintJob job = ...; PrintRequestAttributeSet pras = ...; Doc doc = ...; job.print(doc, pras); |
通过调用 print()
,您触发了一个机制,该机制在一个单独的线程中向打印服务发送内容。
很明显,目前为止我们还没有提到打印对话框。该对话框是由系统弹出的,允许您通过图形方式配置打印机属性。图 1 显示新“Java 打印服务 API”的打印对话框。
有趣的是,打印机对话框的缺省行为已经用新的 API 更改了:缺省情况下对话框不显示。
所以我们必须使用 ServiceUI
类创建如上面所示的打印对话框。
ServiceUI
类提供一个单独的方法来显示打印机选择对话框:
printDialog(GraphicsConfiguration gc, int x, int y, PrintService[] services, PrintService defaultService, DocFlavor flavor, PrintRequestAttributeSet attributes) |
然后您使用返回的 PrintService
获取打印要用的 DocPrintJob
,如清单 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
即可。
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/
发表评论
-
【转】Coherence Event Processing by using Map Trigger Feature
2013-06-25 14:02 2083This article shows how to proc ... -
【转】Distributed Data Management in Oracle Coherence
2013-06-25 13:55 1894This article shows how to prov ... -
【转】How to distribute Spring Beans by using Coherence
2013-06-21 17:24 1971转载自: http://www.onli ... -
关于H2使用的那些事
2012-12-14 16:40 27222在项目中采用H2作为工 ... -
【转】ConcurrentHashMap之实现细节
2012-12-10 14:32 1776Conc ... -
【转】Java并发编程J.U.C之Condition
2012-12-10 13:14 1914转载自http://www.golde ... -
【转】Java并发编程J.U.C之锁的获取与释放
2012-12-10 13:07 1617转载自 http://www.g ... -
【转】JUC 基础内容概述
2012-12-10 13:01 2050Concurrent Programming in Jav ... -
【转】Java并发编程之ConcurrentHashMap
2012-12-10 12:56 1778ConcurrentHashMap Conc ... -
【转】单例模式完全解析
2012-12-07 12:58 1710本文将探讨单例模式的各种情况,并给出相应的建议。 单例模式应该 ... -
【转】JAVA并发容器代码随读
2012-12-06 15:29 2954转载自 http://rdc.taobao.c ... -
【转】Spring 事务管理高级应用难点剖析:
2012-12-04 16:29 2230转载自 http://www.ibm.com/deve ... -
【转】Struts2的线程安全 和Struts2中的设计模式----ThreadLocal模式
2012-12-04 15:11 4483转载自 http://downpour.ite ... -
Hibernate延迟加载和OpenSessionInView
2012-12-03 17:13 3172ThreadLocal& ... -
关于ThreadLocal分析和总结
2012-12-03 15:56 1863什么是ThreadLocal? ... -
【转】java线程阻塞中断和LockSupport的常见问题
2012-12-03 13:30 1793转载自 http://www.iteye ... -
java 中 ReentrantReadWriteLock的读锁和写锁的使用
2012-11-30 17:14 10441jdk文档中关于Reentr ... -
java 多线程中Semaphore信号量
2012-11-30 15:39 3755Semaphore信号量: 可以维护当前 ... -
Java 文件锁的使用
2012-11-30 13:21 4438多线程-内部锁、重进入 多线程 ... -
【转】线程安全与锁优化
2012-11-29 16:17 1890转载自http://xussen.iteye.com/blo ...
相关推荐
以前有人传过1.5下的调用方法,但是现在有的项目是在1.4下的,该方法就是解决这个问题的
在 jdk1.4 中则还可以通过 javax.print.PrintSerivceLookup 来查找定位一个打印服务对象。 2.需要开始一个打印工作。这也有几种实现方法:在 jdk1.4 之前可以通过 java.awt.print.PrintJob(jdk1.1 提供的,现在已经...
在早期的Java版本中,打印功能相对较弱,但在Java2平台和后续的JDK1.4中,打印功能得到了显著增强。 Java中的打印API主要集中在`java.awt.print`包中,这个包提供了实现打印的基本类和接口。在JDK1.4之后,`javax....
在 jdk1.4 中则可以通过 javax.print.ServiceUI 的 printDialog 显示打印对话框,然后调用 print 方法开始一个打印工作。 打印机对话框 打印机对话框是 Java 打印程序设计中一个重要的组件。它可以帮助用户选择...
在jdk1.4之前,`PrinterJob.printDialog`是主要的对话框展示方式,但在jdk1.4中,`ServiceUI.printDialog`提供了更为灵活和定制化的打印对话框体验。这些对话框不仅能够提供基本的打印选项,还能根据用户的选择动态...
在 jdk1.4 中则可以通过 javax.print.ServiceUI 的 printDialog 显示打印对话框,然后调用 print 方法开始一个打印工作。 打印机对话框是打印程序设计的重要组成部分。开始打印工作之前,可以通过 PrinterJob....
Java打印程序设计主要涉及到Java的打印API,这些API在`java.awt.print`包中,以及在JDK1.4及以后版本中增加的`javax.print`包及其子包`javax.print.event`和`javax.print.attribute`。Java的打印功能在早期版本中...
Java的打印API主要分布在`java.awt.print`包中,而在JDK1.4之后,新增了`javax.print`包,提供了更强大的打印服务API,使得开发者能够实现复杂的打印任务,如打印文字、图形、文件以及预览功能。 在Java中实现打印...
在 jdk1.4 中则可以通过 javax.print.ServiceUI 的 printDialog 显示打印对话框,然后调用 print 方法起先一个打印工作。 打印机对话框 3.1 Printable 的打印对话框 起先打印工作之前,可以通过 PrinterJob....
Java打印API主要分布在`java.awt.print`包中,针对JDK 1.4及后续版本,更多的打印相关类位于`javax.print`包及其子包`javax.print.event`和`javax.print.attribute`中。`javax.print`包集中处理打印服务的各类对象,...
在JDK 1.4之前的版本中,实现打印通常涉及到继承`java.awt.print.Printable`接口并实现其`print`方法。从JDK 1.4开始,可以通过`javax.print.PrintService`查找并选择合适的打印服务,进一步提高了打印的灵活性和...
随后,在JDK 1.4中,官方推出了一整套名为“Java打印服务API”(Java Print Service API)的强大工具集,极大地提升了Java程序的打印能力。 本篇文章将详细介绍如何设计Java打印程序,并通过一个具体的例子来演示如何...
而在JDK 1.4中,则可以通过`javax.print.PrintServiceLookup`查找定位打印服务。 2. **启动打印任务**:在JDK 1.4之前,通常通过`PrinterJob`类的`print`或`printAll`方法开始打印;也可以通过`PrinterJob....
8. **NIO.2(New I/O 2)**:虽然NIO(非阻塞I/O)是在JDK1.4引入的,但JDK1.5对其进行了扩展,添加了文件系统操作和文件观察者等功能,使得文件操作更加高效和灵活。 9. **类型安全的异常检查(Checked Exceptions...
Base64编码是一种在网络上传输二进制数据时常用的编码方式,它将任意二进制数据转换成可打印的ASCII字符序列,以便在不支持二进制传输的邮件系统或其他文本环境中安全地传递。Base64编码是通过将每3个字节(24位)的...
Linux 上多版本 JDK 和 Tomcat 的配置过程 Linux 作为一个流行的开源操作系统,广泛应用于服务器端和云计算领域。...在实际应用中,我们可以根据需要选择不同的 JDK 和 Tomcat 版本,以满足不同的需求。
更令人鼓舞的是,新发布的jdk1.4则提供了一套完整的"Java 打印服务 API" (Java Print Service API),它对已有的打印功能是积极的补充。利用它,我们可以实现大部分实际应用需求,包括打印文字、图形、文件及打印...
OpenJDK是Sun在2006年末把Java开源而形成的项目,也就是说Open JDK是Java SE平台版的开源和免费实现,由SUN和Java社区提供支持。Oracle JDK完全由Oracle公司开发,Oracle JDK是基于Open JDK源代码的商业版本。 二、...
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-...
- **JAXP1.4**:JDK1.6中JAXP(Java API for XML Processing)的版本为1.4,这标志着StAX正式成为JAXP家族的一员。 #### 四、使用CompilerAPI - **CompilerAPI**(JSR199)允许开发者动态编译Java源代码。这对于...