jasperreport applet-jasperreport+applet实现客户端打印报表

问题描述

jasperreport+applet实现客户端打印报表

本人使用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+报表

时间: 2024-08-12 12:02:50

jasperreport applet-jasperreport+applet实现客户端打印报表的相关文章

水晶报表在服务器上可以打印 但是到了客户端打印控件蹦不出来 IE 设置我设过了 服务器上没有任何防火墙 客户访问也开开了

问题描述 水晶报表在服务器上可以打印但是到了客户端打印控件蹦不出来IE设置我设过了服务器上没有任何防火墙客户访问也开开了 解决方案 解决方案二:所有客户访问都不行吗?是不是IE没设置好啊

vs.net2008做的水晶报表,怎样才能在客户端打印?

问题描述 vs.net2008做的水晶报表,怎样才能在客户端打印?我做的系统要放在internet上,现在提示找不到打印机,在本地有装vs的机器运行没问题的.m.SetParameterValue("abc",DropDownList1.Text);m.SetParameterValue("c",TextBox1.Text);m.SetParameterValue("d",TextBox2.Text);m.SetParameterValue(&q

jasperreports-JasperReports+iReport+struts2打印报表

问题描述 JasperReports+iReport+struts2打印报表 在使用JasperReports+iReport+struts2打开报表是,页面报出Jasper Output Error:Error executing SQL statement for : test01 .在action类中的接口代码为: public void doReportPrintPDF(){ HttpServletResponse response = ServletActionContext.getR

在WEB环境下打印报表的crystal的解决方案

web|打印|打印报表|解决 <%@ LANGUAGE="VBSCRIPT" %><%' = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = ' 从ADO Recordset直接生成报表' = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = '' 概念:' ' 这个应用被设计成演示怎样从ADO Reco

Access3.5 屏幕显示方式和打印报表样式

  如果没有什么别的要求就单击下一步按钮 现在对话框中的内容又发生了改变我们需要选择屏幕的显示方式也就是选择将要建立的数据库中窗口的背景窗口上的默认字体大小和颜色用鼠标单击一个选项就会发现在窗口左边的方框中展示出所选的显示样式这样每选一次就看看满意不满意很容易就可以找到比较合适的效果了选择工业单击下一步按钮现在这个对话框要选择打印报表的样式 打印报表就是把数据库中的数据打印在纸上而打印报表的样式就是指打印时所用的格式和刚才屏幕的显示样式一样每选定一个选项左面的方框中都会将所选的打印报表样式显示出

编写获取客户端打印内容的插件

问题描述 编写获取客户端打印内容的插件 我没有做过这方面的插件,所以不知道如何做.请大神们提供下思路和技术支持... 插件的基本功能是实现 1.获取客户端的打印数据,例如客户机要打印发票.插件就要获取打印内容. 2.将获取的打印内容回发到服务器进行分析存储.

数据库-我在页面打印报表的时候需要显示它的值为空,求高人告诉我怎么做

问题描述 我在页面打印报表的时候需要显示它的值为空,求高人告诉我怎么做 最近做小项目,其中有个字段(平时成绩)在表中值为-1.我在页面打印报表的时候需要显示它的值为空,求高人告诉我怎么做

jacob外网客户端打印不了了

问题描述 我的系统功能:从数据库中读取数据,替换到word模板中,最后打印出来.调用jacob的打印方法Dispatch.call(wordfile,"PrintOut");描述:服务器搭在集团,集团的其他电脑可以打印:但是现在分公司是用外网访问ERP的,分公司的电脑都不能打印.我在打印前判断了找默认打印机,都找到了.PrintServicedefaultService=PrintServiceLookup.lookupDefaultPrintService();客户端:打印的代码+j

加密-ireport打印报表问题 java

问题描述 ireport打印报表问题 java 如何给导出的word文档加密,设置只读,不允许修改里面的内容.设置只读模式