java打印功能开发手册

java打印功能开发手册
java打印功能开发手册

Java 高级编程: 打印

Java Pro Programming: Printing

学习如何使用打印服务API

Learn how to use the Print Service API

作者:Brett Spell

翻译:ice_x

修订:Cedar

版权声明:

可以任意转载可以任意转载,,转载时请务必以超链接形式标明文章原始出处和作者信息及本声明

英文原文: https://www.360docs.net/doc/e618296123.html,/javaworld/jw-07-2005/jw-0725-print.html 中文原始翻译: https://www.360docs.net/doc/e618296123.html,/resource/article/43/43658_java_print.html 中文修订版本: https://www.360docs.net/doc/e618296123.html,/Java_Print_API_ProStudy.pdf

关键词: Java Programming print PrintJob

摘要

在这篇文章里,来自Pro Java Programming (Apress, June 2005)专家Brett Spell 解释了如何一步一步的定位打印设备,创建打印工程,创建一个Doc 接口的实例,以此来描述你想要打印的数据并且初始化打印。(4500字,2005年7月25日ice_x 原稿原稿;;6900字,2006年5月19日Cedar 修订修订))

自从问世以来,Java在多数方面都成长迅速。但一直以来,打印输出是Java最弱的方面之一。事实上,Java1.0根本不支持任何打印功能。Java1.1在java.awt包里包含了一个叫做PrintJob的类,但是这个类提供的打印功能十分粗糙和不可靠。当Java1.2 (或者说“Java2”)出现后,依据PrinterJob以及在新的java.awt.print包里定义的类和接口,它提供了一个彻底分离的打印设计机制(称为Java 2D printing API)。这些改进使得基于PrintJob 的机制(即AWT printing)基本上被淘汰了,但是PrintJob从未被真正废弃,而且至少在本文里仍然是一个技术上支持的类。

在J2SE 1.3里又增加了一些变化,利用在java.awt包里适合的JobAttributes和PageAttributes两个类,PrintJob的功能扩展到设定任务和页面的属性。随着J2SE 1.3的发布,打印能力变得足够强壮,但是在关联两个完全分离的打印机制时,仍然存在一些问题。比如,两种机制都使用java.awt.Graphics类的一个实例,来展现打印内容,意味着所有要打印的东西都必须用一张图片表示。此外,更新后的PrintJob工具变得更强壮,但仅提供了很有限的任务相关的属性设置。最终,两种机制都没有提供一种选择目标打印机的可编程的途径。

Java打印最大的改变发生于J2SE 1.4的发布,其带来的Java打印服务API。第三代Java打印支持的诞生,借助于javax.print包的PrintService和DocPrintJob接口的实现突破了上述限制。因为新的API代表了两种旧的打印机制功能定义的父集,是你应该通常使用的并是本文的焦点。

从较高层次上来看,使用Java打印服务API的步骤是很简单的:

1.定位打印服务(打印机),可以限制返回的列表,只要那些符合您应用程序需要的打印机。打印服务由PrintService的实例体现。

2.通过调用PrintService接口中定义的createPrintJob() 方法创建一个打印任务。打印任务由DocPrintJob的一个实例代表。

3.创建一个Doc接口的实现,来描述你想要打印的数据。你也可以创建一个PrintRequestAttributeSet的实例,来定义你想要的打印选项。

4.通过DocPrintJob接口定义的print()方法来初始化打印,指定你先前创建的Doc,指定PrintRequestAttributeSet或者空值。

现在你可以检查每一步,并试着完成它们。

注意

在这篇文章里,我将交替使用打印机打印机打印机和打印服务打印服务

打印服务,因为在大部分情况下,打印服务不亚于一台物理的打印机。 更一般意义上

的打印服务反映了理论上可以发送到打印机以外的输出。举例

来说,打印服务可能根本不打印东西,而是写入磁盘上的文件。

换句话说,所有的打印机要表示为打印服务,但是并不是所有

打印服务必须和一台物理的打印机关联。尽管如此,实际上你

通常会把你的内容到打印机,这就是我为什么有时候使用更为

简便的打印机打印机打印机这个词,来代替技术上更精确的打印服务打印服务打印服务。

1.定义打印服务

Locating print services

你可以使用在PrintServiceLookup 类中定义的三种静态方法中的一种来定义。最简单的一种就是lookupDefaultPrintService(),正如它的名字一样,它返回一个服务指向您默认的打印机:

PrintService service = PrintServiceLookup.lookupDefaultPrintService();

虽然用这个办法简单而方便,用它来选择输出所需的打印机,意味着你默认了用户缺省的打印机的功能,总是满足正确输出您所需的程序数据。实际上,你通常想要选择的是那种可以处理您的数据类型,并可以符合您的应用所需特性,例如彩色或者两面打印。为了从列表中返回所有已定义的打印机序列,或满足您需要功能的打印机序列,您可以使用余下两个在PrintServiceLookup 中定义的静态方法,即lookupPrintServices()或

lookupMultiDocPrintServices()。

lookupPrintServices()方法接受两个参数:一个DocFlavor 的实例和一个实现

AttributeSet 接口的对象。你马上将看到,你可以使用两者中任意一个或同时来限制返回的打印机列表,但是lookupPrintServices()允许你指定这两个参数中的任意一个或同时空值。如果把两者都设为空,那么你实际要求得到的返回值将是所有可用的打印机列表。截止目前为止,你还没有真正地查看过PrintService 中定义的方法,其中一个getName() 方法返回了一个代表打印机的名字的字符串。你可以通过编译和执行下面的代码,来列出你的系统可用的打印机:

PrintService[PrintService[ ] services = PrintServiceLooku ] services = PrintServiceLookup.lookupPrintServices(null, null);p.lookupPrintServices(null, null);p.lookupPrintServices(null, null);

