var _gaq = _gaq || []; _gaq.push(['_setAccount', 'UA-20738293-1']); _gaq.push(['_trackPageview']); (function() { var ga = document.createElement('script')"/>
jutleo
欢迎走进有风的地方~~
posts - 63,  comments - 279,  trackbacks - 0
          jasperReport客户端采用applet,applet和activeX插件的区别大家搜一下,有一堆东西可以借鉴,下载jasperreports-3.0.0,在相应的sample OR demo(记得不清了)中可以找到jasperReport 实现的客户端打印demo,下来就来分析下具体实现。
  新建一print.js文件:
function loadApplet(applet_URL) {
    
var URL = applet_URL + "/applets/jre-1_5_0_18-windows-i586-p.exe";
    document.write('
<OBJECT id="myApplet" name="myApplet"');
    document.write('classid
="clsid:8AD9C840-044E-11D1-B3E9-00805F499D93" WIDTH="0" HEIGHT="0" MAYSCRIPT name="myApplet"');
    document.write('codebase
='+ URL +'>');
    document.write('
<PARAM NAME="CODE" VALUE="org.bulktree.report.print.applet.PrinterApplet" />');
    document.write('
<PARAM NAME="CODEBASE" VALUE="../applets" />');
    document.write('
<PARAM NAME="ARCHIVE" VALUE="jasperreports-3.0.1-applet.jar" />');
    document.write('
<PARAM NAME="type" VALUE="application/x-java-applet;version=1.5.0" />');
    document.write('
<PARAM NAME="scriptable" VALUE="false" />');
    document.write('
<PARAM NAME="REPORT_URL" VALUE="../report.view">');
    document.write('no support java');
    document.write('
<comment>');
    document.write('
<embed type="application/x-java-applet;version=1.5.0"');
    document.write('CODE
="org.bulktree.report.print.applet.PrinterApplet"');
    document.write('JAVA_CODEBASE
="applets" ARCHIVE="jasperreports-3.0.1-applet.jar"');
    document.write('scriptable
=false');
    document.write('pluginspage
='+ URL +'>');
    document.write('
<noembed></noembed>');
    document.write('
</embed>');
    document.write('
</comment>');
    document.write('
</OBJECT>');
}
     URL为一个固定的路径,是为了下载/applets/jre-1_5_0_18-windows-i586-p.exe(JRE运行环境)而存在的,也可以使用外网从sun公司网站下载,
     REPORT_URL 为applet所要访问的地址,在工程的web.xml配置/report.view如下servlet即可,此servet可接收applet参数,生成jasperPrint对象,并传递到客户端applet中进行打印或者预览。
  servlet配置如下:
<servlet>
                
<servlet-name>ReportServlet</servlet-name>
        
<servlet-class>org.bulktree.report.print.applet.ReportServlet</servlet-class>
    
</servlet>
<servlet-mapping>
        
<servlet-name>ReportServlet</servlet-name>
        
<url-pattern>/report.view</url-pattern>
    
</servlet-mapping>

ReportServlet核心代码就是根据业务找到对应的模板文件填充数据生成jasperPrint对象,产生的jasperPrint对象以对象流的形式发送给客户端,核心代码如下:
// 生成jasperPrint对象
            JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport,
                    mapParam, 
new JREmptyDataSource());

//组装流
response.setContentType("application/octet-stream");
                response.setBufferSize(
8986000);
                ServletOutputStream outStream 
= response.getOutputStream();
                ObjectOutputStream oos 
= new ObjectOutputStream(outStream);
                oos.writeObject(jasperPrint);
当然,客户端的applet使用如下:
/*
                     * applet与Servlet交互 URL传递页面传来的参数请求服务器Servlet
                     * 把applet传递的参数追加到servlet中 2008-10-14 laoshulin
                     
*/


                    url 
= new URL(getCodeBase(), requestUrl + "?printView=true"
                            
+ paraStr);

                    
if (url == null{
                        JOptionPane.showMessageDialog(
this,
                                
"Source URL not specified");
                    }
 else {
                        InputStream in 
= url.openStream();
                        ObjectInputStream objIn 
= new ObjectInputStream(in);
                        Object obj 
= objIn.readObject();
                        
if (obj instanceof JasperPrint) {

                        }
 else {
                            JOptionPane.showMessageDialog(
this, obj.toString());
                            
return;
                        }


                        
if (jasperPrint == null{
                            
// 根据Servlet返回的URL(ObjectStream)产生JasperPrint对象
                            jasperPrint = (JasperPrint) obj;

                        }

                        
// 拦截出现空报表问题
                        if (jasperPrint != null
                                
&& jasperPrint.getPages().size() > 0{
                            
/*
                             * 调用JasperReport.jar中JasperViewer绘制报表Frame
                             * JasperViewer继承自JFrame,采用setDefaultCloseOperation响应关闭窗口事件
                             
*/


                            ViewerFrame viewerFrame 
= new ViewerFrame(this
                                    .getAppletContext(), jasperPrint,isShowPrintButton);
                            
                            viewerFrame.setVisible(
true);
                            
//viewerFrame.show();

                            
// JasperViewer viewer = new
                            
// JasperViewer(jasperPrint);
                            
// viewer.setVisible(true);
                            
// viewer.setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
                            
// 如果请求为空弹出对话框予以提示
                        }
 else {
                            JOptionPane
                                    .showMessageDialog(
this,
                                            
"Please check Your Report SQL! It resulted in empty Report! ");
                            
return;
                        }

                    }

其中requestUrl为applet配置中的REPORT_URL,现实中可以采用此种方式传递参数到applet中,下篇文章会介绍更合适的业务数据传递,?printView=true表示,传递printView参数对应的值为true,用来预览使用。剩下的工作就是怎么按照自己的要求打印和预览了。
 jasperReport为我们提供了打印和预览现成的方法:
// 打印报表
                                    JasperPrintManager
                                            .printReport(print, 
false);

/*  预览报表
                             * 调用JasperReport.jar中JasperViewer绘制报表Frame
                             * JasperViewer继承自JFrame,采用setDefaultCloseOperation响应关闭窗口事件
                             
*/

                            ViewerFrame viewerFrame 
= new ViewerFrame(this
                                    .getAppletContext(), jasperPrint);
                            viewerFrame.setVisible(
true);

最后记着释放对象哦,浏览器会受不了得:
url = null;
            jasperPrint 
= null;
OK,客户端就出现了,参照demo没有什么难度,下一篇我会介绍一下具体的细节,及套打的实现。

posted on 2009-10-27 20:58 凌晨风 阅读(6648) 评论(12)  编辑  收藏 所属分类: iReport + JasperReport 系列

FeedBack:
# re: iReport+jasperReport之客户端打印[未登录]
2009-10-29 08:58 | john
applet打印,会要求客户端安装jvm的吧,帆软报表是采用flash打印,客户端浏览器上安装flash插件就行了,这比安装jvm要简便的多。我不是跟帆软做广告,而是感觉他们采用这样做比较值得借鉴。  回复  更多评论
  
# re: iReport+jasperReport之客户端打印[未登录]
2009-10-29 12:09 | no
ls说的是FineReport吧
flash也是要安装插件的,有些服务器系统就没有装这个,比如Win2003。
也就是说还是需要装插件的....  回复  更多评论
  
# re: iReport+jasperReport之客户端打印
2009-10-29 13:05 | 凌晨风
只需要客户端按照jre就可以了,jre文件很小,而且可以存放在服务器上  回复  更多评论
  
# re: iReport+jasperReport之客户端打印
2009-11-02 14:29 | tt
能把写好的程序打包发上来不  回复  更多评论
  
# re: iReport+jasperReport之客户端打印
2009-11-02 15:11 | 凌晨风
工程是本来是一个打包给其它项目使用的jar包,不过还有套打等一些其它的东西,慢慢会贴上来的  回复  更多评论
  
# re: iReport+jasperReport之客户端打印
2009-11-02 16:08 | tt
可以写一个简单的例子, iReport+jasperReport,把打印功能用进去就可以了啊,只有工程部署起来,才好理解,不然会报很多错的~~~还想问您一下,用 iReport+jasperReport execl导出时,如何合并列呢  回复  更多评论
  
# re: iReport+jasperReport之客户端打印
2009-11-04 14:03 | tt
请问能加你QQ,问你一些问题不  回复  更多评论
  
# re: iReport+jasperReport之客户端打印
2009-11-04 14:31 | 凌晨风
这篇是对jasperReport自带例子的说明,可以看看源码啊,MSN:laoshulin@gmail.com   回复  更多评论
  
# re: iReport+jasperReport之客户端打印
2009-11-23 14:19 | 爱银
期待你的下一篇文章,jrxml背景怎么设置,打印的时候 怎么控制背景的显示不显示。。。。期待。。  回复  更多评论
  
# re: iReport+jasperReport之客户端打印
2009-11-26 14:51 | as
想问一下,用iReport工具制作模板来做套打,背景设置的图片,想让图片在预览时显示,打印时背景不打印,怎么做?  回复  更多评论
  
# re: iReport+jasperReport之客户端打印
2009-11-26 20:23 | 凌晨风
不好意思,最近太忙了,马上会抽时间写出来  回复  更多评论
  
# re: iReport+jasperReport之客户端打印
2013-03-22 09:47 | 小岳
能不能发一下源码,最好是能部署的可以运行的,代码太多,想看的完整一些,谢谢!  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航:
 

<2009年10月>
27282930123
45678910
11121314151617
18192021222324
25262728293031
1234567

常用链接

留言簿(11)

我参与的团队

随笔分类

随笔档案

文章分类

文章档案

新闻分类

新闻档案

收藏夹

围脖

最新随笔

搜索

  •  

最新评论

阅读排行榜

评论排行榜