`
IT民工%
  • 浏览: 45734 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

java applet+jasperReport 实现web端打印

    博客分类:
  • java
阅读更多

1.首先介绍下背景:

   web端套打(精确打印)、针式打印机(批量走纸)

   相关的技术:struts2+jQuery easyUI+applet+jasperReport3.7.5,对相关技术不熟的自己去了解。

   注:本实践已经在项目中成功运用,且项目已经上线。解决了所有遇到的问题。

         由于时间仓促,又时隔一年,暂时只写个大概,请仔细研究代码,以后有时间再补充详细。

2.下面是applet程序源码,里面有打印预览和打印的方法。注意这个class最终是要与jasperReport提供的源码一起打到jar包里面的,jasperReport提供了applet打印的支撑,需要去下载它的源码,我用的jasperreports-applet-3.7.5。

 

   在webRoot下建立applet目录,将自己打的jar包和与之相关的jar放到里面。我里面放了这些:commons-collections-3.1.jar、commons-logging-1.0.4.jar、print.cer(给reportprint.jar签名时生成的)、reportprint.jar(里面包括自己的applet程序(JRPrinterApplet.class),还有jasperReport提供的支撑类)。注意这是必须的。

 

package org.cssm.tos.action;

import java.io.PrintWriter;
import java.io.StringWriter;
import java.net.URL;

import javax.print.attribute.HashPrintRequestAttributeSet;
import javax.print.attribute.PrintRequestAttributeSet;
import javax.print.attribute.Size2DSyntax;
import javax.print.attribute.standard.MediaSize;
import javax.print.attribute.standard.MediaSizeName;
import javax.swing.JOptionPane;

import net.sf.jasperreports.engine.JRExporterParameter;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.JasperPrintManager;
import net.sf.jasperreports.engine.export.JRPrintServiceExporter;
import net.sf.jasperreports.engine.export.JRPrintServiceExporterParameter;
import net.sf.jasperreports.engine.util.JRLoader;
import net.sf.jasperreports.view.JRViewer;

/**
 * Applet
 * @author zyz
 *
 */
@SuppressWarnings("serial")
public class JRPrinterApplet extends javax.swing.JApplet {
	   
    private URL url = null;    
    private JasperPrint jasperPrint = null;
    private String flag; //判断打印还是打印预览,0表示打印,1表示打印预览
    
    /** Creates new form AppletViewer */   
    public JRPrinterApplet(){    
            
    }    
   
   
    /**
     * 初始化方法   
     */
    public void init(){
        String strUrl = getParameter("REPORT_URL");
        flag = getParameter("REPORT_FLAG");
        if (strUrl != null){    
            try{    
                 url = new URL(getCodeBase(), strUrl);    
	             System.out.println("url="+url);
            }catch (Exception e){    
                StringWriter swriter = new StringWriter();    
                PrintWriter pwriter = new PrintWriter(swriter);    
                e.printStackTrace(pwriter);    
                JOptionPane.showMessageDialog(this, swriter.toString());    
            }    
        }else{    
        	JOptionPane.showMessageDialog(this, "init():Source URL not specified");    
        }    
    }    
   
    public void start() { 
        if (url != null){    
            if (jasperPrint == null){    
                try{    
                	System.out.println("开始获取报表数据");
                    jasperPrint = (JasperPrint)JRLoader.loadObject(url);  
                    System.out.println("完成获取报表数据");
                }catch (Exception e){    
                    StringWriter swriter = new StringWriter();    
                    PrintWriter pwriter = new PrintWriter(swriter);    
                    e.printStackTrace(pwriter);    
                    JOptionPane.showMessageDialog(this, swriter.toString());    
                }    
            }    
                
            if (jasperPrint != null){                   
                final JasperPrint print = jasperPrint;    
                if(flag.equals("0")){
                	Thread thread = new Thread    
                    (    
                        new Runnable(){    
                            public void run(){    
                                try{
                                	/** 设置纸张 */
                        			PrintRequestAttributeSet printRequestAttributeSet = new
                        			HashPrintRequestAttributeSet();
                        			System.out.println("开始设置打印纸张大小");
                        			MediaSize ms = new MediaSize(241,279.4f,Size2DSyntax.MM,MediaSizeName.ISO_A4);
                        			printRequestAttributeSet.add(ms.getMediaSizeName());
                        			System.out.println("完成设置打印纸张大小");
                        			JRPrintServiceExporter pse = new JRPrintServiceExporter();
                        			System.out.println("开始装载报表数据");
                        			pse.setParameter(JRExporterParameter.JASPER_PRINT, print);
                        			System.out.println("完成装载报表数据");
                        			System.out.println("开始加入纸张设置");
                        			pse.setParameter(
                        							JRPrintServiceExporterParameter.PRINT_REQUEST_ATTRIBUTE_SET,
                        							printRequestAttributeSet);
                        			System.out.println("完成加入纸张设置");
                        			pse.setParameter(JRPrintServiceExporterParameter.DISPLAY_PRINT_DIALOG, Boolean.TRUE); 
                        			pse.exportReport();
                                 //JasperPrintManager.printReport(print, true); 
                                }catch (Exception e){    
                                    StringWriter swriter = new StringWriter();    
                                    PrintWriter pwriter = new PrintWriter(swriter);    
                                    e.printStackTrace(pwriter); 
                                    System.out.println(e.toString());
                                    JOptionPane.showMessageDialog(null, swriter.toString());    
                                }    
                            }    
                        }    
                    );    
                    
                	thread.start();
                }else{
                	try {
    					JRViewer view =new JRViewer(print);
    					this.getContentPane().add(view);

    					view.setVisible(true);
    					view.requestFocus();
    					this.setVisible(true);
    					view.setFocusable(false);
    				} catch (Exception e) {
    					// TODO Auto-generated catch block
    					e.printStackTrace();
    				}
                }
            }else{    
                JOptionPane.showMessageDialog(this, "Empty report.");    
            }    
        }else{    
            JOptionPane.showMessageDialog(this, "start():Source URL not specified");    
        }    
   
    }    
        
}

3.action 代码

 

/**
	 * 工单打印
	 * @return
	 */
	public String printfkWorkOrder(){
		FkPrintTemple ft=new FkPrintTemple();
		File reportFile=new File(ServletActionContext.getServletContext().getRealPath(
				"/cssm/tos/print/fkWorkOrderPrint.jasper"));
		workOrder.setActType(printActype);
		workOrder.setWorkorderState(this.getOrderSts());
		workOrder.setStartDate(beginDate);
		workOrder.setEndDate(endDate);
		workOrder.setCo(fkCo);
		workOrder.setSo(fkSo);
		List<WorkOrderVo> wlist=null;
		TUser user = (TUser) this.getSession().getAttribute("userSession"); // 获取用户信息
		String empName = userService.getUserById(user.getUserId()).getEmpName();
		if(fkIsFalge!=null){//1 批量打印  0 打印
			if(fkIsFalge.equals("1")){   //判断是不是批量打印 1是批量打印,批量打印暂时不实现
				//ft.getNoPrintOrder();
				List fkList=ft.getFkPrintInfo();
				/*if(fkList!=null && fkList.size()>0){
					wlist=this.getFkPrintTempleService().getPrintTemple(ifMerge,workOrder);
				}else{*/
					wlist=this.printWorkOrderService.getWorkOrderforPrintInfo(workOrder, coStrs, soStrs, ifMerge,fkIsFalge);
				//}
			}else{
				wlist=this.printWorkOrderService.getWorkOrderforPrintInfo(workOrder, coStrs, soStrs, ifMerge,fkIsFalge);
				this.printWorkOrderService.saveWorkOrderlog(soStrs,coStrs, empName, ifMerge);//添加打印时间日志
			}
		}else{
			wlist=this.getPrintWorkOrderService().getWorkOrderforPrintInfo(workOrder, coStrs, soStrs, ifMerge,fkIsFalge);
		}
		try {
			 JasperReport jreport=(JasperReport) JRLoader.loadObject(reportFile);
			 JasperPrint jprint=
				 JasperFillManager.fillReport(jreport,null,new JRBeanCollectionDataSource(wlist));
   			
			ServletOutputStream ouputStream = this.getResponse().getOutputStream();
			ObjectOutputStream oos = new ObjectOutputStream(ouputStream);   
			oos.writeObject(jprint);
			oos.flush();      
			oos.close();
		} catch (Exception e) {
			logger.error("Exception :printfkWorkOrder()>>>>>>>>>>>>>>>>工单打印异常 ");
			logger.error(e.getMessage(), e);
			e.printStackTrace();
		}
		 return null;
	}

 

4.jsp页面代码

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<%--
/**
 * @Copyright Copyright (c) 2011年7月16日 16:18:10
 * @Company PRT
 * @author zyz
 */
--%>
<html>
  <head>
    <title>服开工单打印预览</title>
 <meta http-equiv="pragma" content="no-cache">
 <meta http-equiv="cache-control" content="no-cache">
 <meta http-equiv="expires" content="0">    
</head> 
<script type="text/javascript">
	
		function fkPrintPreview(){
			var ifMerge = window.opener.document.getElementById("ifMerge").value;
			var coStr = window.opener.document.getElementById("coStrs").value;	//co编号
			var soStr = window.opener.document.getElementById("soStrs").value;	//so编号
			var flag = '1';	//用来标识是打印还是打印预览:0表示打印,1表示打印预览
			var width = screen.width-100;
			var height = screen.height-180;
			document.write("<div  style='background-color:#EEEEEE'><div><center><object classid = 'clsid:8AD9C840-044E-11D1-B3E9-00805F499D93'"+
				    "codebase = 'jre-1_5_0_08-windows-i586-p-s.exe'"+
				    "WIDTH = '"+width+"' HEIGHT = '"+height+"' >"+
				    "<PARAM NAME = CODE VALUE = 'org.cssm.tos.action.JRPrinterApplet.class'>"+
				    "<PARAM NAME = CODEBASE VALUE = '../../../applet/' >"+
				    "<PARAM NAME = ARCHIVE  VALUE = 'reportprint.jar,commons-collections-3.1.jar,commons-logging-1.0.4.jar'>"+
				    "<param name = 'type' value = 'application/x-java-applet;version=1.6'>"+
				    "<PARAM NAME = 'scriptable' VALUE='false'>"+
				    "<PARAM NAME = 'REPORT_FLAG' VALUE="+flag+">"+
				    "<PARAM NAME = 'REPORT_URL' VALUE='/cssm/print/printfk_work_order.action?"+
				    "ifMerge="+ifMerge+"&coStrs="+coStr+"&soStrs="+soStr+"'>"+
				 "</object></center><div></div>"
			 );
		}
</script> 
<body onload="fkPrintPreview();"> 
</body> 
</html> 

 5.实现上面的这些只是实现了applet+jasperReport打印的功能。实际运用中还会遇到其他问题。我将我暂时能想起来的遇到的问题列到下面:

   A.  applet,控制台报:java.lang.ClassNotFoundException: org.apache.commons.logging.LogFactory。struts.xml里面缺少这句:<constant name="struts.objectFactory" value="spring"/>

   B.  客户端要安装jre这是必须的。如果数据量大会导致jre崩溃,需要配置jre内存大小。到底设置多大需要根据客户端机器配置决定。建议-Xms64m -Xmx128m

分享到:
评论
2 楼 July01 2017-11-03  
推荐用StratoIO打印控件,支持网页、URL、图片、PD、ZPL和EPL,浏览器和系统的兼容性都很好,
而且不会崩溃。页头页脚、页码都能定制。参考http://www.webprinter.cn/features
1 楼 liuzhiyu123 2015-09-19  
撸主我也是这么做的 但是在html中显示不了applet 也不提示错误,但是用Main控制台可以显示出applet,这个情况一般是怎么回事呢

相关推荐

Global site tag (gtag.js) - Google Analytics