Java_实现iReport打印
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
iReport报表打印功能代码编写环境
系统:windows xp
开发工具:Myeclipes6.0
JDK版本:Java6(jdk6.0,jre6.0)
服务器:Tomcat5.5
Ireport版本:iReport-2.0.5 windows 安装版(iReport-2.0.5-windows-installer.exe)
实现步骤
一、iReport-2.0.5安装。
选择安装路径默认安装(一直点击下一步)。
二、将iReprot的jasperreports-2.0.5.jar文件复制到Myeclipes中你工程的WEB-INF/lib目录下。
jasperreports-2.0.5.jar文件所在位置在你iReprot的安装路径下,我的是C:\Program Files\JasperSoft\iReport-2.0.5\lib。
三、要实现打印的Jsp文件编写,Jsp文件中打印按钮或者打印连接应该提交给一个javascript,
具体代码如:
<a href="javascript: print(${exammanage.oid })"><font
color="blue">打印</font></a>
javascript代码如下
function print(oid){
if(!confirm("确定要打印该资格证吗?"))
return ;
window.showModalDialog('${ctx}/exam/exammanage/examprint_cert.jsp?oid='
+oid,'','dialogWidth:50px;dialogHeight:150px;dialogTop:1000px;dialogLef t:1000px');
document.forms[0].flg.value = "0";
document.forms[0].action="${ctx}/ExamPermitPrint.html";
document.forms[0].submit();
}
代码解释:
1、
window.showModalDialog('${ctx}/exam/exammanage/examprint_cert.jsp?oid='
+oid,'','dialogWidth:50px;dialogHeight:150px;dialogTop:1000px;dialogLef t:1000px');
此段的功能是显示打印提示窗口,我的文件是WebRoot路径下/exam/exammanage/路径下的examprint_cert.jsp文件,而且需要传一个你所要打印的记录的唯一字段(数据库中唯一代表一条记录的字段),我这里用OID。
2.document.forms[0].action="${ctx}/ExamPermitPrint.html";
document.forms[0].submit();
此代码是当你打印成功执行完之后要执行的代码,例如重新查询记录列表
四、打印提示窗口文件examprint_cert.jsp编写
examprint_cert.jsp
<!—-开始-->
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>考试管理子系统</title>
<link href="${ctx }/css/style.css" rel="stylesheet" type="text/css">
<script language="javascript">
function closew()
{
this.window.close();
}
</script>
</head>
<% String oid = request.getParameter("oid"); %>//取得你在javascript中传进来的oid
<body bgcolor="#fdfdhd" >
<OBJECT codeBase=lib/jinstall-1_5_0-windows-i586.cab#Version=1,5,0,0 height=0 width=0
classid=clsid:8AD9C840-044E-11D1-B3E9-00805F499D93>
<PARAM NAME="CODE"
VALUE="com.bb.employment.webapp.action.JsperApplet.class">
<PARAM NAME="ARCHIVE"
VALUE="<%=request.getContextPath()%>/exam/lib/printer.jar">
<PARAM NAME="REPORT_URL"
VALUE="<%=request.getContextPath()%>/ExamPermitPrintApply.html?oid=<%=o id%>"></OBJECT>
<table width="0" border="0" align="center" cellpadding="0">
<tr>
<td>
<font color="red" ><%=oid %>正在向打印机传送,请等待!打印成功后再关闭此窗口。
</font>
</td>
</tr>
</table>
</body>
</html>
<!—-结束-->
代码解释:
1、codeBase=lib/jinstall-1_5_0-windows-i586.cab#Version=1,5,0,0
height=0 width=0 classid=clsid:8AD9C840-044E-11D1-B3E9-00805F499D93
此段代码固定写法,照抄即可
2、<PARAM NAME="CODE"
VALUE="com.bb.employment.webapp.action.JsperApplet.class">
此代码为关键所在,主要实现向打印机输出打印流工作
3、<PARAM NAME="ARCHIVE"
VALUE="<%=request.getContextPath()%>/exam/lib/printer.jar">
打印支持jar包,名字自己起,需要手工制作,后面叙述怎么制作,页面内照抄即可,路径在webroot 下,具体自己定义。
一般是自己所编写的模块下新建一个lib目录放置。
4、<PARAM
NAME="REPORT_URL"
VALUE="<%=request.getContextPath()%>/ExamPermitPrintApply.html?oid=<%=o id%>">
此代码主要是获取输入的打印流,ExamPermitPrintApply.html(我们的项目中Action的扩展名是.html,可以是.do或者其他,具体视项目规定定义)代表控制器层的Action,并且把刚取到的oid传给它,传oid的作用是可以在Action中根据oid获取要打印的对象(记录)。
五、c om.bb.employment.webapp.action.JsperApplet.class制作
新建一个名为JsperApplet.java 的Applet程序,路径自己放,一般放在实现打印的Action 所在的位置。
我的路径是com.bb.employment.webapp.action.JsperApplet.java JsperApplet.java
package com.bb.employment.webapp.action;
import java.applet.Applet;
import .URL;
import javax.swing.JOptionPane;
import net.sf.jasperreports.engine.util.JRLoader;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.JasperPrintManager;
public class JsperApplet extends Applet {
private static final long serialVersionUID = 1L;
private URL url = null;
private String strUrl = null;
public void init() {
strUrl = getParameter("REPORT_URL");
if (strUrl != null) {
try {
url = new URL(getCodeBase(), strUrl);
} catch (Exception e) {
e.printStackTrace();
}
} else
JOptionPane.showMessageDialog(this, "Source URL not specified");
}
public void start() {
if (url != null) {
try {
Object obj = JRLoader.loadObject(url); // 发送对象请求,获得JasperPrint对象
JasperPrintManager.printReport((JasperPrint) obj, false); // 调用方法打印所获得的JasperPrint对象
} catch (Exception e) {
e.printStackTrace();
}
}
}
// Stop the applet
public void stop() {
}
// Destroy the applet
public void destroy() {
}
/*
* public void paint (Graphics g) { g.drawString("cc"+name+"dd" , 0, 100); }
*/
}
代码编写完之后就可以制作printer.jar的jar包了,方法如下
鼠标右键选中你刚才所建的JsperApplet.java文件,单击Export,将JsperApplet.java导出成一个Jar文件(具体导出方法不在鳌述),名字为printer.jar(名字可以自己定义,但要和前面一致),先将这个printer.jar放置在桌面。
然后用压缩工具(WinRAR)打开(注意,不是解压)。
然后找到C:\Program Files\JasperSoft\iReport-2.0.5\lib\目录下的jasperreports-2.0.5.jar (路径就是你的iReport的安装路径)也用压缩工具打开,将jasperreports-2.0.5.jar包下的net,org包和default.jasperreports.properties文件Ctrl+C, 然后Ctrl+V到你刚刚打开的printer.jar下。
然后将制作好的printer.jar文件复制到/exam/lib/目录下,在复制一份printer.jar到JDK安装路径C:\Java\jdk1.5.0_09\bin下进行数字签名操作。
签名步骤:打开msdos黑窗口,进入JDK的目录(cd C:\Java\jdk1.5.0_09\bin)
输入命令
keytool -genkey -keystore printer.keystore –alias printer
jarsigner -keystore printer.keystore printer.jar printer
keytool -export -keystore printer.keystore -alias printer -file printer.cer
三条命令完成之后你会看到C:\Java\jdk1.5.0_09\bin目录下生成printer.keystore,printer.cer文件,将这两个文件也复制到/exam/lib/目录下
六、E xamPermitPrintApply.html所代表的Action编写
public void print() {//注意:print()方法是void的,没有返回值
String relativePath = "/exam/exammanage/jasper/bjh02.jasper";
/*将做好的报表文件复制到你的项目中,路径自己定义,我的路径是
/exam/exammanage/jasper,我的报表文件是bjh02.jasper,最好将生成的bjh02.jrxml
文件也复制到此目录下,报表文件所在目录在你的iReport2.05的安装目录C:\Program
Files\JasperSoft\iReport-2.0.5*/
String absolutePath =
getRequest().getSession().getServletContext()
.getRealPath(relativePath);
String oid1 = getRequest().getParameter("oid");
String oid=oid1.substring(0, oid1.length()-1);
HashMap props = new HashMap();
JasperPrint jasperprint = null;
Connection conn = null;
try {
conn = this.getConnection();
String[] certid = StringUtils.split(oid, ",");
for (int i = 1; i <= certid.length; i++) {
props.put("oid" + i, new BigDecimal(certid[i - 1]));
}
jasperprint = JasperFillManager.fillReport(absolutePath, props, conn);//需要传入JDBC的Connection,获取方法自己想办法,我的获取方法在别的地方不一定好用
conn.close();
conn = null;
ServletOutputStream ouputStream =
getResponse().getOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(ouputStream);
oos.writeObject(jasperprint);// 将JasperPrint对象写入对象输出流中
oos.flush();
oos.close();
oos = null;
ouputStream = null;
} catch (JRException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}catch (SQLException e) {
e.printStackTrace();
}
finally {
try{
if(conn!=null){
conn.close();
conn=null;
}
}catch (Exception e2){
e2.printStackTrace();
}
}
}
private Connection getConnection() {
BaseDBJdbc dbs = new BaseDBJdbc();
Connection conn = null;
try {
conn = dbs.getConnection();
} catch (Exception e) {
e.printStackTrace();
}
return conn;
}
为C:\Program Files\Java\jre1.6.0_02\lib\security目录下的java.policy文件添加
permission ng.RuntimePermission "accessClassInPackage.sun.awt"; permission ng.RuntimePermission
accessClassInPackage.sun.awt.windows";
到此为止,JAVA实现iReprot报表打印功能基本完成。