知识大全 Java打印程序设计全攻略
Posted 知
篇首语:读书贵神解,无事守章句。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 Java打印程序设计全攻略相关的知识,希望对你有一定的参考价值。
开发技巧:Java打印程序设计全攻略 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
前言 在我们的实际工作中 经常需要实现打印功能 但由于历史原因 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(); cha138/Article/program/Java/hx/201311/26650相关参考
cha138/Article/program/Java/hx/201311/27053
对于java的打印问题各种书上谈的很少我想主要原因可能是java的打印功能太弱了没有什么可介绍的最近我因为工作的关系用到了java的打印图象功能不过因为缺少可参考的例子和教材我只有查看jdk的AP
Java繁体中文处理完全攻略(一) 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 许多人用Jav
用Java代码生成打印收据 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 首先来看看效果如下图
Java高级编程:使用打印服务API二(图) 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 选择
知识大全 用java实现输入ASCII码,打印出对应的大写字母。
用java实现输入ASCII码,打印出对应的大写字母。 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧
找工作定要过面试槛。职业竞争的加剧,使得求职者对在短短十几分钟面试中能否充分展示自己越来越重视——履历精心设计,服饰用心挑选,有人甚至走上手术台“改头换面”。求职过程中,什么样的“包装”合适有效?求职
知识大全 在java中请应用学过的知识,使用面向物件的思想实现影院选座功能,要求打印出座点阵图
在java中请应用学过的知识,使用面向物件的思想实现影院选座功能,要求打印出座点阵图你跟我刚才回答的那个问题是同学吧,我刚贴出来。下次提问之前可以先搜一下---------------分割线---下面
知识大全 我安装好惠普1010打印机驱动程序后,还是打印不出文档,这是为什么
我安装好惠普1010打印机驱动程序后,还是打印不出文档,这是为什么打印机驱动的安装:1、在官方网站上面下载好打印机的驱动,网上搜索打印机驱动,进入官方即可下载;2、下载好驱动安装程序包后,然后解压,保
知识大全 通过jacob对excel,word进行打印等操作
因为项目有个需求要求能够在某个预定时间对特定报表进行自动打印报表的形式主要是excel如果是c++或者c#什么的简直是小菜一碟可惜偏偏是java实现并且这又不同于常见的页面手工打印可以通过java