Ireport客户端打印
1. 新建一个web项目Outireport。如图:
2. 向lib导入ireport报表需要的包jasperreports-4.0.2.jar, jasperreports-applet-4.0.2.jar, commons-collections-2.1.jar, commons-logging-1.0.2.jar, groovy-all-1.7.5.jar, iText-2.1.7.jar, iTextAsian.jar(这几个表可能有个别包不是必须)。如图:
3. 在WebRoot中新建一个名为ireport的目录,里面存放打印的ireport报表,我这里是一个用户的报表。如图:
4. 在src中新建一个applet的目录,在applet中新建一个名为IreportServlet.java的servlet。代码如下:
package applet;
import java.io.File;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.JasperReport;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;
import net.sf.jasperreports.engine.util.JRLoader;
public class IreportServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public void destroy() {
super.destroy(); // Just puts "destroy" string in log
}
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
this.doPost(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
List list=new ArrayList();
try{
Users users=null;
for(int i=0;i<2;i++)
{
users=new Users();
users.setUserName("yzp"+i);
users.setSex(""+i);
users.setPhone("13410479904");
users.setPhone("19890214");
list.add(users);
}
JRBeanCollectionDataSource jds =new JRBeanCollectionDataSource(list); //使用javabean数据源
String url=this.getServletContext().getRealPath("/")+"/ireport/users.jasper";//报表模板的文件路径
File reportFile = new File(url);
JasperReport report=(JasperReport) JRLoader.loadObject(reportFile.getPath());
JasperPrint jasperPrint=null;
jasperPrint= JasperFillManager.fillReport(report, null, jds);//将所有的数据填充到jasperPrint,形成正常的报表
response.setContentType("application/pdf");
ServletOutputStream ouputStream = response.getOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(ouputStream);
oos.writeObject(jasperPrint);//将JasperPrint对象写入对象输出流中
oos.flush();
oos.close();
}catch(Exception e)
{
e.printStackTrace();
}
}
}
5. 在web.xml中配置代码,加入以下代码
<servlet>
<servlet-name>ireportServlet</servlet-name>
<servlet-class>applet.IreportServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ireportServlet</servlet-name>
<url-pattern>/ireportServlet</url-pattern>
</servlet-mapping>
启动项目,在网页上输入http://localhost:8080/Outireport/ireportServlet
如果弹出一个下载的窗口,证明这个servlet已经ok了。
6. 接下来,我们要写一个applet,在src/applet目录下新建一个名为printerApplet.java的applet。代码如下:
package applet;
import java.applet.Applet;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.net.URL;
import javax.swing.JOptionPane;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.JasperPrintManager;
import net.sf.jasperreports.engine.util.JRLoader;
public class printerApplet extends Applet {
private static final long serialVersionUID = 1L;
private URL url=null;
/** Creates new form AppletViewer */
public printerApplet() {
}
public void init() {
String strUrl = "http://localhost:8080/Outireport/ireportServlet";
if (strUrl != null) {
try {
url = new URL("http://localhost:8080/Outireport/ireportServlet"); } catch (Exception e) {
StringWriter swriter = new StringWriter();
PrintWriter pwriter = new PrintWriter(swriter);
e.printStackTrace(pwriter);
JOptionPane.showMessageDialog(this, swriter.toString());
}
} else {
JOptionPane.showMessageDialog(this, "Source URL not specified");
}
}
public void start() {
if (url != null) {
try {
//根据url的路径(url:调用的servlet的路径)去获取JasperPrint
JasperPrint obj = (JasperPrint)JRLoader.loadObject(url);// 发送对象请求,获得JasperPrint对象
JasperPrintManager.printReport(obj, true);// 调用方法打印所获得的JasperPrint对象
} catch (Exception e) {
e.printStackTrace();
}
} else {
JOptionPane.showMessageDialog(this,
"start():Source URL not specified");
}
}
}
右键单击printerApplet.java,选择 “Run as Java Applet”,弹出打印对话框,确认后打印机正常打印,证明 applet 已经编写成功。
7. index.jsp中的代码如下。
<%@ page language="java" import="java.util.*;" pageEncoding="utf-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>ireport报表客户端打印</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<script type="text/javascript">
function openApp()
{
var url = "/Outireport/ireportServlet";
//COD:在根目录WebRoot下applet.class存放的路径 ARCHIVE:在根目录WebRoot下用到的包存放的路径
document.write('<APPLET ID="JrPrt" CODE="applet/printerApplet.class" ARCHIVE = "applet/print.jar,applet/jasperreports-4.0.2.jar,applet/commons-logging-1.0.2.jar,applet/commons-collections-2.1.jar" WIDTH = "0" HEIGHT = "0">');
document.write('<PARAM NAME = "type" VALUE="application/x-java-applet;version=1.2.2">');
document.write('<PARAM NAME = "scriptable" VALUE="false">');
//REPORT_URL:用来调用servlet的路径
document.write('<PARAM NAME = "REPORT_URL" VALUE ="'+url+'">');
document.write('<PARAM NAME = "SHOW_DIALOG" VALUE ="true">');
document.write('</APPLET>');
}
</script>
</head>
<body>
<input type="button" value="测试打印" onclick="openApp();">
</body>
</html>
在WebRoot目录下新建一个applet目录,将jasperreports-4.0.2.jar, jasperreports-applet-4.0.2.jar,commons-logging-1.0.2.jar, commons-collections-2.1.jar这几个包放一份进去。
如后修改src/applet目录下的printerApplet.java
将String strUrl = "http://localhost:8080/Outireport/ireportServlet";改成
String strUrl =getParameter("REPORT_URL");
将url = new URL("http://localhost:8080/Outireport/ireportServlet");改成
url = new URL(getCodeBase(),strUrl);
然后重新执行项目,将printerApplet.java生成的printerApplet.class文件复制一份到WebRoot/applet目录下。WebRoot/applet目录下的文件如下:
8. 最后为applet加入签名证书。
随便在那个盘里新建一个目录aa,将jasperreports-applet-4.0.2.jar解压到该目录中,jasperreports-applet-4.0.2.jar包中有三个文件META-INF、net、default.jasperreports.properties(都要有,不然会报错的);将printerApplet.java生成的printerApplet.class文件复制一份到该目录下,print的目录如下:
然后就是签名,系统-运行-输入cmd。
输入cd +jdk所在的目录\bin
jar cvfm 生成的包名.jar mymanifest +print的路径
例子:我叫的包名:print,aa的路径是:D:\aa\,那么输入的命令就是:jar cvfm print.jar mymanifest D:\aa\
在jdk中\bin的目录下就会生成一个print.jar的包。
用keytool生成证书:keytool -genkey -alias printkey -keystore printstore(printkey可以用自己的命名方式来命名)
用keytool导出证书:keytool -export -keystore printstore -alias printkey -file print.cer(print.cer证书的名字,也可用自己的命名方式来命名)
用jarsigner给reportprint.jar加上数字签名:jarsigner -keystore printstore appletPrint.jar printkey
以上都是在命令提示符下运行,printkey和printstore都可以以自己的命名方式来命名。现在在jdk中\bin的目录下已经有了一个print.jar和一个print.cer,把这两个文件拷贝回项目中,记得还是放在同一个目录下,放到WebRoot/applet目录下。如图:
完成。运行 Outireport 项目看看结果如何。如果 Java 控制台提示“ClassNotFoundException”,证明 applet 打包路径没有配置好:去查看 JasperReport 类是否被打包,以及 jsp 页面调用 reportprin.jar 是否正确。如果弹出对话框:该应用程序的数字签名无法验证,是否要运行该应用程序?证明数字签名已经可以使用。
最后,如果弹出打印对话框,点击答应能够正常打印说明程序已经完成。
具体介绍可以看看http:// aspnetdb.iteye.com/blog/648370这位兄台的,我也是用他的东西。
直接将\权限提升demo\当次提升中的bin文件复制到项目的WebRoot目录下,在index.jsp代码中将
<input type="button" value="测试打印" onclick="openApp();">
改为
<applet codebase="bin" code="applet.AllPermisionApplet.class"
archive="WebInterfaceDemo.jar" name="AllPermisionApplet" width="0"
height="0" mayscript></applet>
<input type="button" value="测试打印" onclick="openApp();">
运行后也能达到同样的目的。
分享到:
相关推荐
本案例是SpringBoot结合iReport做的打印,直接在浏览器上面显示PDF,建议在Eclipse+Maven上部署运行,启动方式与SpringBoot启动方式一样,特别注意:如果你使用的SpringBoot版本比较新,相关jar包会有所不同。
iReport+jasperReport之客户端打印 数字签名
ireport最全打印归纳,包含工具的下载,新建,主从,合计等详细归纳。
ireport的打印功能,很详细的,欢迎下载
ireport设计打印报表工具 iReport-0.3.2.zip
在学习的过程中遇到很多的问题,在这里不一一列出了,现在这个小实例就是关于iReport自带的打印功能,版本是4.5。网上资料都是3.0的打印,但是我们用4.5做的报表模板用3.0的库去打印难免会出现问题,比如说4.5中有...
ireport图文教程。
jasperreport、applet 客户端打印 注意:使用程序请导入jasperReport3.0和iReport3.0的包。
最近在搞国产化报表,使用Ireport技术。开始发现生成pdf中文输出有问题。请教大神写了一个demo,附有详细说明文档,分享一下。
一个简单的JSP制作SQL2008+Ireport项目源码打包,其中的项目中的report自行用ireport5.6制作报表文件。环境为jdk1.6+eclipse 6.0,开发工具myeclipse。index.jsp传参给print.jsp打印pdf报表。相关字段在ireport中需要...
ireport+jasper实现批量预览和打印,自己写的一个简单的实例
iReport 报表打印,jasper 页面设计。iReport 报表打印,jasper 页面设计。
iReport+模板+Java动态打印包括热敏单,动态编辑热敏单或者打印模板可以镶嵌图片
我使用的是ireport5.6.0+jasperreports5.6.0版本。实现客户端打印需要用到这些包。我在网上也找过有的都不全,这些jar包我都亲自试过。
51.打印时经常遇到翻页打印,而且每一页打印的内容不一致,iReport如何实现此功能? 50.iReport中的子报表如何实现根据其上部是否有打印数据而变打印位置? 49.iReport中当单元格中的文字出现换行跨页的情况,如何...
iReport 报表、子报表、主从报表、合计、实例解析1....4.2.2. iReport子报表SubReport(例:批量打印报表)... 13 4.2.3. iReport table类型的表单(例:押金报表)... 21 4.2.4. Dorado7中iReport的配置... 24
下面小编就为大家分享一篇iReport生成pdf打印的实例代码,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
iReprot3.7最近报表设计器使用教程
使用ireport和struts2进行报表设计的简单示例,生成普通报表和饼图、柱状图。java工程的lib里包含丰富的jar包,且很多都是从各个网站下载的最新版本,文件夹内还包含一些ireport和jasperreport文档,适合刚入门学习...