JasperReport 学习必备手册

原创 2004年01月25日 21:21:00

JasperReport 学习必备手册

            (小弟第一次发帖,好像用小字体才好看些,大家将就一下)

 

       这是我学习JasperReport的一点经验,欢迎大家指正、赐教,我只是起个砖块的作用,大家就接着抛玉吧,希望最后真的能累成一个必备手册,呵呵。

       假设大家已经对JasperReport有一定的了解(至少知道大概的开发流程),这里就不赘述JasperReport的好处、设计、表达式的定义等JasperReport自带文档里有的东西了。

     可能因为我是java新手,所以遇到的问题特别多,下面仅列一些,并附上我的解决方法:

l         Jsp生成不了PDF的问题

l         生成HTMLJRHtmlExporterParameter.IMAGES_MAP的问题

l         中文显示的问题

l         图片显示的实现方法(JFreeChart)

l         我的通用 .jasper 生成方法

l         我的项目的实现

Jsp生成不了PDF的问题

       问题描述:运行自带的web(webapp目录下)例子时(我使用的服务器是TomCat),用Servlet生成PDF完全没问题,而JSP方式却报getOutputStream() has already been called for this response 的错,看JSP源码发现和Servlet差不多。

       问题原因Tomcat首先执行.jsp文件开始的Java代码,然后准备session, out等变量。而输出PDF的代码出现在.jsp文件开始的<% ... %>段中,这样HttpServerletResponsegetOutputStream()方法已被调用。在JSP规范中定义此方法只能被调用一次,这样当Tomcat准备out变量时必然会出错。

所以基于TomCat的服务器都会出错,如Jboss, Sun ONE AppServer

解决方法:很简单,按照JSP/Servlet规范定义输出非文本内容,如图片、声音等应该使用Servlet而不是JSP。在Servlet中输出流完全由应用程序按需打开/关闭。

虽然仿佛这不叫解决方法,但我查了很多地方,也没有找到更好的说法,所以大家做JasperReport还是用Servlet好了

生成HTMLJRHtmlExporterParameter.IMAGES_MAP的问题

       这算不得一个问题,只是当时我有点迷惑,就拿出来说说好了。

不知大家注意过没有,每次生成Html时,都有下面一段:

 <?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

       Map imagesMap = new HashMap();

       session.setAttribute("IMAGES_MAP", imagesMap);

      

       exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);

       exporter.setParameter(JRExporterParameter.OUTPUT_WRITER, out);

       exporter.setParameter(JRHtmlExporterParameter.IMAGES_MAP, imagesMap);

       exporter.setParameter(JRHtmlExporterParameter.IMAGES_URI, "image.jsp?image=");

特别是:

       exporter.setParameter(JRExporterParameter.OUTPUT_WRITER, out);

       exporter.setParameter(JRHtmlExporterParameter.IMAGES_MAP, imagesMap);

       exporter.setParameter(JRHtmlExporterParameter.IMAGES_URI, "image.jsp?image=");

这几句,感觉莫名其妙的,

最初猜想是显示图片用的,可到底是不是呢?

而且生成的Html页面的源码中,有很多

  <td><img src="image?image=px" width=40 height=1></td>

到底px是什么样的图片?

查看javadoc,写的过于简单,根本没有说明。于是,看源码:

 

              his.imagesMap = (Map)this.parameters.get(JRHtmlExporterParameter.IMAGES_MAP);

              if(this.imagesMap == null)

              {

                     this.imagesMap = new HashMap();

              }

 

………….

 

              this.loadedImagesMap = new HashMap();

              byte[] pxBytes = JRImageLoader.loadImageDataFromLocation("dori/jasper/engine/images/pixel.GIF");

              this.loadedImagesMap.put(pxBytes, "px");

              this.imagesMap.put("px", pxBytes);

哈哈,原形毕露了,原来px就是dori/jasper/engine/images/pixel.GIF(一个小不点),但它对网页的美观起了很大的作用,不信你写错Image(jspservlet)的路径看看(这也是个可能出错的地方)

中文显示的问题

       问题描述:生成的HtmlPDF中文显示为乱码或不显示

       解决方法(HTML)

如果只要求生成Html(可能不会有这么简单就能打发走的客户),很好办,如果是JSP  <%@ page contentType="text/html;charset=GB2312" %>

如果是Servletresponse.setContentType("text/html;charset=GB2312");

哈哈,大功告成,预知PDF的中文解决方法,请拨打收费咨询电话110

解决方法(PDF)

大家把手上的板砖放下吧,我说还不行吗,只是不知道这是不是正确或比较好的解决方法,请多指点。

       由于生成PDF时没有什么地方可以设置charset=GB2312(真是个天才的傻想法)

       我们分三步走好了。

1.由于JasperReport使用iText生成PDF,所以我们需要iText亚洲语言包

http://itext.sourceforge.net/downloads/iTextAsian.jar.

将他放在lib中。

2.在JasperReport的设计xml中,可以定义一个中文Font:

        <reportFont name="Arial_Normal" isDefault="true" fontName="Arial" size="12" pdfFontName="STSong-Light" pdfEncoding="UniGB-UCS2-H" isPdfEmbedded="true"/>

其中pdfFontName="STSong-Light" pdfEncoding="UniGB-UCS2-H"的就是iTextAsian.jar包中定义的字体了。

