`
IT民工%
  • 浏览: 46321 次
  • 性别: 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,这个情况一般是怎么回事呢

相关推荐

    Java燗applet+jasperReport 实现web端打印

    ### Java Applet + JasperReport 实现Web端打印 #### 背景介绍 在Web开发领域,特别是企业级应用中,精确打印与批量打印是非常重要的功能之一。这不仅关乎用户体验,还涉及到业务流程的顺利执行。传统的Web打印...

    jasperreport+applet客户端打印demo

    4. **Applet代码实现**: Applet中需要实现打印逻辑,例如通过`java.awt.print.PrintService`查找本地打印机,然后使用`java.awt.print.PrinterJob`进行打印。`setPageable()`方法设置要打印的内容,`printAll()`或`...

    iReport+jasperReport之客户端打印 ----数字签名

    当涉及到客户端打印时,尤其是通过 Applet 形式实现打印功能时,为了确保应用的安全性,数字签名变得尤为重要。 #### 二、Java沙箱与安全机制 Java沙箱(Java sandbox)是一种安全模型,它限制了Java Applet 或...

    jasperreports-5.6.0+applet实现客户端打印所需的jar包

    在Java Web Start或嵌入到HTML中的Applet中,我们可以加载JasperReport生成的报表,并通过Applet调用系统的打印服务,从而实现在客户端进行无服务器打印。然而,需要注意的是,由于安全限制和浏览器兼容性问题,Java...

    JasperReports -- 客户端打印(WEB网页打印)

    JasperReports 提供了一种解决方案,通过使用Java Applet实现客户端打印。Applet是一种小型的Java程序,可以在用户的Web浏览器中运行,提供了与本地系统交互的能力,包括访问打印机。 文件名列表中的组件是实现这个...

    jasperReport客户端打印。

    因此,虽然Applet在过去的JasperReport客户端打印方案中很常见,但现在可能需要考虑其他替代方案,如使用Java Web Start或Web服务来实现客户端打印。 总之,JasperReport结合Applet提供了在客户端进行打印的功能,...

    JasperReport+iReport整合的Web报表开发

    虽然Applet技术已经逐渐被废弃,但在某些特定场景下仍然可以使用Applet来实现在Web页面中的打印预览功能。 ##### 4.6 使用JNLP技术实现客户端预览 JNLP(Java Network Launching Protocol)技术允许在Web浏览器中...

    jasperreport报表模板预览 applet与servlet通信

    标题中的“jasperreport报表模板预览 applet与servlet通信”揭示了本文将要讨论的重点,即如何在Java环境中使用JasperReport库创建报表模板,并通过Applet和Servlet进行数据交互来实现预览功能。JasperReport是一个...

    web打印.doc

    本文档旨在介绍如何利用Jaspersoft、iReport、Designer 4.5.0等工具实现Web端直接打印的需求,特别适用于.NET项目中希望优化打印流程的情况。具体需求包括: - 实现点击“打印”按钮后,打印机能够直接进行打印操作...

    JasperReport+iReport 报表工具详细开发手册

    JasperReport还允许在报表设计中直接调用Java代码,从而实现更加复杂的逻辑处理。例如,可以在表达式中调用自定义的Java类或方法来执行特定的操作。 #### 5. 技巧篇 **5.1. 在WEB中显示数据不分页显示** 在某些...

    java编程.数据库.j2ee架构与模式等电子书整合(1)

    因为是慢慢的收藏..只是顺序有点乱....26.applet 和 java 安全 27.javascript代码 28.字符编码及java中文字符 29.java声音jmf 30.部署,打包和发布 31.测试 32.批处理 33.birt报表 34.Hibernate 35.Htc

    jasperreports-applet-5.1.0.jar

    在5.1.0版本中,引入了applet技术,使得用户能够通过浏览器实现报表的打印,极大地扩展了其在Web环境中的应用可能性。本文将深入探讨JasperReports Applet 5.1.0的核心特性和使用方法。 一、JasperReports基础 ...

    java编程.数据库.j2ee架构与模式等电子书整合(2)

    因为是慢慢的收藏..东西有点乱.但希望对大家有帮助 ...26.applet 和 java 安全 27.javascript代码 28.字符编码及java中文字符 29.java声音jmf 30.部署,打包和发布 31.测试 32.批处理 33.birt报表 34.Hibernate 35.Htc

    JasperReport 3.0

    6. **Web应用集成**:通过jasperreports-3.0.1-applet.jar,JasperReport可以无缝集成到Web应用中,提供基于Applet的在线报表查看和交互功能。 7. **自定义扩展**:JasperReport允许开发者编写自定义函数、图表类型...

    JasperReport+iReport报表工具详细开发手册

    通常的做法是在服务器端使用JasperReport处理报表模板,并将结果返回给客户端进行显示。 #### 4. 提高篇 ##### 4.1. 报表的结构 报表的基本结构通常包括以下几个部分: - **主标题**:位于报表顶部,用于显示...

    使用JasperReport制作PDF所需要的包(1)

    4. **jasperreports-applet-4.1.1.jar**:这个库是JasperReport的Applet版本,使得报告可以在Web浏览器中以Java小应用程序的形式运行。用户可以在网页上直接查看和打印报表,增强了报表的交互性和可访问性。 5. **...

    jasperReport 3.12jar包

    这个版本还提供了`jasperreports-3.1.2-applet.jar`,这是用于在Web浏览器中运行的Java小应用程序,使得用户可以在网页上直接查看和打印报表。此外,`jasperreports-3.1.2-javaflow.jar`则包含了对Java Flow的支持,...

    Jasperreport+ireport学习笔记1

    ### Jasperreport与iReport整合开发Web报表学习笔记 #### 一、环境配置 为了能够顺利地使用Jasperreport和iReport进行报表设计与开发,首先需要确保开发环境配置正确。 1. **Java JDK环境**: 确保已安装最新版的...

Global site tag (gtag.js) - Google Analytics