for (int i = 0; i < services.length; i++) {for (int i = 0; i < services.length; i++) {

System.out.println(services[i].getName()); System.out.println(services[i].getName());

}

例如,你能访问到连接在名为PrintServer服务器上的Alpha,Beta和Gamma打印机,用以上代码可以得到以下输出:

Alpha

\\PrintServer

PrintServer\\Alpha

Beta

PrintServer\\Beta

\\PrintServer

Gamma

PrintServer\\Gamma

\\PrintServer

现在让我们来查看那些你可以传给lookupPrintServices()方法的参数,并观察如何返回拥有特殊功能的打印机。

2.DocFlavor

在调用lookupPrintService()方法时,第一个你可以指定的参数是一个DocFlavor类的实例,它描述了将要打印的数据的类型和如何存储。在大部分情况下,并不需要您去创建一个新的实例因为Java包含了很多预先定义的实例,你只要简单地传递其中一个实例的引用给lookupPrintServices()。尽管(事情通常都是这样地简单),我们还是来看一下DocFlavor的构造和方法,来理解打印服务如何使用这个实例。

创建DocFlavor实例需要的两个参数都是字符串,一个是MIME (Multipurpose Internet Mail Extensions)类型,另一个是表现类的名字。MIME类型被DocFlavor用于描述数据类型。例如,你要打印一个gif文件,你需要使用MIME类型是image/gif的DocFlavor。类似地,如果打印文本,你可能要用text/plain,或者是打印HTML文档,你则要用text/html。

3.表现类

Representation class

MIME类型描述将要打印数据的类型,表现类则表示这些数据如何处理并交付打印服务。DocFlavor包含了七个静态的内部类,每一个对应一个表现类及不同的封装方法。

表1中列出了DocFlavor中定义的静态内部类的名称,及想对应的表现类。注意除了SERVICE_FORMATTED(一会我会更详细地解释),每一个类都说明了和"binary"或"character"相对应。事实上,这些差别是人为的,因为"character"数据类型本身就是一种特殊的binary类型。这种情况下,我们说的二进制(binary)数据包括人们可以看懂的字符以及一些格式化的字符比如tabs,回车,等等。当然,这些差别很重要,反映出面向字符的表现类并不适合存储二进制打印数据。

例如,你不会将一个表现为gif图片的东西存储到字符数组或者String对象中,同时也不会通过实现一个Reader接口来访问它。另一方面,因为字符数据也是一种特殊的二进制数据,它完全适合储存文本信息到字节数组里或者通过InputStream或者一个URL来访问它。

Table 1. DocFlavor的表现类

在DocFlavor中定义的每一个静态内部类对应一个表现类,但是请记住我说过,每一个DocFlavor的实例封装了一个表现类和一个MIME来确认要打印的数据的类型。要访问这样一个DocFlavor实例,其不仅与表现类,并且与你想要打印的内容的MIME类型相关,你需要参考表1列出的一个内部类。例如,我们假设你要打印一个能在网上通过URL访问的gif文件。这里,显然的表现类选择是https://www.360docs.net/doc/e618296123.html,.URL,在DocFlavor中对应的静态类就是URL类。如果你查看那个内部类的文档,你会发现其实它定义了一系列静态的内部类,每一个对应一种打印机普遍支持的MIME类型。表2描述了在DocFlavor.URL里的内部类极其对应的MIME。

因为要通过URL 打印gif 图片,你可以用以下代码来访问获得一个的DocFlavor 实例

DocFlavor flavor = DocFlavor.URL.GIF;

该代码创建了一个DocFlavor 静态实例的引用,其代表类是https://www.360docs.net/doc/e618296123.html,.URL ,MIME 是image/gif 。

表2 列出的类在DocFlavor.URL 的类中定义,那么其他六个在DocFlavor 内定义的内部类呢?我们依然会等一下再来讨论SERVICE_FORMATTED ,这之前,看看与二进制数据相关的所有三种类型(BYTE_ARRAY, INPUT_STREAM, 和URL )相关的内部类,它们的名字和表2中列出的一样。例如,如果你把gif 数据储存到了一个字节数组里,那么你可以用以下代码: DocFlavor flavor = DocFlavor.BYTE_A DocFlavor flavor = DocFlavor.BYTE_ARRAY.GIF; RRAY.GIF;

正如有三个与二进制类型关联的DocFlavor 有它们自己的内部类一样,与字符类型相关的另外三个类,也包含另一种类型的内部类,表3中列出。

Table 3. CHAR_ARRAY, READER, and STRING

所以,如果你想打印储存在字符串中的文本数据,可用以下代码:

DocFlavor flavor = DocFlavor.STRING.TEXT_PLAIN;

DocFlavor flavor = DocFlavor.STRING.TEXT_PLAIN;

类似,如果文本来自于网页上的HTML文档,并且你希望打印出和在浏览器中看到的一样的效果,就用以下代码:

DocFlavor flavor = DocFlavor.STRING.TEXT_HTML;

DocFlavor flavor = DocFlavor.STRING.TEXT_HTML;

4.选择正确的打印机

Choosing the right printer

还记得我们在开始讨论DocFlavor之时,关于确认您实际使用的打印机,支持需要打印的数据类型,以及你期望使用的传送机制(即表现类)。这步看起来似乎没有必要,但实际上,你会对给定打印机所支持的文档类型感到吃惊。例如,刚提到文本类型看起来似乎是最容易支持的,所以,如果你的程序要打印一个普通文本或者HTML文本,你可能会简单地选择第一个有效的打印服务,并将输出送到那台打印机去。然而大部分打印机不支持基于文本的表现类,如果你试图向打印机发送你选择的DocFlavor,但是它却不支持,就会抛出下面的异常:

Exception in thread "main" sun.print.PrintJobFlavorException: invalid flavor Exception in thread "main" sun.print.PrintJobFlavorException: invalid flavor

at sun.print.Win32PrintJob.print(Win32PrintJob.java:290)at sun.print.Win32PrintJob.print(Win32PrintJob.java:290) at PrintTest.main(Prin at PrintTest.main(PrintTest.java:11) tTest.java:11)

现在你已经知道了如何得到一个DocFlavor 的引用,并且我们也讨论了选择支持这个DocFlavor 的打印机重要性,接下来我来将告诉你,如何确定你使用的打印机支持所需特性。我先前说过lookupPrintServices()允许你指定一个DocFlavor 作为第一个参数,如果你指定的参数非空,那么方法会返回支持指定DocFlavor 的打印服务实例。例如,以下代码将返回可以通过URL 来打印gif 文件的打印机的列表:

DocFlavor flavor = DocFlavor.U DocFlavor flavor = DocFlavor.URL.GIF;RL.GIF;RL.GIF;

PrintService[PrintService[ ] services = PrintServiceLookup.lookupPrintServices(flavor, null);

另外,如果你的程序已经获得了打印服务的实例,而你想知道它是否支持一种特定的属性,你可以调用isDocFlavorSupported()方法。在下面的代码里,将得到一个默认打印机的引用,如果不支持打印出通过URL 获得的gif ,就会出现错误信息:

PrintService service = PrintServiceLookup.PrintService service = PrintServiceLookup.lookupDefaultPrintService();lookupDefaultPrintService();lookupDefaultPrintService();

DocFlavor flavor = DocFlavor.URL.GIF;DocFlavor flavor = DocFlavor.URL.GIF;

if (!service.isDocFlavorSupported(flavor)) {if (!service.isDocFlavorSupported(flavor)) {

System.err.println("The printer does not support the appropriate DocFlavor")System.err.println("The printer does not support the appropriate DocFlavor") ;

}

5.AttributeSet (属性集)

如你见,一个DocFlavor描述了要打印的数据,并且可以用来确定PrintService(打印服务)是否支持该数据类型。然而,您的应用程序也可能需要一种基于打印机特性的选择机制。例如,你要打印的图片需要用不同的颜色来传递信息,你想知道给定的(打印)服务是否支持彩色打印,如果不是,那么要么不使用该打印机,或者转换成不依赖颜色的图片演示。

类似彩色打印,两面打印,以及不同的打印制方向选择(垂直肖像式或水平风景式)等特性被称为打印机属性,而javax.print.attribute包中包含了许多你可以用于描述这些属性的类和接口。其中的一个接口是AttributeSet,可以作为前面提到的lookupPrintServices()中第二个参数。正如你预计的那样,AttributeSet的一个实现代表了一组属性的集合,在调用lookupPrintServices()时指定一个非空的值,将只返回支持这些属性的打印服务。换句话说,如果DocFlavor和AttributeSet都不为空,那么方法将返回那些这两种属性都支持的打印机

6.Attribute

给定的一个AttributeSet是一组属性的集合,一个显而易见的问题是,如何指定组成该集合的属性值呢?javax.print.attribute包里同时含有一个叫Attribute的接口,你马上可以看到通过调用add()方法,来给AttributeSet添加若干个Attribute实例来获得这个集合。查阅Attribute接口的文档后,发现在javax.print.attribute.standard包里定义了大量你将要用到的实现。在你了解这些之前,你可以先查看javax.print.attribute这个包里的其他接口及其实现,将非常有帮助!

角色

7.属性

属性角色

目前为止,我们把属性描述成打印服务的能力,这在大部分上是正确的,至少对于Java 是如何支持属性来说,它是某种意义上的单纯概括。对应每个不同属性,java都将其关联到不同的角色上,属性仅在相关的角色上下文中才有效。换而言之,在不同的位置要使用不同的Java打印服务属性,不是每个属性在任何地方都适用。

为了更好的理解这个,来看一下javax.print.attribute.standard包里定义的OrientationRequested和ColorSupported实现。创建一个新的打印文档时,应该通过设定OrientationRequested属性来确定打印纸的方向(例如垂直肖像式或水平风景式)。与此相反,ColorSupported是你在调用PrintService接口的getAttributes()方法时返回的属性。换而言之,OrientationRequested是一个你用来将信息传递给打印机的属性,而ColorSupported是打印服务用来提供给你关于打印机能力信息的属性。你不能在创建打印文档时把ColorSupported作为指定属性,因为打印机是否支持彩色打印是你的程序不能控制的。

实现

8.接口和

接口和实现

你第一次查看javax.print.attribute包里的接口和类时,选择列表里的接口和类,看起来很令人困惑。除了Attribute和AttributeSet接口,以及实现AttributeSet的HashAttributeSet 类,javax.print.attribute包里有4个子接口和类,列出在表4和图1中。

Table 4. javax.print.attribute 里定义的接口和类

图-1,javax.print.attribute包的一部分类的层次结构.

为什么你需要所有这些各式各样的接口和继承类呢,特别是已经有了Attribute, AttributeSet, 和HashAttributeSet?是因为这些特殊的定制是为了确保在角色中使用合适的有效属性。比方说,我提到过当你创建打印文档的位置,可以使用属性;但根据上下文,一些属性,例如ColorSupported在那里不能使用。当创建这样的文档时,你可以使用DocAttributeSet接口(或者更明确一点,HashDocAttributeSet这个实现),这个实现只允许你添加继承DocAttribute这个接口的属性。这四种不同的角色如下:

Doc:在创建打印文档时,描述文档如何打印

PrintJob: 从打印任务返回的属性,描述任务的状态

PrintRequest: 请求初始化打印时,传给任务的属性

PrintService:由打印服务返回,用于描述打印机的能力

要知道这些如何工作,我们来创建一个DocAttributeSet的实例,然后尝试为AttributeSet 设置DocAttributeSet和OrientationRequested属性。HashDocAttributeSet定义了一个无参数的创建结构,所以你可以很容易地创建实例:

cAttributeSet attrs = new HashDocAttributeSet();

Do DocAttributeSet attrs = new HashDocAttributeSet();

现在你已经创建了AttributeSet,你可以调用add()方法,并把Attribute的实现传递给它。如果你看了OrientationRequested这个类的文档,你会发现它包含了一系列静态的OrientationRequest实例,每一个对应一种纸张打印方向,例如垂直人像或水平风景。要指定你想要的方向,你所要做的只是利用add()方法传递一个静态实例的引用:

DocAttributeSet attrs = new HashDocAttributeSet();

attrs.add(OrientationRequested.PORTRAIT);

ColorSupported类有一点不同,但一样很简单,它定义了两种静态实例:一个表示支持彩色打印,另一个表示不支持。你可以试着增加一个ColorSupported属性到DocAttributeSet 去,代码如下:

DocAttributeSet attrs = new HashDocAttributeSet();

attrs.add(OrientationRequested.PORTRAIT);

attrs.add(ColorSupported.SUPPORTED);

如前所述,去指定是否支持彩色打印不恰当的,因为这不是程序所能控制的内容。换句话说,ColorSupported这个属性放到一系列文档属性上下文中并不合适,所以,运行先前的代码,当添加ColorSupported属性时会抛出一个ClassCastException异常。

要这是如何工作的,记住每一个AttributeSet子接口(这个例子是DocAttributeSet)都有一个相应Attribute子接口(DocAttribute)和实现类(HashDocAttributeSet)。当添加一个属性时,实现子类试图把Attribute参数转换为相应的子接口类型,这样来确保只有当前上下文合适的属性会添加成功。

这个例子中,HashDocAttributeSet的add()方法第一次调用,是配合一个OrientationRequested的实例,并成功将该对象转换为DocAttribute。因为,如图2所示,OrientationRequested继承了那个接口。与之相反,传递ColorSupported实例的时候失败了,因为其没有继承DocAttribute。

图-2. javax.print.attribute包的部分类层次图示

包的部分类层次图示。

这个例子举例表明,表4里的四个接口和类组确保了只有合适的属性在合适的上下文中使用。注意各种角色和不同的属性之间有大量的重叠部分,所以很多属性与不止一个角色相关联。例如,许多属性继承了PrintJobAttribute和PrintRequestAttribute,因为大部分维护和通过打印任务提供给你的属性,与你可以在初始化打印时能指定的属性是相关的。举例来说,你可以通过添加名称到PrintRequestAttributeSet中来指定打印任务名,并且在打印的时候,通过查询PrintJobAttributeSet来获得它。因此,JobName属性类同时实现了PrintRequestAttribute和PrintJobAttribute。

9.AttributeSet 和 HashAttributeSet

你已经知道了为什么会有四个子类,但是AttributeSet 接口和HashAttributeSet 父类又是什么呢? AttributeSet / HashAttributeSet 在你不能确定要存储在这个集合中的属性仅仅和一个角色相关时使用。记得我以前提到的 lookupPrintServices()方法允许你指定

AttributeSet 参数来限制返回的打印服务。表面上看来最好指定PrintServiceAttributeSet 的实例,但是很多你可能用到的属性并不继承PrintServiceAttribute 。

我们假设你想要让lookupPrintServices() 方法返回,支持彩色打印和水平方向打印的打印机。这些属性与 ColorSupported 和OrientationRequested 属性关联,但请注意这些类并不共享角色:前者是一个PrintServiceAttribute ,而OrientationRequested 与另外三个角色(Doc ,PrintRequest 和 PrintJob )关联,如图-2所示。这意味着不存在单个特定角色的AttributeSet 接口或类来同时包含ColorSupported 和Sides 属性。

创建一个AttributeSet ,并使其同时包含OrientationRequested 和ColorSupported 实例的简单方法是使用一个HashAttributeSet 。与它的子类不同,它并不限制你往上加特殊角色的属性,所以以下代码可以成功执行:

AttributeSet attrs = new HashAttributeSet();AttributeSet attrs = new HashAttributeSet();

attrs.add(ColorSupported.SUPPORTED);attrs.add(ColorSupported.SUPPORTED);

attrs.add(https://www.360docs.net/doc/e618296123.html,NDSCAPE);attrs.add(https://www.360docs.net/doc/e618296123.html,NDSCAPE);

PrintService[PrintService[ ] services = PrintServiceLookup.lookupPrint ] services = PrintServiceLookup.lookupPrintServices(null, attrs); Services(null, attrs);

10.通过用户界面的打印机选择

到当前为止,我假设所需要使用的打印机,应该能够由应用程序编程选择。事实上,尽管如此,更为普遍的过程是显示一个对话框,并允许客户在输出时,选择使用哪个打印机。幸运的是,Java 通过使用在javax.print 包中定义的ServiceUI 类,中的静态方法printDialog()来使得这些操作非常简单。

除了对话框显示的位置外,在调用printDialog()时必须指定的唯一参数是这些: 一个用户可选用的PrintService 实例的数组;

默认的PrintService ;

一个PrintRequestAttributeSet 实例。这用来弹出显示的对话框,并在对话框消失

之前返回用户所作的任何更改。

要演示这些如何运作,可使用下列简单的代码段来显示一个简单的打印对话框:

PrintService[PrintService[ ] services = PrintServiceLookup.lookupPrintServices(null, null);] services = PrintServiceLookup.lookupPrintServices(null, null);

PrintService svc = PrintServiceLookup.lookupDefaul PrintService svc = PrintServiceLookup.lookupDefaultPrintService(tPrintService(tPrintService( ););

PrintRequestAttributeSet attrs = new HashPrintRequestAttributeSet(PrintRequestAttributeSet attrs = new HashPrintRequestAttributeSet( ););

PrintService selection = ServiceUI.printDialog(PrintService selection = ServiceUI.printDialog( null, 100, 100, services, svc, null, attrs);

运行时,代码产生如图-3中所示的对话框

图-3 打印对话框

正如代码所示,从printDialog()方法返回的值是一个PrintService 实例,识别用户所选的打印机,或在用户取消打印机对话时标识为空值。此外,PrintRequestAttributeSet 已更新了,包含用户通过对话框所做出的更改,例如要打印的份数等。

通过使用printDialog()方法,可让用户选择其输出要发往的打印机,提供用户对于专业应用程序的所期望功能。

11.创建打印任务

这是打印中的最简单的一个步骤;因为一旦获得PrintService 的一个引用,所有你需要做的就是调用createPrintJob()方法,象这样:

PrintService s PrintService service;ervice;ervice;

.

.

. DocPrintJob job = service.createPrintJob();

如代码所示,从createPrintJob()返回的值是一个DocPrintJob 实例,该对象可以让让您控制并监视打印操作的状态。要初始化打印,您应该调用 DocPrintJob 对象的print()方法,但是,在这之前,您需要定义待打印的文档,并PrintRequestAttributeSet 。您已经 知道如何构造并使用AttributeSet ,这些步骤不再重复;接下来,您将了解如何定义待打印的文档。

12.定义要打印的文档

打印过程中接下的一步是定义要打印的文档,就是创建一个实例,其实现了在

javax.print 包里定义的Doc 接口。每一个Doc 的实例有两个必须定义的属性和一个可选择的属性:

一个Object 代表要打印的内容;

DocFlavor 的一个实例描述数据类型;

一个可选的DocAttributeSet 包含打印时所需属性。

查阅Doc 接口的文档,可以看出javax.print 包里包含了一个叫SimpleDoc 接口的实现,它的构造函数包含了与上面三个属性对应的三个参数。要了解如何构建SimpleDoc 的实例,我们假设你要打印两份存在https://www.360docs.net/doc/e618296123.html,/ApressCorporate/supplement/1/421/bcm.gif 的gif 文件拷贝。

构建一个描述所要打印文件的SimpleDoc 实例,我们所有要做的是,创建一个指向图片的URL ,并获得一个合适的DocFlavor 引用,并把这两个传给SimpleDoc 构造函数:

URL url = new

UR URL("https://www.360docs.net/doc/e618296123.html,/ApressCorporate/supplement/1/421/bcm.gif");L("https://www.360docs.net/doc/e618296123.html,/ApressCorporate/supplement/1/421/bcm.gif");L("https://www.360docs.net/doc/e618296123.html,/ApressCorporate/supplement/1/421/bcm.gif");

DocFlavor flavor = DocFlavor.URL.GIF;DocFlavor flavor = DocFlavor.URL.GIF;

SimpleDoc doc = new SimpleDoc(url, flavor, null);SimpleDoc doc = new SimpleDoc(url, flavor, null);

13.启动打印

打印的最后一个步骤就是调用 DocPrintJob 的 print()方法,传递给其,待打印数据的Doc 对象,以及可选的PrintRequestAttributeSet 实例。为简单起见,假设默认打印机支持你所需要的flavor 和属性,在此情况下要使用下列代码将上一个例子提及的gif 文件打印两份:

PrintService service = PrintServiceLookup.lookupDefaultPrintService();PrintService service = PrintServiceLookup.lookupDefaultPrintService();

DocPrintJob job = service.createPrintJob();DocPrintJob job = service.createPrintJob(); URL url = new

URL("https://www.360docs.net/doc/e618296123.html,/ApressCorporate/supplement/1/421/URL("https://www.360docs.net/doc/e618296123.html,/ApressCorporate/supplement/1/421/bcm.gif ");bcm.gif ");bcm.gif ");

DocFlavor flavor = DocFlavor.URL.GIF;DocFlavor flavor = DocFlavor.URL.GIF;

Doc doc = new SimpleDoc(url, flavor, null);Doc doc = new SimpleDoc(url, flavor, null);

PrintRequestAttributeSet attrs = new HashPrintRequestAttributeSet(PrintRequestAttributeSet attrs = new HashPrintRequestAttributeSet( ););

attrs.add(new Copies(2));attrs.add(new Copies(2)); job.print(doc, attrs)job.print(doc, attrs)

注意,某些情况下,打印是异步执行的,这可能会在实际打印完成之前,返回对print()的调用。

关于作者

Brett Spell 是一个Frito-Lay 的资深开发者/高级员,并是著名的Pro Java Programming 原始版本的作者。

资源

这是Pro Java Programming, Second Edition, Brett Spell (Apress, June 2005; ISBN:

1590594746)第十章,“打印”的部分节选

https://www.360docs.net/doc/e618296123.html,/book/bookDisplay.html?bID=421

要得到更多关于Java API 的文章,点击以下链接https://www.360docs.net/doc/e618296123.html,/channel_content/jw-apis-index.shtml

-END-

C o n f i d e n t i a l A20Android 开发手册 V 1.0 2013-02013-03 3-15

C o n f i d e n t i a l Revision History Version Date Section/Page Changes 1.0 2013-03-15 初始版本

C o n f i d e n t i a l 目录 一、A20概述 (4) 1.1A20主控介绍.....................................................................................................................51.2外围设备介绍.....................................................................................................................51.3软件资源介绍.....................................................................................................................5二、建立开发环境. (5) 2.1硬件资源............................................................................................................................62.2软件资源. (6) 2.2.1安装JDK (ubuntu12.04).....................................................................................62.2.2安装平台支持软件(ubuntu12.04).....................................................................62.2.3安装编译工具链(ubuntu12.04).........................................................................62.2.4安装phoenixSuit (windows xp )........................................................................72.2.5其他软件(windows xp ).. (7) 三、源码下载 (8) 3.1wing 源码下载....................................................................................................................83.2仓库的目录树.. (8) 3.2.1android 目录树.........................................................................................................83.2.2lichee 目录结构.. (9) 3.2.2.1buildroot 目录结构........................................................................................93.2.2.2linux-3.3目录结构......................................................................................103.2.2.3u-boot 目录结构..........................................................................................113.2.2.4tools 目录结构............................................................................................123.2.2.5boot 目录结构 (12) 四、编译和打包 (13) 4.1源码编译 (13) 4.1.1lichee 源码编译......................................................................................................134.1.2android 源码编译...................................................................................................134.2打包固件.. (13) 4.2.1完全打包...............................................................................................................134.2.2局部打包 (14) 五、固件烧写 (14) 5.1使用PhoenixSuit 烧写固件.............................................................................................145.2使用fastboot 更新系统 (14) 5.2.1进入fastboot 模式.................................................................................................145.2.2fastboot 命令使用.. (15) 六、recovery 功能使用 (15) 6.1键值的查看......................................................................................................................156.2按键选择..........................................................................................................................166.3功能使用..........................................................................................................................16七、调试 (17) 7.1调试apk...........................................................................................................................177.2调试linux 内核. (17)

Java实现打印功能 用java实现打印,java.awt中提供了一些打印的API,要实现打印,首先要获得打印对象,然后继承Printable实现接口方法print,以便打印机进行打印,最后用用Graphics2D直接输出直接输出。 下面代码实现了简单的打印功能: import java.awt.BasicStroke; import java.awt.Color; import https://www.360docs.net/doc/e618296123.html,ponent; import java.awt.Font; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Image; import java.awt.Toolkit; import java.awt.RenderingHints; import java.awt.font.FontRenderContext; import java.awt.font.LineBreakMeasurer; import java.awt.font.TextAttribute; import java.awt.font.TextLayout; import java.awt.geom.Point2D; import java.awt.image.BufferedImage; import java.awt.print.Book; import java.awt.print.PageFormat; import java.awt.print.Paper; import java.awt.print.Printable; import java.awt.print.PrinterException; import java.awt.print.PrinterJob; import java.text.AttributedString; import javax.swing.JApplet; public class PrintTest implements Printable{ /** * @param Graphic指明打印的图形环境 * @param PageFormat指明打印页格式(页面大小以点为计量单位,1点为1英才的1/72,1英寸为25.4毫米。A4纸大致为595×842点) * @param pageIndex指明页号 **/

Shiro用户手册 Shiro架构介绍 一、什么是Shiro Apache Shiro是一个强大易用的Java安全框架,提供了认证、授权、加密和会话管理等功 能: * 认证-用户身份识别,常被称为用户登录” ?授权-访问控制; * 密码加密-保护或隐藏数据防止被偷窥; * 会话管理-每用户相关的时间敏感的状态。 对于任何一个应用程序,Shiro都可以提供全面的安全管理服务。并且相对于其他安全框架, Shiro要简单的多。 Shiro的架构介绍 Subject :即当前操作用户”但是,在Shiro中,Subject这一概念并不仅仅指人,也可以是第三方进程、后台帐户(Daemon Accou nt )或其他类似事物。它仅仅意味着当前跟软件

交互的东西”。但考虑到大多数目的和用途,你可以把它认为是Shiro的用户”概念。Subject代表了当前用户的安全操作,SecurityManager则管理所有用户的安全操作。 SecurityManager :它是Shiro 框架的核心,典型的Facade 模式,Shiro 通过SecurityManager 来管理内部组件实例,并通过它来提供安全管理的各种服务。 Realm : Realm充当了Shiro与应用安全数据间的桥梁”或者连接器”。也就是说,当对用户执行认证(登录)和授权(访问控制)验证时,Shiro会从应用配置的Realm中查找用户及其权限信息。 从这个意义上讲,Realm实质上是一个安全相关的DAO :它封装了数据源的连接细节,并 在需要时将相关数据提供给Shiro。当配置Shiro时,你必须至少指定一个Realm,用于认 证和(或)授权。配置多个Realm是可以的,但是至少需要一个。 Shiro内置了可以连接大量安全数据源(又名目录)的Realm,如LDAP、关系数据库 (JDBC )、 类似INI的文本配置资源以及属性文件等。如果缺省的Realm不能满足需求,你还可以插 入代表自定义数据源的自己的Realm实现。 Shiro完整架构图:

PACHAGE | 内 容 -----------------|------------ ------------------- javax.swing | 最常用的pachage,包含了各种swing组件的类 javax.swing.border | 包含与swing组件 外框有关的类 javax..swing.colorchooser | 针对swing调色盘组件(JColorChooser)所设计的类 javax.swing.event | 处理由swing组件 产生的事件,有别于AWT事件 javax.swing.filechooser | 包含针对swing文件选择对话框(JFileChooser)所设计的类 ----------------------------- ----------------- javax.swing.plaf | 处理swing组件外 观的相关类 javax.swing.plaf.basic | javax.swing.plaf.metal | javax.swing.plaf.multi | ----------------------------- ----------------- javax.swing.table | 针对swing表格组 件(JTable)所设计的类 ----------------------------- ----------------- javax.swing.text | 包含与swing文字 组件相关的类 javax.swing.text.html | javax.swing.text.html.parser | javax.swing.text.rtf | ----------------------------- ----------------- javax.swing.tree | 针对swing树关元 件(JTree)所设计的类 javax.swing.undo | 提供swing文字组 件Redo或Undo的功能

目录 第一章介绍 Java平台打印的历史 JDK 1.3 JDK 1.2 JDK 1.1 Java Print Service API能做什么 Java Print Service 构架 javax.print包 发现打印服务 指定打印数据格式 创建打印工作 javax.print.event包 应用程序如何使用JPS 一个基本的例子 第二章属性 属性的类别和值 属性角色 属性集 如何指定属性 标准属性 OrientationRequested Copies Media MediaSize MediaPrintableArea Destination SheetCollate Sides Fidelity 使用JPS属性 第三章指定文档类型 用户格式打印数据 预定义数据格式的MIME类型 文本数据 页面描述语言文档 图像数据 自适应打印数据 表示类 字符编码的重要性 服务格式打印数据 怎样使用DocFlavor 第四章打印及流化文档

比较StreamPrintService与PrintService 定位服务 发现打印服务 发现流打印服务 获得一个打印工作 创建DOC 注册事件 打印服务事件 打印工作事件 PrintJobAttributeListener PrintJobListener 提交打印工作 向打印机提交打印工作 向流提交打印工作 打印服务提供商 第五章打印及流化2D图像 使用打印工作打印或流化图像 打印2D图像 流化2D图像 使用服务格式数据 打印服务格式数据 流化服务格式打印数据 示例:PrintPS.java 示例:PrintGIFtoStream.java 示例:Print2DPrinterJob.java 示例:Print2DGraphics.java 示例:Print2DtoStream.java 示例:PrintGIF.java Java Print Service 词汇表

姓名:王镱澍 Java大作业 一、题目 白浪公司的雇员根据参数月份来确定工资,如果该月员工过生日,则公司会额外奖励100元。 雇员分为以下若干类: SalariedEmployee:拿固定工资的员工。 HourlyEmployee:按小时拿工资的员工。 SalesEmployee:销售人员,工资由月销售额和提成率决定。 BasePlusSalesEmployee:有固定底薪的销售人员,工资由底薪加上销售提成。 公司会给SalaryEmployee每月另外发放2000元加班费,给 BasePlusSalesEmployee发放1000元加班费。编一个java程序创建上述若干类,并实现确定月份以及该月不同员工的工作情况后打印出该公司该月各员工工资,公司总的工资支出情况。 二、程序功能说明 编一个java程序创建上述若干类,并实现确定该月不同员工的工作情况以及输入月份后打印出该公司该月各员工工资,公司总的工资支出情况。 三、类、属性、方法说明 程序中已给出详细解释在此只作简要说明: Employee:这是所有员工总的父类。 属性:员工的姓名和生日月份。 方法:getSalary(int month) 根据参数月份来确定工资,如果该月员工过生日,则公司会额外奖励100元。 SalariedEmployee:Employee的子类,拿固定工资的员工。 属性:月薪。 方法:每月工作超出160小时的部分按照倍工资发放。 HourlyEmployee:Employee的子类,按小时拿工资的员工。 属性:每小时的工资、每月工作的小时数。 SalesEmployee:Employee的子类,销售人员。 属性:月销售额、提成率。 方法:工资由月销售额和提成率决定。 BasePlusSalesEmployee:SalesEmployee的子类,有固定底薪的销售人员。 属性:底薪。 方法:工资由底薪加上销售提成部分。 四、程序代码 import .*; class MyException extends Exception {

使用Java蓝牙无线通讯技术API(第一部分-API概览) 蓝牙是一种低成本、短距离的无线通信技术。对于那些希望创建个人局域网(PANs)的人们来说,蓝牙技术已经越来越流行了。每个个人局域网都在独立设备的周围被动态地创建,并且为蜂窝式电话和PDA等设备提供了自动连接和即时共享数据的能力。 为了在Java平台上开发支持蓝牙技术的软件,JCP定义了JSR82标准--Java蓝牙无线技术APIs(JABWT)。 在这篇文章中,我将介绍一些关于蓝牙技术的背景,概述一下支持蓝牙技术的MIDlet 应用程序的典型要素,然后介绍给你核心的Java蓝牙APIs。最后我们展示一些代码来演示如何使用这些APIs。 实际上JSR82定义了两个独立的可选包:核心蓝牙API和对象交换(OBEX)API。这篇文章将对这两个中更为普遍的部分--核心蓝牙包javax.bluetooth进行详细地阐述,而OBEX API(对象交换),我们留到以后去讨论。 1、背景 篮牙技术由蓝牙兴趣小组发展,其包括: .无线电技术 .协议栈 .互操作性profiles 蓝牙无线电技术基于在工业、科学以及医学(ISM)上公用的2.45GHz开放频段,这一频段无需授权并全球通用。当蓝牙设备互相连接时,他们将组成一个微微网(piconet),即以一个主设备和最大7个从设备的形式动态创建网络。蓝牙也支持piconet网之间的连接:当一个piconet中的主设备成为另一个piconet的从设备时,piconet与piconet间将形成桥接。 蓝牙协议栈提供了一组的高层协议和API以完成发现服务和模拟串行I/O,还有一个关于包分割和重组的低层协议以及多路技术协议和质量服务。蓝牙互操作性profiles--不要与J2ME profiles搞混--它是用来描述跨平台互操作性和一致性需求的。蓝牙互操作性profiles 包括三方面内容:通用访问profile(GAP)定义了设备管理功能性;服务发现应用profiles 定义了服务发现方面的内容,串口profiles定义了互操作设备和模拟串口电缆的能力。你可以通过蓝牙规范(Bluetooth specification)学习这些和其它的profiles。 蓝牙栈包含一个软件栈来映射一个固件栈(firmware),由图1所示:

打印Java方法参数 首先描述一下具体的需求就是,能不能不需要手动添加代码就能打印Java方法所有的参数,这有些时候在我们调试代码的时候有很重要的帮助。 按照这个需求,我们可以想一下我们大体需要一下什么信息,方法的名称,方法参数类型,方法参数的名字,方法参数的值。 如何实现不写代码就能够实现动态的打印这些信息呢,了解Java的这时候就都会想到动态代理。有了动态代理我们就可以不用写代码了,但是为了区分哪些方法需要打印,哪些方法不需要打印,我们这里还需要注解来辅助区分需要打印的方法。 如何获取需要打印的信息呢,这里我相信大家都会想到反射,但是反射这里有一个参数是拿不到的,哪个参数呢,方法参数的名字是拿不到的。这里我们采用的是asm的方式来获取方法参数的名字。 到这里功能已经描述清楚,需要用到的技术也描述清楚,接下来就是具体怎么实现了。 首先,我们设计了一个注解类如下: import https://www.360docs.net/doc/e618296123.html,ng.annotation.ElementType; import https://www.360docs.net/doc/e618296123.html,ng.annotation.Retention; import https://www.360docs.net/doc/e618296123.html,ng.annotation.RetentionPolicy; import https://www.360docs.net/doc/e618296123.html,ng.annotation.Target; @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public@interface MethodLog { } 接下来就是我们设计的最后要打印的数据的一个简单的封装类,如下: public class MethodInfo { private int index;//参数的索引 private Object parameterType;//参数的类型 private String parameterName;//参数的名称 private Object parameterValue;//参数的值 public MethodInfo(){} public MethodInfo(int index, Object parameterType, String parameterName, Object parameterValue) { super(); this.index = index; this.parameterType = parameterType; this.parameterName = parameterName; this.parameterValue = parameterValue; } public int getIndex() { return index; } public void setIndex(int index) { this.index = index; }

JavaShop安装手册 Version: 2.0 Public date: 2010-09-28 All right reserved https://www.360docs.net/doc/e618296123.html,

1安装条件 ●操作系统不限 ●JDK:1.5或更高版本 ●Tomcat5.5或更高版本 ●Mysql5.0或更高版本 2安装准备 2.1获取javashop.war 包 请到https://www.360docs.net/doc/e618296123.html,上获取最新安装包 2.2停用tomcat的reload 在安装过程中需要动态修改数据库配置文件,所以要禁止tomcat自动reload。打开\conf\server.xml文件,找到

2.4注意事项: ●Tomcat路径不能有空格。 ●数据库编码必须为utf-8。 3安装参数配置3.1.1许可协议 点击“下一步”

3.1.2配置数据库信息 输入相应参数后点击“测试连接”,如果连接成功会提示如上图。点击“下一步”

3.1.3配置域名及管理员信息 点击“开始安装”进行安装,安装过程可能需要几分钟时间,耐心等待之后的成功安装成功界面:

Java打印程序设计 1 前言 在我们的实际工作中,经常需要实现打印功能。但由于历史原因,Java提供的打印功能一直都比较弱。实际上最初的jdk根本不支持打印,直到jdk1.1才引入了很轻量的打印支持。所以,在以前用Java/Applet/JSP/Servlet设计的程序中,较复杂的打印都是通过调用ActiveX/OCX控件或者VB/VC程序来实现的,非常麻烦。实际上,SUN公司也一直致力于Java打印功能的完善,而Java2平台则终于有了一个健壮的打印模式的开端,该打印模式与Java2D图形包充分结合成一体。更令人鼓舞的是,新发布的jdk1.4则提供了一套完整的"Java 打印服务 API" (Java Print Service API),它对已有的打印功能是积极的补充。利用它,我们可以实现大部分实际应用需求,包括打印文字、图形、文件及打印预览等等。本文将通过一个具体的程序实例来说明如何设计Java打印程序以实现这些功能,并对不同版本的实现方法进行分析比较,希望大家能从中获取一些有益的提示。 2 Java中的打印 2.1 Java的打印API Java的打印API主要存在于java.awt.print包中。而jdk1.4新增的类则主要存在于javax.print 包及其相应的子包javax.print.event和javax.print.attribute中。其中javax.print包中主要包含打印服务的相关类,而javax.print.event则包含打印事件的相关定义,javax.print.attribute则包括打印服务的可用属性列表等。 2.2 如何实现打印 要产生一个打印,至少需要考虑两条: 需要一个打印服务对象。这可通过三种方式实现:在jdk1.4之前的版本,必须要实现java.awt.print.Printable接口或通过Toolkit.getDefaultToolkit().getPrintJob来获取打印服务对象;在jdk1.4中则可以通过javax.print.PrintSerivceLookup来查找定位一个打印服务对象。 需要开始一个打印工作。这也有几种实现方法:在jdk1.4之前可以通过java.awt.print.PrintJob(jdk1.1提供的,现在已经很少用了)调用print或printAll方法开始打印工作;也可以通过java.awt.print.PrinterJob的printDialog显示打印对话框,然后通过print方法开始打印;在jdk1.4中则可以通过javax.print.ServiceUI的printDialog显示打印对话框,然后调用print方法开始一个打印工作。 2.3 打印机对话框 2.3.1 Printable的打印对话框 开始打印工作之前,可以通过PrinterJob.printDialog来显示一个打印对话框。它给用户一个机会以选择应该打印的页码范围,并可供用户改变打印设置。它是一个本地对话框。

Java 开发规范 第1章绪论 1.1 目的 本规范的目的是使本组织能以标准的、规范的方式设计和编码。通过建立编码规范,以使每个开发人员养成良好的编码风格和习惯;并以此形成开发小组编码约定,提高程序的可靠性、可读性、可修改性、可维护性和一致性等,增进团队间的交流,并保证软件产品的质量。 1.2 范围 本规范适用于“Skyinn Group”及其下所有软件项目、产品等的设计、开发以及维护、升级等。 本规范使用于“Skyinn Group”的所有软件开发人员,在整个软件开发过程中必须遵循此规范。 1.3 版权声明 本文档为共享文档,不限转载,但请保持本文档的完整性。 您可以修改本文档以符合您或组织、公司等之实际,但请在文档中保持对本文档的引用和说明。 未经本人授权,任何个人、组织或单位不得将本文档用于书面发表、转载、摘录等,亦不得用于其他商业行为。 本人及本组织不承担任何因使用、参考本文档等而导致的任何可能责任或连带责任。 1.4 参考资料 《Java 编程指南》见RUP(Rational Unified Process)中文版。 《Java 技术手册》(Java in a Nutshell) 《Sun Java 语言编码规范》(Java Code Conventions) 《Effictive Java》 《Java Pitfalls》 《Java Rules》 1.5 概述 对于代码,首要要求是它必须正确,能够按照设计预定功能去运行;第二是要求代码必须清晰易懂,使自己和其他的程序员能够很容易地理解代码所执行的功能等。然而,在实际开发中,每个程序员所写的代码却经常自成一套,很少统一,导致理解困难,影响团队的开发效率及系统的质量等。因此,一份完整并被严格执行的开发规范是非常必须的,特别是对软件公司的开发团队而言。此规范参考自业界标准编程规范并结合本人多年编程经验、习惯等而制定,在本人工作过的公司中都曾参考本文档而形成内部开发规范并执行。现在将本文档共享之,希望能对各位有所帮助,并做引玉之砖,希望各位朋友将自己的经验等增补进去,对我们所热爱的软件业有所裨益。 最根本的原则: 代码虽然是给机器运行的,但却是给人读的! 运用常识。当找不到任何规则或指导方针,当规则明显不能适用,当所有的方法都失效的时

Java打印最大的改变来自于J2SE的发布带来的Java打印服务API。这个第三代Java打印支持接口突破了先前提到的使用javax.print包的PrintService和DocPrintJob接口的局限性。因为新的API就是以前两种旧的打印机制定义的功能函数的一个父集,它是目前我们常用的方法并且是这篇文章的焦点。 更深入来说,以下的步骤包含了怎么使用这个新的Java打印服务API: 1.定义打印机,限制那些返回到提供你要实现功能的函数的列表。打印服务实现了PrintService接口. 2.通过调用接口中定义的createPrintJob()方法创建一个打印事件,作为DocPrintJob 的一个实例。 3.创建一个实现Doc接口的类来描述你想要打印的数据, 你也可以创建一个PrintRequestAttributeSet的实例来定义你想要的打印选项。 4.通过DocPrintJob接口定义的printv()方法来初始化打印,指定你先前创建的Doc,指定PrintRequestAttributeSet或者设为空值。 现在你可以检查每一步并且试着完成它们。 注意 在这篇文章里,我将交替使用打印机和打印服务,因为在大部分情况下,打印服务不亚于一台真实的打印机。一般的打印服务反映了理论上可以发送到不仅仅是打印机的的输出。举例来说,打印服务也许根本不能打印东西但是可以往磁盘上的文件写数据。换句话说,所有的打印机可以看成是特殊的打印服务,但是并不是所有打印服务和打印机有联系。就像你一般把你的文本送到打印机那里一样,我有时候使用更为简便的打印机这个名词来代替技术上更精确的打印服务。 定义打印服务 你可以使用在PrintServiceLookup类中定义的三种静态方法中的一种来定义。最简单的一种就是lookupDefaultPrintService(),正如它的名字一样,它返回一个你默认的打印机: PrintService service = PrintServiceLookup.lookupDefaultPrintService(); 虽然用这个办法很简单也很方便,用它来选择你的打印机意味着用户的打印机一直都支持你的程序所要精确传输的数据输出。实际上,你真正想要的是那种可以处理你想要的数据的类型并且可以支持你要的特征例如颜色或者两边打印。为了从列表中中返回你所要求的特殊功能支持的打印机,你可以使用剩下两个方法中的lookupPrintServices() 或者lookupMultiDocPrintServices()。

【Java编码规范】《阿里巴巴Java开发手册(正式版)》更新(v1.1.1版) 本文章来自于阿里云云栖社区 摘要:阿里巴巴集团推出的《阿里巴巴Java开发手册(正式版)》是阿里巴巴近万名开发同学集体智慧的结晶,以开发视角为中心,详细列举如何开发更加高效、更加容错、更加有协作性,力求知其然,更知其不然,结合正反例,让Jav a开发者能够提升协作效率、提高代码质量。 2017年开春之际,诚意献上重磅大礼:阿里巴巴Java开发手册,首次公开阿里官方Java代码规范标准。这套Java统一规范标准将有助于提高行业编码规范化水平,帮助行业人员提高开发质量和效率、大大降低代码维护成本。 点击下载《阿里巴巴Java开发手册》(v1.1.1版): https://https://www.360docs.net/doc/e618296123.html,/attachment/download/?id=1492 v1.1.1版更新说明:修正页码总数和部分示例。 (版本不断更新中,请收藏本文,以免错过重要更新)

(点击参与话题讨论:Java开发者们,一起来聊聊大家的开发规约吧) (原文链接: https://https://www.360docs.net/doc/e618296123.html,/roundtable/47961?spm=5176.100239.blogcont69327.8.f VLfld) 你是否曾因Java代码规范版本纷杂而无所适从? 你是否想过代码规范能将系统故障率降低20%? 你是否曾因团队代码风格迥异而协同困难? 你是否正在review一些原本可以避免的故障? 你是否无法确定自己的代码足够健壮? 码出高效,码出质量!

相比C++代码规范业界已经达成共识,Java代码规范业界比较混乱,我们期待这次发布的Java代码规范能够给业界带来一个标准,促使整体行业代码规范水平得到提高,最终能够帮助企业和开发者提升代码质量和降低代码故障率。 阿里出品,质量保证! 阿里Java技术团队一手打造出Dubbo、JStorm、Fastjson等诸多流行开源框架,部分已成为Apache基金会孵化项目; 阿里在Java后端领域支撑起全球访问量最大的服务器集群; Java代码构建的阿里双11业务系统订单处理能力达到17.5万笔/秒; 到目前已累计数亿行高并发、高稳定性的最佳Java代码实践; …… 此次首度公开的Java开发手册正是出自这样的团队,近万名阿里Java技术精英的经验总结,并经历了多次大规模一线实战检验及完善,铸就了这本高含金量的阿里Java开发手册。该手册以Java开发者为中心视角,划分为编程规约、异常日志规约、MYSQL规约、工程规约、安全规约五大块,再根据内容特征,细分成若干二级子目录。根据约束力强弱和故障敏感性,规约依次分为强制、推荐、参考三大类。此套规范不仅能让代码一目了然,更有助于加强团队分工与合作、真正提升效率。

利用iText包实现Java报表打印 摘要:结合报表制作的两种情形介绍了iText的应用方法。一种是由程序对象动态产生整 个报表文件的内容,另一种是在已存在的PDF报表文档中填写数据域以完成报表。给出了Java 实现报表打印的控制方法。关键词: Java报表;iText包;动态报表;填充型报表;报表打 印 在信息系统应用中,报表处理一直起着比较重要的作用。Java报表制作中最常使用的是 iText组件,它是一种生成PDF报表的Java组件。本文讨论两种形式的PDF报表处理,一种 是通过程序对象生成整个PDF报表文档,另一种是利用制作好的含报表的PDF文档模板,通 过在模板填写数据实现数据报表。1 通过编程绘制实现报表的生成对于内容动态变化的 表格,适合使用程序绘制办法进行生成处理。这类表格中数据项和数据均是动态存在的。1.1 使用iText编程生成含报表的PDF文档的步骤[1] (1)建立Document对象。Document是 PDF文件所有元素的容器。 Document document = new Document(); (2)建立一个与 Document对象关联的书写器(Writer)。通过书写器(Writer)对象可以将具体文档存盘成需要 的格式,PDFWriter可以将文档保存为PDF文件。 PDFWriter.getInstance(document, new FileOutputStream("my.PDF")); (3)打开文档。如:document.open(); (4) 向文档中添加内容。所有向文档添加的内容都是以对象为单位的,iText中用文本块(Chunk)、 短语(Phrase)和段落(Paragraph)处理文本。 document.add(new Paragraph("Hello World"));//添加一个段落值得注意的是文本中汉字的显示,默认的iText字体设 置不支持中文字体,需要下载远东字体包iTextAsian.jar,否则不能往PDF文档中输出中文 字体[2]。 (5)关闭文档。如:document.close();1.2 表格绘制要在PDF文件中创建 表格,iText提供了两个类——Table和PdfPTable。Table类用来实现简单表格, PdfPTable类则用来实现比较复杂的表格。本文主要讨论PdfPTable类的应用。 (1)创建 PdfPTable对象创建PdfPTable对象只需要指定列数,不用指定行数。通常生成的表格 默认以80%的比例显示在页面上。例如定义3列的表格,每列的宽度分别为15%、25%和60%, 语句如下:float[] widths = {15f, 25f, 60f}; PdfPTable table = new PdfPTable(widths); 用setWidthPercentage(float widthPercentage)方法可设置表格 的按百分比的宽度。而用setTotalWidth则可设置表格按像素计算的宽度。如果表格的内容 超过了300 px,表格的宽度会自动加长。用setLockedWidth(true)方法可锁定表格宽度。通 过表格对象的系列方法可设置表格的边界以及对齐、填充方式。 (2)添加单元格表格 创建完成以后,可通过addCell(Object object)方法插入单元格元素(PdfPCell)。其中, Object对象可以是PdfPCell、String、Phrase、Image,也可以是PdfPTable对象本身,即 在表格中嵌套一个表格。通过单元格的方法可设定单元格的列跨度、边框粗细、对齐方式、 填充间隙等。 (3)合并单元格为了实现某些特殊的表格形式,需要合并单元格。 PdfPCell类提供了setColspan(int colspan)方法用于合并横向单元格,参数colspan为合 并的单元格数。但要合并纵向单元格需要使用嵌套表格的方法。将某个子表加入单元格,且 安排单元格所占列数为子表中列数,则其行跨度也就是子表中的行数。由于实际编程时, 经常出现各类结构的嵌套情形,可以将产生某种结构的表格模块进行封装,编制成方法,通 过传递方法参数完成表格特定模块的绘制。例如,可以将生成一个整齐行列表格的代码 编写成方法。方法返回表格,填充的数据通过二维对象数组传递。代码如下:public static PdfPTable creatSubTable(Object x[][]){ PdfPTable t= new PdfPTable(x[0].length); t.getDefaultCell ().setHorizontalAlignment (Element.ALIGN_CENTER); for (int k=0;k<x.length;k++) { for (int j=0;j<x[0].length;j++) t.addCell(new Phrase(x[k][j].toString(),FontChinese)); } return t;}

iReport报表打印功能代码编写环境 系统:windows xp 开发工具:Myeclipes6.0 JDK版本:Java6(jdk6.0,jre6.0) 服务器:Tomcat5.5 Ireport版本:iReport-2.0.5 windows 安装版(iReport-2.0.5-windows-installer.exe) 实现步骤 一、iReport-2.0.5安装。选择安装路径默认安装(一直点击下一步)。 二、将iReprot的jasperreports-2.0.5.jar文件复制到Myeclipes中你工程的WEB-INF/lib目录下。 jasperreports-2.0.5.jar文件所在位置在你iReprot的安装路径下,我的是C:\Program Files\JasperSoft\iReport-2.0.5\lib。 三、要实现打印的Jsp文件编写,Jsp文件中打印按钮或者打印连接应该提交给一个javascript, 具体代码如: 打印 javascript代码如下 function print(oid){ if(!confirm("确定要打印该资格证吗?")) return ; window.showModalDialog('${ctx}/exam/exammanage/examprint_cert.jsp?oid=' +oid,'','dialogWidth:50px;dialogHeight:150px;dialogTop:1000px;dialogLef t:1000px'); document.forms[0].flg.value = "0"; document.forms[0].action="${ctx}/ExamPermitPrint.html"; document.forms[0].submit(); } 代码解释: 1、 window.showModalDialog('${ctx}/exam/exammanage/examprint_cert.jsp?oid=' +oid,'','dialogWidth:50px;dialogHeight:150px;dialogTop:1000px;dialogLef t:1000px'); 此段的功能是显示打印提示窗口,我的文件是WebRoot路径下/exam/exammanage/路径下的examprint_cert.jsp文件,而且需要传一个你所要打印的记录的唯一字段(数据库中唯一代表一条记录的字段),我这里用OID。 2.document.forms[0].action="${ctx}/ExamPermitPrint.html"; document.forms[0].submit(); 此代码是当你打印成功执行完之后要执行的代码,例如重新查询记录列表 四、打印提示窗口文件examprint_cert.jsp编写 examprint_cert.jsp <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

相关文档
最新文档