3.汉字都用UTF-8编码

       iReport保存的汉字都是UTF-8编码

       还可以使用UltraEdit,只需菜单Advanced – Configuration… - General 勾选 Auto detect UTF-8 files – (On),就可以用它编辑UTF-8编码的汉字了。

图片显示的实现方法(JFreeChart)

       所谓Report,图片自然必不可少,特别是所谓的chart,例子里有chart的实现,其实那只是实现的一种方法,将chart定义为variable,然后在ChartScriptlet.java(Scriptlet.)中生成chartsetVariableValue

       其实我们可以看到,由于JasperReport本身不带Chart功能,所以她(请容许我使用,谁让我是光棍程序员呢,嘿嘿)chart都是依靠别的工具生成,然后作为variable或者parameter传递的。这样我们就可以随心所欲的让她显示任何BufferedImage了,嘿嘿,管他是JfreeChart生成的还是静态image

我比较倾向于定义为parameter,因为可以在生成JRDataSource的同一个程序中得到Chart的数据,免去Scriptlet里的数据库操作,或者如果是简单报表,直接Scriptlet都省了。

tartdioengnget.javaRITER, out);

我的通用 .jasper 生成方法

       JasperReport自带的范例都是用ant构建的,但每个范例有不同的build.xml.class,那么能不能有一个统一的构件程序呢?iReport可以,但他每次都会写所有的属性,显得页面很不整洁、明了,所以我修改了一个范例的build.xm..class,来构建我的JasperReport。有兴趣的同道可以看看。

       1.在build.xml中定义      

<property name="filename" value="" />

用于动态传递文件名

2.替换所有的 <arg value="-F*******.xml"/><arg value="-F${filename}.xml"/>  

3.修改程序,每次FILL时都传JREmptyDataSource进去。

每次build时,只需在以前的基础上加上参数:

-Dfilename=******

如:ant compile -Dfilename="myDemo"

我的项目的实现

只是进行了简单的封装,可能并不适用于其他系统,如果需要,请与我联系。

(这次时间比较仓促,等有时间再补上)

 

我得联系方式:

 

       QQ:   20469438

       Email:      avidmouse@qianlong.com

 

 

 

JasperReport学习必备手册

 Jsp生成不了PDF的问题        问题描述:运行自带的web(webapp目录下)例子时(我使用的服务器是TomCat),用Servlet生成PDF完全没问题,而JSP方式却报getOutp...
  • Mr_Von
  • Mr_Von
  • 2008年09月25日 11:26
  • 893

JasperReport 学习必备手册

JasperReport 学习必备手册               这是我学习JasperReport的一点经验,欢迎大家指正、赐教,我只是起个砖块的作用,大家就接着抛玉吧,希望最后真的能累成一个必备...
  • squall098
  • squall098
  • 2007年03月07日 22:38
  • 1076

oracle很详细的讲解

http://download.csdn.net/detail/u011366166/5732751
  • yjtgod
  • yjtgod
  • 2013年07月16日 12:24
  • 482

手写代码必备手册(C版) —— 读书笔记 1、字符串 API

现场编写 strcpy, strlen, strstr, atoi 等库函数 typedef unsigned int size_t 1、1 strlen 实现 strlen,获取字符...
  • Cowena
  • Cowena
  • 2015年08月23日 09:25
  • 1159

机器学习必备手册

点击有惊喜 请收下这份关于人工智能的根目录——博客整理系列(一) 关于数据科学的那些事——博客整理系列(二) 机器学习必备手册——博客整理系列(三) 扩展眼界的...
  • yunqishequ1
  • yunqishequ1
  • 2017年10月11日 11:38
  • 97

读书要多动手写代码

发现自己写代码不够多
  • cynixway
  • cynixway
  • 2011年11月12日 22:45
  • 186

KDnuggets整理最新机器学习必备十大入门算法!都在这里了

原文来源:KDnuggets 作者:Reena Shaw 「雷克世界」编译:BaymaxZ 我们向初学者介绍十大机器学习(ML)算法,并附上数字和示例,方便理解。 简介...
  • Ksf3kg7dU95rn0XL
  • Ksf3kg7dU95rn0XL
  • 2017年10月22日 00:00
  • 697

JasperReport初级教程(2.0.3)图文详解_绝对原创

如何调用Java代码,请查看另一篇文章: JasperReport初级教程(2.0.3)调用Java代码_图文详解_绝对原创  如需转载,请注明出处,http://www.川江号子.cn    。 另...
  • yuanfen127
  • yuanfen127
  • 2007年12月29日 01:01
  • 17595

嵌入式各类MCU的学习方法

来自:http://hi.baidu.com/embedded?page=2    最近重新整理了一下过去几年学习的51单片机、stm32、dsp和嵌...
  • u014183377
  • u014183377
  • 2015年01月23日 18:01
  • 516

Servlet实用学习手册,学这个必须懂

Servlet,服务器端的小程序,它是相对于Applet而言的,Applet是客户端小程序。 Servlet,是接受来自网络的请求(form表单,以及其他的请求),并对不同请求作出不同的响应 Se...
  • mynote
  • mynote
  • 2016年07月06日 22:06
  • 512
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:JasperReport 学习必备手册
举报原因:
原因补充:

(最多只允许输入30个字)