本人使用ireport5.1.0画的报表,实现客户端打印时报java.io.StreamCorruptedException:invalid stream header:0D0A0D0A这个错误,下面是代码,请各位高手帮忙看看怎么回事:
1)、action类代码
import java.io.File;
import java.io.ObjectOutputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import net.sf.jasperreports.engine.JRResultSetDataSource;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionSupport;
public class IreportAction extends ActionSupport{
private static final long serialVersionUID = 1974082731836773155L;
private static final String CONTENTTYPE = "application/octet-stream";
/**
* 打印报表
* @return
*/
@SuppressWarnings("unchecked")
public void doIreportPrint(){
HttpServletResponse response = ServletActionContext.getResponse();
String fileName = "";
String sql = "select id,dname,dcode from ct_su_departments where datalevel = 0 and status = 0 and rownum <=100";
//建立连接
Connection conn = this.createConnection();
//参数设置
Map parameters = new HashMap();
try {
Statement stmt = conn.createStatement();//获取数据库链接
ResultSet rs = stmt.executeQuery(sql);//获取数据
String jasper = new File(ServletActionContext.getServletContext().getRealPath("/report/report1.jasper")).getPath();//获取文件的绝对路径
JasperPrint jpt = JasperFillManager.fillReport(jasper, parameters, new JRResultSetDataSource(rs));//匹配数据源,生成JasperPrint
response.setContentType(CONTENTTYPE);
ServletOutputStream ouputStream = response.getOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(ouputStream);
oos.writeObject(jpt);
oos.flush();
oos.close();
}catch(Exception e) {
System.out.println("Error:" + e.toString());
e.printStackTrace();
}finally {
CloseConnect(conn);
conn = null;
}
}
/**
* 建立数据库连接
* @return
*/
public Connection createConnection(){
Connection conn;
try{
String driver = "oracle.jdbc.driver.OracleDriver";//oracle.jdbc.OracleDriver
String url = "jdbc:oracle:thin:@172.19.24.239:1521:NSOA";
Class.forName(driver);
conn = DriverManager.getConnection(url,"JXKHOA","JXKHOA");
conn.setAutoCommit(false);
return conn;
}catch(SQLException e1) {
System.out.println("建立连接错误 = " + e1.toString());
e1.printStackTrace();
}catch(ClassNotFoundException e2) {
System.out.println("建立连接错误 = " + e2.toString());
e2.printStackTrace();
}
return null;
}
/**
* 关闭数据库连接
* @param conn
*/
public void CloseConnect(Connection conn){
try{
conn.commit();
conn.setAutoCommit(true);
conn.close();
}catch(Exception e){
System.out.println("关闭连接错误 = " + e.toString());
}
}
}
2)japplet代码:
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 IreportApplet extends javax.swing.JApplet{
private static final long serialVersionUID = 2525694418170444107L;
private URL url = null;
private JasperPrint jasperPrint = null;
public void init(){
String strUrl = "http://172.19.24.28:8100/BaseWeb/ireportPrint.action";
if (strUrl != null){
try{
URL urll = new URL(strUrl);
url = urll;
System.out.println("url="+urll);
}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{
jasperPrint = (JasperPrint)JRLoader.loadObject(url);
}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;
Thread thread = new Thread(new Runnable(){
public void run(){
try{
System.out.println("进入start方法,即将打印pdf文件");
JasperPrintManager.printReport(print, true);
}catch (Exception e){
StringWriter swriter = new StringWriter();
PrintWriter pwriter = new PrintWriter(swriter);
e.printStackTrace(pwriter);
JOptionPane.showMessageDialog(null, swriter.toString());
}
}
});
thread.start();
}else{
JOptionPane.showMessageDialog(this, "Empty report.");
}
}else{
JOptionPane.showMessageDialog(this, "start():Source URL not specified");
}
}
}
执行到jasperPrint = (JasperPrint)JRLoader.loadObject(url);这就话是就报错了。该报表导出excel和pdf都是可以的,而且在action类里面直接使用JasperViewer.viewReport(jpt,false);也是可以打印的,就这个japplet生成客户端打印时报错了。希望各位高手能赐教,非常感谢!!!
新建一 web 项目 Test2。将 iReport 目录 lib 下的所有 jar 包导入。在 servlet 程序中把从数据库得到的数据传入 *.jrxml 文件得到 *.jrprint 文件(这才是我们想要的东西),并把这个对象写入 Stream流,以返还给请求客户端。源码:
view plainprint?
package com.defo......
答案就在这里:Applet+客户端打印+jasperreport+报表
----------------------你好,人类,我是来自CSDN星球的问答机器人小C,以上是依据我对问题的理解给出的答案,如果解决了你的问题,望采纳。