`
aokunsang
  • 浏览: 815971 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

jasperReport+struts2+jatoolsPrinter打印

阅读更多

前言

      jasperReport(4.5最新版,下面用ireport代替)大家都很熟悉,但是打印用到jatoolsPrinter的,应该不多吧、这里介绍下struts2的ireport插件,以及jatoolsPrinter打印。

 

 

1、首先得准备支持ireport的几个常用包,根据ireport版本的不同,包的新旧也不同,我用的ireport最新版的,所以用到的包也得是最新的,下面还会列出我遇到的包的问题;

   a>groovy-all-1.7.5.jar

   b>iText-2.1.0.jar[生成pdf文档用]

   c>iTextAsian.jar[语言支持]

   d>jasperreport_4.5.0.jar[必备包]

   e>poi-3.7.jar[导出excel时候用]

   f>commons-collections-3.2.jar

   g>commons-beanutils-1.7.1.jar

   h>commons-digester-1.7.jar

   i>org-netbeans-core.jar[可有可无,当你对报表进行样式处理时候(styles)会用到,比如:奇偶换色等]

 列举几个包的问题:

   Ⅰ、导出excel时候报错:

org.apache.jasper.JasperException: javax.servlet.ServletException: java.lang.NoSuchMethodError: org.apache.poi.hssf.usermodel.HSSFSheet.setRightToLeft(Z)V

      解决方法:你使用的poi-xxx.jar版本过低,换个高版本的jar包即可。

   Ⅱ、生成PDF格式文档时候报错:

java.lang.NoSuchMethodError: com.lowagie.text.pdf.PdfWriter.setRgbTransparencyBlending(Z)V

      解决方法:iText.jar文件过旧,将之改为2.1.X就可以了。

   Ⅲ、使用ireport时候报错:

java.lang.NoClassDefFoundError: org/codehaus/groovy/control/CompilationFailedException  

      解决方法:添加groovy-all-1.7.5.jar。ps:像这样的错误(java.lang.NoClassDefFoundError)最好解决,一看就是少了Jar包,找到添加上就OK了。

   Ⅳ、使用ireport时候报错:

net.sf.jasperreports.engine.JRRuntimeException: Unknown hyperlink target 0

      解决方法:版本不搭配的问题,可能会是当前使用的iRrport 的版本高于操作时的包的版本。

   Ⅴ、在使用PDF格式预览的时候报错:

net.sf.jasperreports.engine.JRRuntimeException: Could not load the following font :

pdfFontName   : STSong-Light

pdfEncoding   : UniGB-UCS2-H

isPdfEmbedded : false

      解决办法:添加语言包支持,iTextAsian.jar。ps:这里需要注意,有中文字的field,如果想在PDF格式文档中正常显示,一定需要设置其两个属性pdfFontName和pdfEncoding为STSong-Light,UniGB-UCS2-H;否则不显示。

   Ⅵ、在ireport中设计报表时候预览报错:

org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed;......

    解决办法:你使用了text field存放静态文本那内容了,改为static field存放就ok。

 

2、和struts2结合,肯定得需要一个插件包struts2-jasperreports-plugin-2.0.11.2.jar,这里需要注意它里面的struts-plugin.xml文件中的包并没有继承自struts-default,需要把它拿出来改一下

<package name="jasperreports-default" extends="struts-default">

   定义Result类型为jasper时,需要指定三个参数:

1、location:指定.jasper文件的位置.

2、format:指定生成的报表文件的格式,如果不指定,默认生成PDF文件(XLS:excel格式,HTML:html格式,CSV,XML,。。。).

3、dataSource:指定一个集合属性名,JasperReports报表将自动迭代输出该集合中的数据。

 

项目中,我对该插件进行了改进和升级。如果按照原插件的原理,我每次都需要查询得到一个结果集,传递给ireport进行显示。既然ireport设计器可以直接连接JDBC数据源查询数据,我们何不把查询结果集的事情也交给ireport来做呢。

于是修改插件源代码,思路如下:

1、首先需要给ireport提供一个数据源(c3p0或者dbcp),使其能够进行数据库操作【属性名:connection】。

2、再提供一个Map格式数据,向ireport传递参数【属性名:reportParameters】。

3、还有两个参数location和format,以及dataSource。

核心代码修改如下:

 

//定义两个变量,传递参数和数据源连接。
protected String reportParameters;
protected String connection;

ValueStack stack = invocation.getStack();
//先从stack获取数据源,如果为null,判断其是否为JRDataSource,若是转换成JRDataSource,否则,再采用ValueStackDataSource方式赋值给JRDataSource接口
Connection conn = (Connection) stack.findValue(connection);   //获取提供的数据源
if (conn == null){
Object obj  = stack.findValue(dataSource);
if(obj instanceof JRDataSource) {
	jrDataSource = (JRDataSource) obj;
}else {         
	jrDataSource = new ValueStackDataSource(stack, dataSource);
}
}
...
ServletContext servletContext = (ServletContext) invocation.getInvocationContext().get(ServletActionContext.SERVLET_CONTEXT);
String systemId = servletContext.getRealPath(finalLocation);
File directory = new File(systemId.substring(0, systemId.lastIndexOf(File.separator)));
Map parameters = new ValueStackShadowMap(stack);
parameters.put("reportDirectory", directory);
parameters.put(JRParameter.REPORT_LOCALE, invocation.getInvocationContext().getLocale());
//获取向ireport传递的参数
Map reportParams = (Map) stack.findValue(reportParameters);
if (reportParams != null) {
    parameters.putAll(reportParams);
}
.....
if (conn == null){
	jasperPrint = JasperFillManager.fillReport(jasperReport, parameters, jrDataSource);
}else{
	jasperPrint = JasperFillManager.fillReport(jasperReport, parameters, conn);
}

然后写一个公用的Action,代码如下:
/**
 * @author aokunsang
 * @date 2012-1-20
 */
@Component("jasperReportAction")
@Scope("prototype")
public class JasperReportAction extends ActionSupport {

	private List<?> list;           //相当于dataSource,集合属性,查询的结果集[如果想使用list,则connection一定为null,否则没用]
	private Connection connection;  //数据源连接
	@Resource(name="dataSource")
	private PooledDataSource dataSource;   //数据源
	private Map<String,?> para;     //传递的参数
	
	public String execute() throws Exception {
		this.connection = dataSource.getConnection();
		if(connection != null ){
		    this.list = null ;
		}
		return SUCCESS;
	}
      setter和getter....
}
 
struts.xml配置如下:
首先要把插件配置进去,你可以写个struts-plugin.xml,也可以直接写到struts.xml中(因为我使用的注解,struts.xml配置文件较少,直接写进去了)。
 <package name="aa" extends="struts-default">
	<!-- 设置JasperReport的type类型 -->
	<result-types>
		<result-type name="jasper" class="xxx.report.JasperReportsResult"/>
	</result-types>
	<!-- 报表输出Action -->
	<action name="JR_*_*" class="jasperReportAction">
	    <result name="success" type="jasper">
	        <param name="location">/reports/{1}.jasper</param>                
	        <param name="connection">connection</param>
		<param name="format">{2}</param>
		<param name="reportParameters">para</param>
		<!--<param name="dataSource">list</param>-->  <!-- 注意:connection和dataSource不能共存。两个共存时,优先级是connection高。  -->
	    </result>
	</action>
</package>
 Okay,到这里ireport和struts2的结合就完成了,其难点就在于插件中对数据源的修改,接下来说说jatoolsPrinter打印。

3、目前常用的web打印应该是applet了吧,不过它需要在IE上安装几十兆的jre,我是很不喜欢,我想你的客户应该也不喜欢这个东西吧。
既然说到打印,肯定说的就是套打,简单打印自不必多说,页面打印就ok。看看web套打的解决方案:
一、浏览器的打印功能菜单
这种方案的优势是不需要对浏览器作任何扩充,是最简单的办法,但问题也最多,如:
  1、不能精确分页。浏览器一般是根据用户设置的页面大小,web页面的内容多少,来自行决定分页位置,程序员很难控制。会有页脚页眉干扰。
  2、不能准确对齐边边距及打印文字。
  3、不能解决连续打印。比如,不是仅打印一张票据,而是连续一次打印若干个票据。
二、使用webbrowser控件+ javascript
这实际上,是浏览器打印功能菜单的一种程序调用,与打印功能菜单没什么两样。分页的问题仍然存在,只不过,可以让用户不用去点菜单,直接在网页中的一个按钮,或一个链接里面调用罢了。

三 、使用print css 
这是一种最理想的实现web套打的方法。这种方法通过在html文档中,嵌入打印相关的css样式,来实现对html文档输出打印的控制,比如设置纸张大小,纸张纵横方向,打印边距,分页等。显而易见,这种方式成本小,不需要下载任何插件,而且跨平台性非常好。print css推出已经有些时日,但遗憾的是,至今没有一个厂商的浏览器很好地实现了这些标准,这使得程序员目前还不能利用print css进行实际的开发。关于打印css,参见http://css-discuss.incutio.com/?page=PrintStylesheets

四 、使用pdf文件 
用这种方式,就是从服务器端下载一个pdf文件流,在IE中用adobe插件打开,然后用adobe的打印菜单进行打印,虽然这种方案,也能实现精确套打,但需要下载adobe插件。这是国外报表工具经常推荐的一种打印方法,但在pdf不那么普及的中国,这种方案不是最好选择。

五 、采用纯ActiveX 
这种方案就是下载一个控件,票据的数据不再以html方式呈现,而是呈现在ActiveX中。这种方案的优点是打印的精确度高,分页的可控性好,但缺点也是很明显的,嵌入ActiveX控件破坏了web应用的整体html风格,且这样的控件比较大(一般超过1M),下载颇费时间)。市场上的非java类报表产品,一般都采用这种方案。

六 、采用Applet方式 
采用Applet方式,分页或精确打印,都可以做到完美,但缺点也很明显,表现在:
   1、安装Applet成本巨大。需要下载十几M的文件。
   2、打印报表时,需要重新向服务器检索数据,效率低。因为Applet方案,一般采用html方式呈现数据,打印时Applet必须向服务器检索同一张票据的数据,看上去,是打印了当前页的票据,实际上,Applet根本不会用当前html页的数据来打印,而是向服务器下载数据到Applet中来打印。也就是说,打印的话,必须两次请求,一次html呈现,一次用来打印。
   3、不能解决连续打印。比如,不是仅打印一张票据,而是连续一次打印若干个票据。
   4、不能解决打印机设置问题,如存在多台打印机时,总是需要手工选择,打印到哪一台打印机。
   5、市场上java类的报表工具,一般推荐Applet方式来实现打印。

七 、轻量级的ActiveX打印方式---jatoolsPrinter 
这是杰创软件最新推出的一种最具创意的web套打解决方案。杰表作为一款纯java的报表工具,以前提供的web套打方案也是基于Applet的,Applet也做到了尽可能的小(只有24kb),但用户还是抱怨,因为jre太大,安装需要耐心。另外,用Applet方式,很难实现客户端的批量打印功能。 
采用jatoolsPrinter,其优点是:
   1、安装方便,只有90k。
   2、可以通过web脚本来选择输出打印机,纸张大小,打印方向等,不必每次手工设定。
   3、支持附件打印问题。

4、说了那么多都是些废话,最重要的是怎么用它才是真的。ps:需要注意的是,jatoolsPrinter目前是收费的。但是本人找到个破解版的,附件中大家共享下,希望杰创软件别给封杀了,哈哈。
提供两个博客大家可以借鉴学习,很简单,我这里就不多数了,说一下自己使用时候遇到的小问题吧、

重点说一下:上面博客写的是挺好的,但是有点问题,预览时候调用方法为: jatoolsPrinter.printPreview(myDoc);   // 打印预览  只有一个参数
<a>、首先需要在打印页面(下面用index.jsp代替)的head中添加打印控件。<OBJECT ID="jatoolsPrinter" CLASSID="CLSID:B43D3361-D975-4BE2-87FE-057188254255" codebase="jatoolsP.cab#version=1,2,0,2"></OBJECT>
<b>、它需要一个jatoolsP.cab文件[我提供的这个是破解版的,呵呵],需要放在打印页面同一目录中(当然,你看到有个属性codebase,可以设置其路径位置)。
<c>、在使用ireport的时候,你可能会使用iframe(比如Id和name都是:iframe_ireport)来显示你的报表数据,这时需要设置参数documents:window.frames['iframe_report'].document,具体参数设置如下(还有更多参数设置,我提供一个文档在附近,大家自己学习):
var myDoc = {
    //settings:{
       //pageWidth: 2100,    //自定义纸张宽度(单位为十分之一毫米)
       //pageHeight: 1400,  //自定义纸张高度(单位为十分之一毫米)
       //orientation: 1     //打印方向 [1/2 = 纵向/横向]
   // },
documents:window.frames['iframe_report'].document,
enableScreenOnlyClass:true, // 使所有使用 screen-only 样式类的对象,只在预览、显示时可见,打印时隐藏
marginIgnored: true,
copyrights:'杰创软件拥有版权 www.jatools.com' 
};
如果你使用的是div来显示,那就直接用documents:document
<d>、在上面的参数设置中,你会发现有个copyrights,这个是版权所有说明,让我蛋疼的是必须得设置成他们公司,其他就会报错,恶心人的很。
<e>、还有一个重头戏就是ireport和jatoolsPrinter的分页打印问题,上面博客中以及说的很明白了,我就不多说了,我只把修改后打包的jar文件放出来,大家下载使用吧。
<f>、接下来就是打印的三种方式:
jatoolsPrinter.printPreview(myDoc);   // 打印预览
jatoolsPrinter.print(myDoc,true);   // 打印前弹出打印设置对话框
jatoolsPrinter.print(myDoc,false);       // 不弹出对话框打印
分享到:
评论
2 楼 caoliang0914 2016-06-20  
[size=x-small]jatoolsPrinter还有破解文件不[/size]
1 楼 lupeng335 2012-05-03  
有没有例子的整个源码?共享出来研究一下,最近我也在做报表,很蛋疼,特别是打印这功能。。

相关推荐

    jasperreport+struts2包

    **jasperreport与Struts2整合详解** jasperreport是一个强大的开源报表工具,它允许开发者在Java应用程序中创建复杂的报表。Struts2则是一个流行的MVC(Model-View-Controller)框架,用于构建动态Web应用。这两者...

    一个完整的jasperreport+myeclipse+struts2例子

    在JasperReport与MyEclipse的结合中,Struts2可以作为控制器,负责接收用户请求,处理业务逻辑,并调用JasperReport生成的报表服务,最后将报表结果展示给用户。 【学习路径】 学习这个例子,首先你需要熟悉...

    jasperreport+ireport+jfreechart文档及代码2

    jasperreport+ireport+jfreechart文档及代码2 jasperreport+ireport+jfreechart文档及代码2 jasperreport+ireport+jfreechart文档及代码2

    jasperreport+ireport+jfreechart文档及代码1

    jasperreport+ireport+jfreechart文档及代码1 jasperreport+ireport+jfreechart文档及代码1 jasperreport+ireport+jfreechart文档及代码1

    Struts2.0+JasperReport+IReport+Oracle 报表开发

    Struts2.0+JasperReport+IReport+Oracle 报表开发 整个项目打包上传,用MyEclipse导入即可调试使用 含报表文件、数据库表结构及测试数据,项目中解决了PDF中文不显示问题

    Struts2.0+JasperReport+IReport+Oracle 报表开发 2/3

    Struts2.0+JasperReport+IReport+Oracle 报表开发 整个项目打包上传,用MyEclipse导入即可调试使用 含报表文件、数据库表结构及测试数据,项目中解决了PDF中文不显示问题

    使用JasperReport+iReport进行WEB开发

    在"使用JasperReport+iReport进行WEB开发"的实践中,首先需要安装并配置iReport,下载并解压后,可以通过它来设计报表模板。模板设计完成后,将其保存为.jrxml文件,这是JasperReport的XML格式,包含了报表的所有...

    Struts2.0+JasperReport+IReport+Oracle 报表开发 3/3

    Struts2.0+JasperReport+IReport+Oracle 报表开发整个项目打包上传,用MyEclipse导入即可调试使用含报表文件、数据库表结构及测试数据,项目中解决了PDF中文

    Jasperreport+ireport 实践操作及web应用

    2. 图像处理:JasperReport借助jFreeChart库支持矢量图(如矩形、圆形、线条)和位图。在iReport中,可以通过工具栏的相应按钮在Detail区域绘制图形,并通过右键菜单调整属性。矢量图的绘制直观易用,而位图的插入则...

    struts2+jasperReport+ireport做报表总结

    Struts2、JasperReport 和 iReport 是开发Web报表应用中的常用技术栈。本文主要针对使用Struts2框架结合JasperReport5.0与iReport5.0进行报表开发时可能遇到的问题进行总结。 1. **报表预览问题**: - 数据源为空...

    利用Jasperreport+IReport进行报表开发

    【JasperReport与IReport简介】 JasperReport是一款开源的报表生成工具,它允许开发者创建复杂的报表设计,并能够导出多种格式,如PDF、HTML、Excel等。JasperReport的核心是基于XML的报表模板,这些模板可以包含...

    jasperreport+applet客户端打印demo

    在"jasperreport+applet客户端打印demo"中,我们探讨的是如何利用JasperReport结合Java Applet技术实现客户端的打印功能。 首先,JasperReport提供了丰富的模板设计功能,通过JRXML文件可以定义报告的布局、样式、...

    java报表(jasperreport_ireport+struts2)

    在本主题中,我们将深入探讨如何使用JasperReport、iReport以及Struts2框架来构建一个强大的报表解决方案。 JasperReport是一个开源的Java报表库,它提供了丰富的报告设计功能,支持多种数据源,如数据库、CSV文件...

    JasperReport+iReport报表开发手册.zip

    JasperReports 是一个强大、灵活的报表生成工具,能够展示丰富的页面内容,并将之转换 ...oriented),准备付诸打印的文档。总的而言,JasperReports 主要分成三个部分,包括数据报表 设计、数据填充与数据报表导出。

    ireport+struts2实现web开发

    在Web开发领域,IReport与Struts2的结合使用是一种常见的技术栈,尤其适用于构建数据可视化和报告生成的系统。IReport是一款强大的报表设计工具,它允许开发者通过拖拽方式创建复杂的报表,而Struts2则是一个流行的...

    JasperReport+Servlet Web应用之:打印预览

    2. **Servlet集成JasperReport** - 在Servlet中,我们需要处理HTTP请求,根据请求参数加载并填充报告。 - 通过`JasperCompileManager.compileReport()`方法编译JRXML文件为JasperReport对象。 - 使用`...

    jasperReport +spring 的使用

    ### jasperReport与Spring框架集成应用详解 #### 一、jasperReport简介及Spring环境配置 **jasperReport**是一款非常强大的报表工具,它能够基于Java环境生成多种格式的报表,如PDF、HTML、XLS(Excel)、CSV以及...

    JasperReport + IReport 开发文档

    7. **jasperreport+ireport开发java报表入门级教程.pdf**:专门针对Java开发者的入门教程,详细解释如何使用JasperReport和IReport构建报表。 8. **jasperReport.pdf**:可能是一个JasperReport的官方文档或者第三方...

    iReport+JasperReport柱状图

    iReport+JasperReport柱状图开发指南 本文详细介绍了使用iReport和JasperReport开发柱状图的过程,包括确定数据源类型、开发数据源类、设计图表属性等步骤。作者分享了自己的实践经验,遇到的困难和解决方法,旨在...

Global site tag (gtag.js) - Google Analytics