前言 在我們的實際工作中
經常需要實現打印功能
但由於歷史原因
Java提供的打印功能一直都比較弱
實際上最初的jdk根本不支持打印
直到jdk
才引入了很輕量的打印支持
所以
在以前用Java/Applet/JSP/Servlet設計的程序中
較復雜的打印都是通過調用ActiveX/OCX控件或者VB/VC程序來實現的
非常麻煩
實際上
SUN公司也一直致力於Java打印功能的完善
而Java
平台則終於有了一個健壯的打印模式的開端
該打印模式與Java
D圖形包充分結合成一體
更令人鼓舞的是
新發布的jdk
則提供了一套完整的
Java 打印服務 API
(Java Print Service API)
它對已有的打印功能是積極的補充
利用它
我們可以實現大部分實際應用需求
包括打印文字
圖形
文件及打印預覽等等
本文將通過一個具體的程序實例來說明如何設計Java打印程序以實現這些功能
並對不同版本的實現方法進行分析比較
希望大家能從中獲取一些有益的提示
Java中的打印 Java的打印API
Java的打印API主要存在於java
awt
print包中
而jdk
新增的類則主要存在於javax
print包及其相應的子包javax
print
event和javax
print
attribute中
其中javax
print包中主要包含打印服務的相關類
而javax
print
event則包含打印事件的相關定義
javax
print
attribute則包括打印服務的可用屬性列表等
如何實現打印
要產生一個打印
至少需要考慮兩條
需要一個打印服務對象
這可通過三種方式實現
在jdk
之前的版本
必須要實現java
awt
print
Printable接口或通過Toolkit
getDefaultToolkit()
getPrintJob來獲取打印服務對象
在jdk
中則可以通過javax
print
PrintSerivceLookup來查找定位一個打印服務對象
需要開始一個打印工作
這也有幾種實現方法
在jdk
之前可以通過java
awt
print
PrintJob(jdk
提供的
現在已經很少用了)調用print或printAll方法開始打印工作
也可以通過java
awt
print
PrinterJob的printDialog顯示打印對話框
然後通過print方法開始打印
在jdk
中則可以通過javax
print
ServiceUI的printDialog顯示打印對話框
然後調用print方法開始一個打印工作
打印機對話框
Printable的打印對話框
開始打印工作之前
可以通過PrinterJob
printDialog來顯示一個打印對話框
它給用戶一個機會以選擇應該打印的頁碼范圍
並可供用戶改變打印設置
它是一個本地對話框
事實上
當從一個Printable對象進行一個打印工作時
打印對象並不知道需要打印多少頁
它只是不停地調用print方法
只要print方法返回Printable
PAGE_EXISTS值
打印工作就不停地產生打印頁
直到print方法返回Printable
NO_SUCH_PAGE時
打印工作才停止
由於打印工作只有在打印完成後才進行准確的頁數計算
所以在對話框上的頁碼范圍是尚未初始化的[
]
我們可以通過構建一個java
awt
print
Book對象傳遞給打印對象
也可以通過指定的格式計算需要打印的頁數並傳遞給打印對象
使其准確地知道要打印多少頁
ServiceUI的打印對話框
與Printable的對話框不同的是
在jdk
提供ServiceUI的打印機對話框的缺省行為已經用新的 API 更改了
缺省情況下對話框不顯示
我們必須使用ServiceUI類調用printDialog方法創建如下所示的打印對話框
Java打印程序設計實例 打印文本
應用場景
假設我們需要打印一個窗體的某個文本編輯域(可能只有幾行
也可能包含多頁)的內容
並且每頁最多打印
行
如何實現呢?
解決方法
基本思路如下
首先我們需要實現Printable接口
然後按照每頁最多
行的格式計算共需要打印多少頁
當打印文本的按鈕被點擊時
執行相應的打印動作
打印文本的具體操作可通過Graphics
D的drawString方法來實現
) 實現Printable接口
/*Graphic指明打印的圖形環境
PageFormat指明打印頁格式(頁面大小以點為計量單位
點為
英寸的
/
英寸為
毫米
A
紙大致為
×
點)
page指明頁號*/
public int print(Graphics g
PageFormat pf
int page) throws PrinterException {
Graphics
D g
= (Graphics
D)g;
g
setPaint(Color
black); //設置打印顏色為黑色
if (page >= PAGES) //當打印頁號大於需要打印的總頁數時
打印工作結束
return Printable
NO_SUCH_PAGE;
g
translate(pf
getImageableX()
pf
getImageableY());//轉換坐標
確定打印邊界
drawCurrentPageText(g
pf
page); //打印當前頁文本
return Printable
PAGE_EXISTS; //存在打印頁時
繼續打印工作
}
/*打印指定頁號的具體文本內容*/
private void drawCurrentPageText(Graphics
D g
PageFormat pf
int page) {
String s = getDrawText(printStr)[page]; //獲取當前頁的待打印文本內容
//獲取默認字體及相應的尺寸
FontRenderContext context = g
getFontRenderContext();
Font f = area
getFont();
String drawText;
float ascent =
; //給定字符點陣
int k
i = f
getSize()
lines =
;
while(s
length() >
&& lines <
) //每頁限定在
行以內
{
k = s
indexOf(
\n
); //獲取每一個回車符的位置
if (k !=
) //存在回車符
{
lines +=
; //計算行數
drawText = s
substring(
k); //獲取每一行文本
g
drawString(drawText
ascent); //具體打印每一行文本
同時走紙移位
if (s
substring(k +
)
length() >
) {
s = s
substring(k +
); //截取尚未打印的文本
ascent += i;
}
}
else //不存在回車符
{
lines +=
; //計算行數
drawText = s; //獲取每一行文本
g
drawString(drawText
ascent); //具體打印每一行文本
同時走紙移位
s =
; //文本已結束
}
}
}
/*將打印目標文本按頁存放為字符串數組*/
public String[] getDrawText(String s) {
String[] drawText = new String[PAGES]; //根據頁數初始化數組
for (int i =
; i < PAGES; i++)
drawText[i] =
; //數組元素初始化為空字符串
int k
suffix =
lines =
;
while (s
length() >
) {
if (lines <
) //不夠一頁時
{
k = s
indexOf(
\n
);
if (k !=
) //存在回車符
{
lines +=
; //行數累加
//計算該頁的具體文本內容
存放到相應下標的數組元素
drawText[suffix] = drawText[suffix] + s
substring(
k +
);
if (s
substring(k +
)
length() >
)
s = s
substring(k +
);
}
else
{
lines +=
; //行數累加
//將文本內容存放到相應的數組元素
drawText[suffix] = drawText[suffix] + s;
s =
;
}
}
else //已滿一頁時
{
lines =
; //行數統計清零
suffix++; //數組下標加
}
}
return drawText;
}
) 計算需要打印的總頁數
public int getPagesCount(String curStr) {
int page =
;
int position
count =
;
String str = curStr;
while(str
length() >
) //文本尚未計算完畢
{
position = str
indexOf(
\n
); //計算回車符的位置
count +=
; //統計行數
if (position !=
)
str = str
substring(position +
); //截取尚未計算的文本
else
str =
; //文本已計算完畢
}
if (count >
)
page = count /
+
; //以總行數除以
獲取總頁數
return page; //返回需打印的總頁數
}
以jdk
以前的版本實現打印動作按鈕監聽
並完成具體的打印操作
private void printTextAction() {
printStr = area
getText()
trim(); //獲取需要打印的目標文本
if (printStr != null && printStr
length() >
) //當打印內容不為空時
{
PAGES = getPagesCount(printStr); //獲取打印總頁數
PrinterJob myPrtJob = PrinterJob
getPrinterJob(); //獲取默認打印作業
PageFormat pageFormat = myPrtJob
defaultPage(); //獲取默認打印頁面格式
myPrtJob
setPrintable(this
pageFormat); //設置打印工作
if (myPrtJob
printDialog()) //顯示打印對話框
{
try {
myPrtJob
print(); //進行每一頁的具體打印操作
}
catch(PrinterException pe) {
pe
printStackTrace();
}
}
}
else { //如果打印內容為空時
提示用戶打印將取消
JOptionPane
showConfirmDialog(null
Sorry
Printer Job is Empty
Print Cancelled!
Empty
JOptionPane
DEFAULT_OPTION
JOptionPane
WARNING_MESSAGE);
}
}
以jdk
新版本提供的API實現打印動作按鈕監聽
並完成具體的打印操作
private void printText
Action() {
printFlag =
; //打印標志清零
printStr = area
getText()
trim();
From:http://tw.wingwit.com/Article/program/Java/hx/201311/26650.html