为了正常的体验网站,请在浏览器设置里面开启Javascript功能!
首页 > 基于iText的PDF报表设计

基于iText的PDF报表设计

2012-02-14 3页 pdf 50KB 39阅读

用户头像

is_474332

暂无简介

举报
基于iText的PDF报表设计 电脑知识与技术 开发研究与设计技术 本栏目责任编辑:谢媛媛 1引言 开发 B/S结构的应用程序最头疼的问题可能就是报表打印 了,由于浏览器的种种限制,以网页的形式输出无法定制满足用 户需求的报表,下面讨论一种利用免费的第三方组件 iText,实现 报表打印功能的简单易行的方式。 iText是开源的纯 java组件,用于创建和生成 PDF文档。i- TextAPI使得Java开发人员可以利用编程来创建PDF文档,它有 如下强大功能:支持 PDF和 FDF文档、页面大小可变、可设置不 同的文档布局和页边距、可创建表格、...
基于iText的PDF报表设计
电脑知识与技术 开发研究与设计技术 本栏目责任编辑:谢媛媛 1引言 开发 B/S结构的应用程序最头疼的问题可能就是打印 了,由于浏览器的种种限制,以网页的形式输出无法定制满足用 户需求的报表,下面讨论一种利用免费的第三方组件 iText,实现 报表打印功能的简单易行的方式。 iText是开源的纯 java组件,用于创建和生成 PDF文档。i- TextAPI使得Java开发人员可以利用编程来创建PDF文档,它有 如下强大功能:支持 PDF和 FDF文档、页面大小可变、可设置不 同的文档布局和页边距、可创建表格、可加入页眉/页脚/页号、可 使用各种字体/颜色、可对文档进行加密、支持 JPEG/GIF/PNG和 WMF格式的图像、对列表排序或者打乱顺序、制造阴影/水纹等效 果、生成文档模板。 2开发环境 struts1.2、itext-1.4.3、TOMCAT5.5、MyEclipse5.0GA,系统安 装及配置请自行完成。下面给出如上环境下的完整开发过程。 3开发过程 图1为从实际系统中抽取出来的PDF报表序列图,相关参数 延用了原系统的定义。其基本流程是:在“searchResult.jsp”页面中 单击“打印”按钮?调用script函数 openwin('/cxcdc/icPrintInfor.do ')? 调用 SERVLET“influenzaCasePrintInfor.JAVA”完成打印功 能,具体设置及开发过程如下。 图1 3.1openwin('/cxcdc/icPrintInfor.do') functionopenwin(openfile) { window.open(openfile,'报表打印','channelmode=yes, height=screen.availheight-30,width=screen.availWidth,resizable=yes, scrollbars=yes,status=yes,toolbar=no,location=no,menubar=no,direc- tories=no,left=0,top=0');} 打开独立窗口,在其中执行请求'/cxcdc/icPrintInfor.do',该 请求在如下配置文件 struts-config.xml中映射成一个 forward"/ servlet/icPrintInforPdf"。 3.2struts-config.xml 3.3WEB.XML cdcPrintPdf org.cxcdc.struts.influenzaCasePrintInfor ... cdcPrintPdf /servlet/icPrintInforPdf 在本文件中定义“/servlet/icPrintInforPdf”相应的 servlet类为 org.cxcdc.struts.influenzaCasePrintInfor. 3.4influenzaCasePrintInfor.java 这是一个servlet类,是实现PDF报表打印的核心代码。 packageorg.cxcdc.struts; ...... publicinfluenzaCasePrintInfor() { } PublicvoiddoGet(HttpServletRequestrequest,HttpServletRe- sponseresponse)throwsIOException,ServletException {Documentdocument=newDocument(PageSize.A4,36,36,36, 36);//① ByteArrayOutputStreamba=newByteArrayOutputStream(); try{ PdfWriterwriter=PdfWriter.getInstance(document,ba);//② MyPageEventsevents=newEvents().getPageEvents(); 收稿日期:2007-04-15 作者简介:王丽萍(1983-),女,吉林人,在读硕士研究生,主要研究方向:信息系统分析、数据挖掘、智能决策系统;秦永平(1962-),男,江苏 人,副教授,硕士,主要研究方向:信息系统分析、数据挖掘、信息安全。 基于iText的PDF报表设计 王丽萍,秦永平 (炮兵学院计算机教研室,安徽 合肥 230031) 摘要:介绍了开源的iText组件的主要功能,实际项目开发中在比较了浏览器中各种 WEB打印方法后,选择了基于 iText的 PDF报 表设计方法,给出了基于iText创建和生成PDF报表的开发环境、开发过程,并给出了完整实例 关键词:iText;PDF;struts;MyEclipse 中图分类号:TP302 文献标识码:A 文章编号:1009-3044(2007)08-20492-02 ThePDFTableDesignBasediText WANGLi-ping,QINYong-ping (TeachingandSectionofComputer,ArtilieryAcademy,Hefei230031,China) Abstract:ThemainfunctionoftheiTextmoduleareintroduced,AftercomparingvariousWEBprintmethods,thePDFtabledesign basediTextisselected.Thenthedevelopmentenvironment,developmentprocessisgiven,andacompleteexampleisprovided Keywords:iText;PDF;struts;MyEclipse 492 本栏目责任编辑:谢媛媛 开发研究与设计技术 writer.setPageEvent(events);//页码设置 document.open();//③ BaseFontbfChinese=BaseFont.createFont("STSong-Light"," UniGB-UCS2-H",BaseFont.NOT_EMBEDDED);//④ FontFontChinese=newFont(bfChinese,10,Font.BOLD); FontFontChinese1=newFont(bfChinese,20,Font.NORMAL); FontFontChinese2=newFont(bfChinese,5,Font.NORMAL); float[]widths={60f,60f,60f,40f,40f,80f,60f,60f,60f,60f,60f, 60f};//⑤ PdfPTablet=newPdfPTable(widths);//⑥ t.setWidths(widths); t.setWidthPercentage(100);//percentage t.getDefaultCell().setPadding(3); t.getDefaultCell().setBorderWidth(1); t.getDefaultCell().setHorizontalAlignment(Element.ALIGN_CEN- TER); t.setTotalWidth(550); t.setLockedWidth(true); Paragraphtitle1=newParagraph("流感病例登记册",FontChi- nese1); title1.setAlignment(Element.ALIGN_CENTER); document.add(title1); //⑦表格名称 Datenow=new Date(); DateFormatdf=DateFormat.getDateInstance(); Stringqqq = df.format(now); Paragraphtitle2=newParagraph(qqq,FontChinese); title2.setAlignment(Element.ALIGN_RIGHT); document.add(title2); //当前日期 t.addCell(newPhrase("病例编号",FontChinese));//⑧表头 ...... t.addCell(newPhrase("转归情况",FontChinese)); t.setHeaderRows(1);//表头结束 t.getDefaultCell().setBorderWidth(1); t.addCell(newPhrase(icID,FontChinese));//准备数据 t.addCell(newPhrase(ic_Name,FontChinese)); t.addCell(newPhrase(ic_BirthDate,FontChinese)); ⋯⋯ Paragraphtitle3=newParagraph(" ",FontChinese2); document.add(title3); document.add(t);//⑨加入数据 } catch(Exceptionde) { de.printStackTrace(); System.err.println("ADocumenterror:"+de.getMessage()); } document.close();//⑩ response.setContentType("application/pdf"); response.setContentLength(ba.size()); ServletOutputStreamout=response.getOutputStream(); ba.writeTo(out); out.flush();}} 可以看到一个PDF文件的输出,总共只需要如下步骤 ①创建一个Document实例 Documentdocument=newDocument(PageSize.A4,36,36,36, 36) 同时设置PDF文档页面大小及页面的4个边距。 ②将Document实例和文件输出流用PdfWriter类绑定在一起 PdfWriter.getInstance(document,newFileOutputStream("Hel- loWorld.pdf")); ③打开文档 document.open(); ④中文设置 为了解决中文的输出问题,需要多下载一个名为 iTextAsian. jar的JAR包。这个包里面定义了与中文输出相关的一些文件。 为了输出中文,需用如下语句: BaseFontbfChinese=BaseFont.createFont("STSong-Light"," UniGB-UCS2-H",BaseFont.NOT_EMBEDDED); FontFontChinese=newFont(bfChinese,10,Font.BOLD); ...... Paragraphtitle1=newParagraph("流感病例登记册",FontChi- nese1); 第一行,定义了一种中文基础字体,第二行,用这个中文的基 础字体实例化了一个字体类,其后,可将字体类用到了一个段落 中。 在这几行里,我们经常关心的首先就是第一行的 “STSong- Light”,这个定义了使用的中文字体,iTextAsian.jar文件中提供了 几个可供使用的字体,都是以properties结尾的文件。再要注意的 就是,第一行的“UniGB-UCS2-H”,定义文字的编码标准和样式 GB大家都知道了,H是代表横排字,V代表竖排字。 ⑤设置表格各栏宽度 ⑥创建一个PdfPTable或Table实例 先明确一个关系,iText中一个文档(Document),可以有很多 个表格(PdfPTable),一个表格可以有很多个单元格(PdfPCell),一 个单元格里面可以放很多个段落(Paragraph),一个段落里面可以 放一些文字。还有要注意的就是没有行的概念,一个表格直接里 面直接放单元格,如果一个 3列的表格中放进 6个单元格的话, 那么就是两行的表格。 常用的表格形式有二种:PdfPTable、Table,一般PdfPTable用 于较复杂表格,Table用于简单表格,但 PdfPTable只能实现跨列, 不能实现跨行,故其表头设计不太方便。 ⑦设置表格名称 ⑧设置表头 对于表头设置PdfPTable和Table稍有不同,下面分别介绍。 PdfPTable: 用多个 t.addCell(newPhrase("***",FontChinese))设置表头内 容,t.setHeaderRows(1)表示表头结束(在此设置了头一行为表格 头)。 可以利用 PdfPCell对象设置跨列,方法为: cell.setColSpan (3); Table: Tablet=newTable(num*2+1,20);//根据用户选定的疾病数量 num确定表格列数 Cellcell_area=newCell(newParagraph("地区",FontChinese)); cell_area.setRowspan(2);//跨二行 cell_area.setHorizontalAlignment(Element.ALIGN_CENTER); t.addCell(cell_area); Cellcell=newCell(newParagraph("流感",FontChinese)); cell.setColspan(2);//跨二列 cell.setHorizontalAlignment(Element.ALIGN_CENTER); cell. setVerticalAlignment(Element.ALIGN_CENTER); t.addCell(cell); t.addCell(newPhrase("发病数",FontChinese)); t.addCell(newPhrase("死亡数",FontChinese));t.endHeaders();// setHeaderRows(2);//表头结束 (下转第574页) 493 电脑知识与技术 计算机教育 本栏目责任编辑:王力 艰巨了。在教学实施过程中,教师的引导是关键,要引导学生自己 积极思考,主动探索,激发学生的探索意识。全体同学的整体引导 和个体学生的个别引导相结合,可以取得传统教学无法企及的教 学效果。 3.1.4以学生为主体,突出培养学生的创新意识 在以学生为主体的教学实践中,要注意培养学生的创新意识 和创新能力。首先要为学生创造创新的环境和尽可能多的创新机 会。只有在自主学习的环境里,学生才有可能发挥创造性,只有给 学生一些具体的实际任务让学生去实践,他们才有机会去发挥创 造性。 3.2激发学生的学习兴趣 激发学生的间接学习兴趣,学生自己思考,自己学习,自己寻 求解决方法,自己解决了问题,并在全体同学面前得到教师的肯 定和表扬,这种成就感会使学生对继续取得这种肯定产生极大兴 趣。学生学会了一定技能,并用来解决了一些实际问题,这种成就 感带来的满足,也是激发学生学习兴趣的一个重要因素。 3.3以任务为主线精心设计课程 3.3.1“任务—搜索—尝试—提高”是任务驱动的一条龙 有了任务,不会做,便产生问题,有了问题最好引导学生首先 自己主动去搜索,所谓搜索就是去寻找解决问题的方法。学生必 须学会查,学会找,也就是学会搜索。搜索是整个认知结构的一个 重要组成部分。有些学生学不会或不能增长能力的原因常常是不 会自己去搜索需要的知识。 尝试和搜索到的解决问题的方法是否可行,必须通过尝试去 验证。认知结构有了搜索和尝试,才是一个有生命力的可以不断 发展的动态结构。有了这样的结构,就实现了平常所说的学习中 的举一反三,因为即使没学过,也可以去找、去试。死记硬背一些 孤立的知识点,充其量也只能达到学一会一,那是静态的。即使对 于教师讲解的任务,教师也要用搜索—尝试的方式去讲,给学生 做一个示范,如何搜索,如何尝试。 对解决任务中的可能遇到的关键点、难点及相关的新概念、 新问题可以进行一定的讲解。有些任务,如果有条件可以不讲的, 就可以直接让学生自己尝试去解决。要鼓励学生大胆尝试。同学 们学不好的原因之一就是不敢试。尝试成功了,会体验到成功的 快乐,自我赏识之心油然而生,人生的自信就可以从这里建立。这 也是赏识教育的极好方式。如果尝试不成功,就让学生再去搜索, 在搜索和尝试这两步间进行循环,直至任务解决。 任务完成了,但这个任务的学习过程还没有完结。解决了一 个问题,学会了一些东西,而这只是解决了这样一个个别案例的 方法,它是否还可以应用在其它地方,它是不是具有普遍性,这是 接下来要关心的问题。要把建立起来的认知结构主动迁移到方法 接近的其他任务上。这样,只要抓住少数一些基础的共性的任务, 便可以解决大多数任务。 3.3.2任务链应构成合适的支架 各个章节的任务设计不是孤立的,应从全局考虑,使任务由 浅入深,形成一个合适的支架。学生的认识和能力就是沿着这样 的支架逐渐地、顺利地从低级升到高级。有的老师为了解决一个 小问题,要讲一大堆预备知识,理由是不讲这些知识,学生就不能 明白解决这个问题的方法。其实不要期望学生一下子全懂、全明 白、全会。学生一个任务一个任务地向前走,问题一点一点地解 决,紧贴应用,渐入佳境,这是最好的学习状态。可以让学生自己 考虑或讨论前面的任务应该如何扩展,补充和完善。这种增量式 任务设计对提高学生考虑问题的全面性以及思路的扩展有更大 的好处。 3.4评测任务的完成情况 有任务一定要有检查,推荐的做法是:每个学生每完成一个 任务,都必须由老师亲自检查是否符合要求,达到要求在记分册 上做。这是很多老师在教学实践中都深有体会的一点。要想 提高计算机课堂教学效果,必须把好上机这一关,必须对学生的 上机情况做出及时的反馈。 3.5交流和互相评价 同学们在完成任务的过程中,思路可能并不全面,想法也可 能不相同,完成任务后的交流,可以弥补这方面的不足,让学生在 比较中思考更多的问题,取长补短,使学习更趋于全面。在这个过 程中,学生还锻炼了交流的能力,学会在交流中学习的方法。 4结束语 建构主义理论特别适合在计算机实践教学中应用,对于从事 计算机教学的教师既是发展的机遇,又是挑战。在计算机教学体制 改革的同时,也应当提高自身的素质、利用先进的教学辅助手段和 先进的教学理论。对计算机实践教学改革的探索我们还在继续。 参考文献: [1]陈越.建构主义与建构主义学习理论综述[M].上海:上海教 育出版社,2003. [2]李梅,张俐蓉,编译.从概念到实践[M].上海:上海市教科院 现代教育实验室,2002. [3]韩洪梅,等.谈计算机基础教学的现状与改革[C].全国高等 院校计算机基础教育研究会 2006学年学术论文集.北京:清华大 学出版社,2006.11-16. (上接第493页) 和 PdfPTable相比主要的不同是能跨行跨列,本例为跨二行 跨二列,表头结束需调用t.endHeaders()方法。执行效果见图2。 图2 ⑨加入数据 t.addCell(newPhrase(数据,FontChinese)); ...... document.add(t); ⑩关闭文档:document.close() 4结束语 利用了免费的控件 iText实现 WEB报表打印,可以随意定制 各类格式的文档,既快捷方便,又经济实惠,不失为一个很好的选 择。 参考文献: [1]ECLIPSE编程技术与实例[M].北京:人民邮电出版社,2006. [2]STRUTS开发入门与项目实践[M].北京:人民邮电出版社, 2005. [3]JSP动态网页入门实务[M].北京:科学出版社,2001. 574
/
本文档为【基于iText的PDF报表设计】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索