前言
在我們的實際工作中,經常需要實現列印功能。但由於曆史原因,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 列印程式以實現這些功能,並對不同版本的實現方法進行分析比較。希望大家能從中擷取一些有益的提示。 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 來顯示一個列印對話方塊。它給使用者一個機會以選擇應該列印的頁碼範圍,並可供使用者改變列印設定。它是一個本地對話方塊。
事實上,當從一個 Printable 對象進行一個列印工作時,列印對象並不知道需要列印多少頁。它只是不停地調用 print 方法。只要 print 方法返回 Printable.PAGE_EXISTS 值,列印工作就不停地產生列印頁,直到 print 方法返回 Printable.NO_SUCH_PAGE 時,列印工作才停止。
由於列印工作只有在列印完成後才進行準確的頁數計算,所以在對話方塊上的頁碼範圍是尚未初始化的 [1,9999]。我們可以通過構建一個 java.awt.print.Book 對象傳遞給列印對象;也可以通過指定的格式計算需要列印的頁數並傳遞給列印對象,使其準確地知道要列印多少頁。
2.3.2 ServiceUI 的列印對話方塊
與 Printable 的對話方塊不同的是,在 jdk1.4 提供 ServiceUI 的印表機對話方塊的預設行為已經用新的 API 更改了:預設情況下對話方塊不顯示。我們必須使用 ServiceUI 類調用 printDialog 方法建立如下所示的列印對話方塊。 Java 列印程式設計執行個體 3.1 列印文本
3.1.1 應用情境
假設我們需要列印一個表單的某個文本編輯域(可能只有幾行,也可能包含多頁)的內容,並且每頁最多列印 54 行,如何?呢。
3.1.2 解決方案
基本思路如下:首先我們需要實現 Printable 介面,然後按照每頁最多 54 行的格式計算共需要列印多少頁,當列印文本的按鈕被點擊時,執行相應的列印動作。列印文本的具體操作可通過 Graphics2D 的 drawString 方法來實現。
1、實現 Printable 介面
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |