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
分享到:
相关推荐
### Java Applet + JasperReport 实现Web端打印 #### 背景介绍 在Web开发领域,特别是企业级应用中,精确打印与批量打印是非常重要的功能之一。这不仅关乎用户体验,还涉及到业务流程的顺利执行。传统的Web打印...
4. **Applet代码实现**: Applet中需要实现打印逻辑,例如通过`java.awt.print.PrintService`查找本地打印机,然后使用`java.awt.print.PrinterJob`进行打印。`setPageable()`方法设置要打印的内容,`printAll()`或`...
当涉及到客户端打印时,尤其是通过 Applet 形式实现打印功能时,为了确保应用的安全性,数字签名变得尤为重要。 #### 二、Java沙箱与安全机制 Java沙箱(Java sandbox)是一种安全模型,它限制了Java Applet 或...
在Java Web Start或嵌入到HTML中的Applet中,我们可以加载JasperReport生成的报表,并通过Applet调用系统的打印服务,从而实现在客户端进行无服务器打印。然而,需要注意的是,由于安全限制和浏览器兼容性问题,Java...
JasperReports 提供了一种解决方案,通过使用Java Applet实现客户端打印。Applet是一种小型的Java程序,可以在用户的Web浏览器中运行,提供了与本地系统交互的能力,包括访问打印机。 文件名列表中的组件是实现这个...
因此,虽然Applet在过去的JasperReport客户端打印方案中很常见,但现在可能需要考虑其他替代方案,如使用Java Web Start或Web服务来实现客户端打印。 总之,JasperReport结合Applet提供了在客户端进行打印的功能,...
虽然Applet技术已经逐渐被废弃,但在某些特定场景下仍然可以使用Applet来实现在Web页面中的打印预览功能。 ##### 4.6 使用JNLP技术实现客户端预览 JNLP(Java Network Launching Protocol)技术允许在Web浏览器中...
标题中的“jasperreport报表模板预览 applet与servlet通信”揭示了本文将要讨论的重点,即如何在Java环境中使用JasperReport库创建报表模板,并通过Applet和Servlet进行数据交互来实现预览功能。JasperReport是一个...
本文档旨在介绍如何利用Jaspersoft、iReport、Designer 4.5.0等工具实现Web端直接打印的需求,特别适用于.NET项目中希望优化打印流程的情况。具体需求包括: - 实现点击“打印”按钮后,打印机能够直接进行打印操作...
JasperReport还允许在报表设计中直接调用Java代码,从而实现更加复杂的逻辑处理。例如,可以在表达式中调用自定义的Java类或方法来执行特定的操作。 #### 5. 技巧篇 **5.1. 在WEB中显示数据不分页显示** 在某些...
因为是慢慢的收藏..只是顺序有点乱....26.applet 和 java 安全 27.javascript代码 28.字符编码及java中文字符 29.java声音jmf 30.部署,打包和发布 31.测试 32.批处理 33.birt报表 34.Hibernate 35.Htc
在5.1.0版本中,引入了applet技术,使得用户能够通过浏览器实现报表的打印,极大地扩展了其在Web环境中的应用可能性。本文将深入探讨JasperReports Applet 5.1.0的核心特性和使用方法。 一、JasperReports基础 ...
因为是慢慢的收藏..东西有点乱.但希望对大家有帮助 ...26.applet 和 java 安全 27.javascript代码 28.字符编码及java中文字符 29.java声音jmf 30.部署,打包和发布 31.测试 32.批处理 33.birt报表 34.Hibernate 35.Htc
6. **Web应用集成**:通过jasperreports-3.0.1-applet.jar,JasperReport可以无缝集成到Web应用中,提供基于Applet的在线报表查看和交互功能。 7. **自定义扩展**:JasperReport允许开发者编写自定义函数、图表类型...
通常的做法是在服务器端使用JasperReport处理报表模板,并将结果返回给客户端进行显示。 #### 4. 提高篇 ##### 4.1. 报表的结构 报表的基本结构通常包括以下几个部分: - **主标题**:位于报表顶部,用于显示...
4. **jasperreports-applet-4.1.1.jar**:这个库是JasperReport的Applet版本,使得报告可以在Web浏览器中以Java小应用程序的形式运行。用户可以在网页上直接查看和打印报表,增强了报表的交互性和可访问性。 5. **...
这个版本还提供了`jasperreports-3.1.2-applet.jar`,这是用于在Web浏览器中运行的Java小应用程序,使得用户可以在网页上直接查看和打印报表。此外,`jasperreports-3.1.2-javaflow.jar`则包含了对Java Flow的支持,...
### Jasperreport与iReport整合开发Web报表学习笔记 #### 一、环境配置 为了能够顺利地使用Jasperreport和iReport进行报表设计与开发,首先需要确保开发环境配置正确。 1. **Java JDK环境**: 确保已安装最新版的...