Java打印程序设计
1前言
在我们的实践工作中,常常需求终结打印功能。但由于前史因素,Java提供的打印功能一向都比较弱。实践上开始的jdk底层不支持打印,直到jdk1.1才引入了很轻量的打印支持。所以,在曾经用Java/Applet/JSP/Servlet设计的程序中,较杂乱的打印都是通过调用ActiveX/OCX控件或者VB/VC程序来终结的,非常烦恼。实践上,SUN企业也一向致力于Java打印功能的完善,而Java2平台则总算有了一个强大的打印模式的开始,该打印模式与Java2D图形包充沛结组建一体。更令人鼓舞的是,新发布的jdk1.4则提供了一套完整的Java打印服务API(JavaPrintServiceAPI),它对已有的打印功能是活跃的补充。利用它,我们可以终结大多数实践使用需求,包括打印文字、图形、文件及打印预览等等。这篇文章将通过一个详细的程序实例来说明如何设计Java打印程序以终结这些功能,并对不一样版本的终结方法进行分析比较,希望大家能从中获取一些有利的提示。
2Java中的打印
2.1Java的打印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.1Printable的打印对话框
开始打印工作之前,可以通过PrinterJob.printDialog来显示一个打印对话框。它给用户一个时机以选择应该打印的页码范围,并可供用户改动打印设置。它是一个本地对话框。
事实上,当从一个Printable方案进行一个打印工作时,打印方案并不认识需求打印多少页。它仅仅不停地调用print方法。只需print方法回来Printable.PAGE_EXISTS值,打印工作就不停地生成打印页,直到print方法回来Printable.NO_SUCH_PAGE时,打印工作才中止。
由于打印工作只要在打印终结后才进行精确的页数计算,所以在对话框上的页码范围是没有初始化的。我们可以通过构建一个java.awt.print.Book方案传递给打印方案;也可以通过指定的格式计算需求打印的页数并传递给打印方案,使其精确地认识要打印多少页。
2.3.2ServiceUI的打印对话框
与Printable的对话框不一样的是,在jdk1.4提供ServiceUI的打印机对话框的缺行为现已用新的API更改了:缺状况下对话框不显示。我们有必要使用ServiceUI类调用printDialog方法创建如下所示的打印对话框。
3Java打印程序设计实例
3.1打印文本
3.1.1使用场景
假定我们需求打印一个窗体的某个文本编辑域(可能只要几行,也可能包括多页)的内容,而且每页最多打印54行,如何终结呢?
3.1.2解决方法
基本思路如下:首要我们需求终结Printable接口,然后按照每页最多54行的格式计算共需求打印多少页,当打印文本的按钮被点击时,履行相应的打印动作。打印文本的详细操作可通过Graphics2D的drawString方法来终结。
1、终结Printable接口
/
Graphic指明打印的图形环境<imgsrc="static/image/smiley/default/titter.gif"smilieid="9"border="0"alt=""/>ageFormat指明打印页格式(页面大小以点为计量单位,1点为1英寸的1/72,1英寸为25.4毫米。A4纸大致为595×842点);page指明页号
/
publicintprint(Graphicsg,PageFormatpf,intpage)throwsPrinterException{
Graphics2Dg2=(Graphics2D)g;
g2.setPaint(Color.black);//设置打印色彩为黑色
if(pagegt;=PAGES)//当打印页号大于需求打印的总页数时,打印工作结束
returnPrintable.NO_SUCH_PAGE;
g2.translate(pf.getImageableX(),pf.getImageableY());//转换坐标,确定打印边界
drawCurrentPageText(g2,pf,page);//打印当前页文本
returnPrintable.PAGE_EXISTS;//存在打印页时,持续打印工作
}
/
打印指定页号的详细文本内容
/
privatevoiddrawCurrentPageText(Graphics2Dg2,PageFormatpf,intpage){
Strings=getDrawText(printStr);//获取当前页的待打印文本内容
//获取默许字体及相应的尺度
FontRenderContextcontext=g2.getFontRenderContext();
Fontf=area.getFont();
StringdrawText;
floatascent=16;//给定字符点阵
intk,i=f.getSize(),lines=0;
while(s.length()gt;0lines0){
s=s.substring(k+1);//截取没有打印的文本
ascent+=i;
}
}
else//不存在回车符
{
lines+=1;//计算行数
drawText=s;//获取每一行文本
g2.drawString(drawText,0,ascent);//详细打印每一行文本,一起走纸移位
s=;//文本已结束
}
}
}
/
将打印方案文本按页寄存为字符串数组
/
publicStringgetDrawText(Strings){
StringdrawText=newString;//依据页数初始化数组
for(inti=0;i0){
if(lines0)
s=s.substring(k+1);
}
else
{
lines+=1;//行数累加
//将文本内容寄存到相应的数组元素
drawText=drawText+s;
s=;
}
}
else//已满一页时
{
lines=0;//行数计算清零
suffix++;//数组下标加1
}
}
returndrawText;
}
2、计算需求打印的总页数
publicintgetPagesCount(StringcurStr){
intpage=0;
intposition,count=0;
Stringstr=curStr;
while(str.length()gt;0)//文本没有计算结束
{
position=str.indexOf('\n');//计算回车符的方位
count+=1;//计算行数
if(position!=-1)
str=str.substring(position+1);//截取没有计算的文本
else
str=;//文本已计算结束
}
if(countgt;0)
page=count/54+1;//以总行数除以54获取总页数
returnpage;//回来需打印的总页数
}
3.1、以jdk1.4曾经的版本终结打印动作按钮监听,并终结详细的打印操作
privatevoidprintTextAction(){
printStr=area.getText().trim();//获取需求打印的方案文本
if(printStr!=nullprintStr.length()gt;0)//当打印内容不为空时
{
PAGES=getPagesCount(printStr);//获取打印总页数
PrinterJobmyPrtJob=PrinterJob.getPrinterJob();//获取默许打印工作
PageFormatpageFormat=myPrtJob.defaultPage();//获取默许打印页面格式
myPrtJob.setPrintable(this,pageFormat);//设置打印工作
if(myPrtJob.printDialog()
(error)
[下载]22271710470.rar
|