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端打印
(java applet+SQL) 实现阳光酒店管理系统(java applet+SQL) 实现阳光酒店管理系统(java applet+SQL) 实现阳光酒店管理系统(java applet+SQL) 实现阳光酒店管理系统(java applet+SQL) 实现阳光酒店管理系统(java ...
基于java+applet实现家庭理财系统(java+applet+系统ppt文档) 基于java+applet实现家庭理财系统(java+applet+系统ppt文档) 基于java+applet实现家庭理财系统(java+applet+系统ppt文档) 基于java+applet实现家庭理财...
基于java+applet实现阳光酒店管理系统(java+applet+SQL+文档lunwen+PPT) 基于java+applet实现阳光酒店管理系统(java+applet+SQL+文档lunwen+PPT) 基于java+applet实现阳光酒店管理系统(java+applet+SQL+文档lunwen+...
阳光酒店管理系统(javaapplet+SQL)阳光酒店管理系统(javaapplet+SQL)阳光酒店管理系统(javaapplet+SQL)阳光酒店管理系统(javaapplet+SQL)阳光酒店管理系统(javaapplet+SQL)阳光酒店管理系统(javaapplet+SQL)阳光酒店...
阳光酒店管理系统(javaapplet+SQL)阳光酒店管理系统(javaapplet+SQL)阳光酒店管理系统(javaapplet+SQL)阳光酒店管理系统(javaapplet+SQL)阳光酒店管理系统(javaapplet+SQL)阳光酒店管理系统(javaapplet+SQL)阳光酒店...
阳光酒店管理系统(javaapplet+SQL)阳光酒店管理系统(javaapplet+SQL)阳光酒店管理系统(javaapplet+SQL)阳光酒店管理系统(javaapplet+SQL)阳光酒店管理系统(javaapplet+SQL)阳光酒店管理系统(javaapplet+SQL)阳光酒店...
基于Java实现的网络三维技术的设计与实现(java+3D+Applet+源码+文档lunwen) 基于Java实现的网络三维技术的设计与实现(java+3D+Applet+源码+文档lunwen) 基于Java实现的网络三维技术的设计与实现(java+3D+Applet...
适合练手、课程设计、毕业设计的Java项目源码:阳光酒店管理系统(javaapplet+SQL).rar 适合练手、课程设计、毕业设计的Java项目源码:阳光酒店管理系统(javaapplet+SQL).rar 适合练手、课程设计、毕业设计的Java项目...
阳光酒店管理系统(javaapplet+SQL).rar
阳光酒店管理系统(javaapplet+SQL)130425.zip
JSP源码——阳光酒店管理系统(javaapplet+SQL).zip
(java+applet) 实现 图片浏览小程序(java+applet) 实现 图片浏览小程序(java+applet) 实现 图片浏览小程序(java+applet) 实现 图片浏览小程序(java+applet) 实现 图片浏览小程序(java+applet) 实现 图片浏览小程序...
阳光酒店管理系统:(javaapplet+SQL), 阳光酒店管理系统:(javaapplet+SQL) 阳光酒店管理系统:(javaapplet+SQL) 阳光酒店管理系统:(javaapplet+SQL) 阳光酒店管理系统:(javaapplet+SQL)
java+applet+JDBC实现家庭理财系统(源码+数据库) 一、功能描述 修改密码:单击修改密码,则直接输入新的密码,然后确定就可以了; 修改数据:单击修改数据,然后选择要修改的对象的序号,再按需要修改; 删除数据:...
阳光酒店管理系统(javaapplet+SQL)_project阳光酒店管理系统(javaapplet+SQL)_project阳光酒店管理系统(javaapplet+SQL)_project