ireprot客户端打印方案

考虑一下几点:
1. javascript 和applet互相通信。applet和前台界面交互,可以让客户感觉不到有applet的存在。
2. applet和后台相互通信。applet既可以接受后台转递的参数、对象流等等 还可以把信息返回到后台。
3. applet只实现打印和预览,主要的业务操作需要在后台完成。
上篇中提到print.js:
新建一jsp页面 PrintReportApplet.jsp
次jsp页面就一个按钮

None.gif<input type="submit" value="预览" οnclick="reportViewer()" />

这样我们就可以在当前页面中引用到applet了,
document.applets.myApplet.reportViewer() 拿到applet的窗口句柄后调用applet的reportViewer()方法
我们也可以在此jsp页面写一个初始化的方法传递参数到applet中,当然也可以直接传递参数到reportViewer(parameter String);

function getParameters() dot.gif
return "&pid=0001"
}

在print.js中指定 <PARAM NAME="CODE" VALUE="com.isoftstone.pcis.report.print.applet.PrinterApplet" />
PrinterApplet中reportViewer

None.gif// javascript预览报表
 public void reportViewer() dot.gif{
 try dot.gif{
            win = JSObject.getWindow(this);
            paraStr = win.eval("getParameters()").toString();

 if ("".equals(paraStr) || paraStr == null) dot.gif{
 return;
            }
            System.out.println("paraStr=======>" + paraStr);

        } catch (Exception e1) dot.gif{
            e1.printStackTrace();
        }
 if (url == null) dot.gif{
 if (requestUrl != null) dot.gif{
 try dot.gif{
 /**//*
                     * applet与Servlet交互 URL传递页面传来的参数请求服务器Servlet
                     * 把applet传递的参数追加到servlet中 2008-10-14 laoshulin
 */

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

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

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

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

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

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

                            viewerFrame.setVisible(true);
 //viewerFrame.show();

 // JasperViewer viewer = new
 // JasperViewer(jasperPrint);
 // viewer.setVisible(true);
 // viewer.setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
 // 如果请求为空弹出对话框予以提示
                        } else dot.gif{
                            JOptionPane
                                    .showMessageDialog(this,
 "Please check Your Report SQL! It resulted in empty Report! ");
 return;
                        }
                    }
                } catch (Exception e) dot.gif{
                    StringWriter swriter = new StringWriter();
                    PrintWriter pwriter = new PrintWriter(swriter);
                    e.printStackTrace(pwriter);
                    JOptionPane.showMessageDialog(this, swriter.toString());
                } finally dot.gif{// 全打套打URL不一样释放对象 by laoshulin
                    url = null;
                    jasperPrint = null;
                    win = null;
                }
            }
        }
    }

JSObject 对象的使用google一下有很多哦,requestUrl = getParameter("REPORT_URL");为print.js中配置的请求,之后我们new URL带上我们的参数去请求远程资源。

None.gif<servlet-mapping>
None.gif <servlet-name>ReportServlet</servlet-name>
None.gif <url-pattern>/report.view</url-pattern>
None.gif </servlet-mapping>

None.gifpublic void doGet(HttpServletRequest request, HttpServletResponse response)
 throws ServletException, IOException dot.gif{
 try {

 /**//*
             * Servlet中可这样取得打印或是预览操作,添加此功能针对套打预览 String
             * view=request.getParameter("printView"); boolean
             * isView="true".equalsIgnoreCase(view)?true:false; String
             * print=request.getParameter("print"); boolean
             * isPrint="true".equalsIgnoreCase(print)?true:false;
 */

 // 拿参数
            String pid = request.getParameter("pid");
            String form = request.getParameter("format");
 // 编译报表耗时,修改为编译好的报表
 /**//*
             * JasperReport jasperReport = JasperCompileManager
             * .compileReport("D:\\workspace\\report\\AppletTest.jasper");
 */
 // 直接使用编译好的文件
//            JasperReport jasperReport = (JasperReport) JRLoader
//                    .loadObject("D:\\workspace\\report\\AppletTest.jasper");
            JasperReport jasperReport = (JasperReport) JRLoader
                    .loadObjectFromLocation("D:\\workspace\\report\\AppletTest.jasper");
            HashMap mapParam = new HashMap();
            mapParam.put("imageParam", "D:\\workspace\\report\\eg_smile.gif");
 /**//*
             * 此参数用来控制是否显示图片
             * 第二个参数在报表中设置为String类型
 */
            mapParam.put("isShowImage", "true");
 // 生成jasperPrint对象
            JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport,
                    mapParam, new JREmptyDataSource());
            System.out.println(jasperPrint.getPageHeight()+"$$$$$$$$$$$$"+jasperPrint.getPageWidth()+"**********"+jasperPrint.getPages());

        response.setContentType("application/octet-stream");
                response.setBufferSize(8986000);
                ServletOutputStream outStream = response.getOutputStream();
                ObjectOutputStream oos = new ObjectOutputStream(outStream);
                oos.writeObject(jasperPrint);
//                outStream.flush();
//                oos.flush();

//                outStream.close();
//                oos.close();

 //outStream.flush();
 //
        } catch (Exception e) dot.gif{
            e.printStackTrace();
        }
    }

请求到远程资源完全可以安装业务需求实现自己的jasperReport 了,最终我们只要把一个JasperPrint对象输出到客户端就可以了。
客户端通过打开InputStream in = url.openStream();实现还原jasperPrint对象,从而实现打印或者预览。
客户端打印可以前的方法是一样的:
编译、填充、生成JasperPrint对象、预览或打印

转载于:https://www.cnblogs.com/rushoooooo/archive/2011/04/29/2032336.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值