Java自学者论坛

 找回密码
 立即注册

手机号码,快捷登录

恭喜Java自学者论坛(https://www.javazxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,会员资料板块,购买链接:点击进入购买VIP会员

JAVA高级面试进阶训练营视频教程

Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程Go语言视频零基础入门到精通Java架构师3期(课件+源码)
Java开发全终端实战租房项目视频教程SpringBoot2.X入门到高级使用教程大数据培训第六期全套视频教程深度学习(CNN RNN GAN)算法原理Java亿级流量电商系统视频教程
互联网架构师视频教程年薪50万Spark2.0从入门到精通年薪50万!人工智能学习路线教程年薪50万大数据入门到精通学习路线年薪50万机器学习入门到精通教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程MySQL入门到精通教程
查看: 433|回复: 0

关于jasperreport对应java打印机的解决方案

[复制链接]
  • TA的每日心情
    奋斗
    2024-4-6 11:05
  • 签到天数: 748 天

    [LV.9]以坛为家II

    2034

    主题

    2092

    帖子

    70万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    705612
    发表于 2021-4-28 06:54:55 | 显示全部楼层 |阅读模式

        对于jasperreport打印这个功能,遇到了一大堆问题,也只能一点一点解决我:

        1.现在我用的是jasperreport.jar是4.6版本。

          (1).因为网上查到:6.0以上版本已经不再支持java打印功能,只能支持页面打印。

          (2).如过可以用浏览器打印,那这个打印问题已经解决了

          (3).我不想再用5.6版本重新测试一遍了,因为官网给的jasperreport-apples.jar例子里面有很多问题,不想在是一遍

        2.对于程序的需要,:

          (1).最好在webapp(根目录)下新建一个applets(自命名)文件夹

          (2).applets文件夹放入jre1.6.exe或以上版本,因为jasperreport-4.5是jre1.6写的

          (3).从官网的jasperreport-4.6例子中,找到commons-collections.jar、commons-digester.jar、commons-logging.jar,和自己的log4j.jar、log4j-core.jar,放入applets

        3.对于jasperreports-applet-4.6.0.jar,也放入applets,但是等到测试的时候,这个jar包里有很多问题,如果提示这个class找不到,就从jasperreoprt-4.6.jar中粘进去

          创建jar包

          (1).官网给的例子jasperreport-applets-4.6.jar解压后,复制default.jasperreports.properties、net,新建文件夹,粘进去

          (2).将缺少的class从jasperreport-4.6.jar粘到你放的位置对应的位置

          (3).ctrl+p命令,将default.jasperreports.properties、net生成一个jasperreport-applets-4.6.jar,放入applets

        4.这是我把官网例子改了以后的代码

      

    import net.sf.jasperreports.engine.JasperPrint;
    import net.sf.jasperreports.engine.JasperPrintManager;
    import net.sf.jasperreports.engine.util.JRLoader;
    
    import javax.swing.*;
    import java.io.PrintWriter;
    import java.io.StringWriter;
    import java.net.URL;
    
    /**
     * Created by 朱星翰 on 2017/9/14.
     */
    public class JRPrinterApplet extends javax.swing.JApplet {
        private URL url;
        private JasperPrint jasperPrint;
    
        public JRPrinterApplet(){
    
        }
        public void init() {
            String strUrl = getParameter("REPORT_URL");
            if (strUrl != null) {
                try {
                    url = new URL(getCodeBase(), strUrl);
                } catch (Exception e) {
                    StringWriter swriter = new StringWriter();
                    PrintWriter pwriter = new PrintWriter(swriter);
                    e.printStackTrace(pwriter);
                    JOptionPane.showMessageDialog(this, swriter.toString());
                }
            }else {
                JOptionPane.showMessageDialog(this, "REPORT_URL:不能为空!");
            }
        }
        @Override
        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 {
                                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, "报表是空的!");
                }
            }
            else {
                JOptionPane.showMessageDialog(this, "REPORT_URL:不能为空!");
            }
        }
    }
    import net.sf.jasperreports.engine.JasperPrint;
    import net.sf.jasperreports.engine.util.JRLoader;
    
    import javax.swing.*;
    import java.io.PrintWriter;
    import java.io.StringWriter;
    import java.net.URL;
    
    /**
     * Created by 朱星翰 on 2017/9/14.
     */
    public class JRViewApplet  extends javax.swing.JApplet {
    
        private URL url;
        private JasperPrint jasperPrint;
    
        public JRViewApplet(){
    
        }
        public void init() {
            String strUrl = getParameter("REPORT_URL");
            if (strUrl != null) {
                try {
                    url = new URL(getCodeBase(), strUrl);
                } catch (Exception e) {
                    StringWriter swriter = new StringWriter();
                    PrintWriter pwriter = new PrintWriter(swriter);
                    e.printStackTrace(pwriter);
                    JOptionPane.showMessageDialog(this, swriter.toString());
                }
            }else {
                JOptionPane.showMessageDialog(this, "REPORT_URL:不能为空!");
            }
        }
    
        @Override
        public void start() {
            // Add your handling code here:
            if (url != null) {
                try {
                    if (jasperPrint == null) {
                        jasperPrint = (JasperPrint) JRLoader.loadObject(url);
                    }
                    if (jasperPrint != null) {
                        ViewerFrame viewerFrame = new ViewerFrame(this.getAppletContext(), jasperPrint);
                        viewerFrame.show();
                    }else {
                        JOptionPane.showMessageDialog(this, "报表是空的!");
                    }
                }catch (Exception e) {
                    StringWriter swriter = new StringWriter();
                    PrintWriter pwriter = new PrintWriter(swriter);
                    e.printStackTrace(pwriter);
                    JOptionPane.showMessageDialog(this, swriter.toString());
                }
            } else {
                JOptionPane.showMessageDialog(this, "REPORT_URL:不能为空!");
            }
        }
    }
    /*
     * JasperReports - Free Java Reporting Library.
     * Copyright (C) 2001 - 2011 Jaspersoft Corporation. All rights reserved.
     * http://www.jaspersoft.com
     *
     * Unless you have purchased a commercial license agreement from Jaspersoft,
     * the following license terms apply:
     *
     * This program is part of JasperReports.
     *
     * JasperReports is free software: you can redistribute it and/or modify
     * it under the terms of the GNU Lesser General Public License as published by
     * the Free Software Foundation, either version 3 of the License, or
     * (at your option) any later version.
     *
     * JasperReports is distributed in the hope that it will be useful,
     * but WITHOUT ANY WARRANTY; without even the implied warranty of
     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
     * GNU Lesser General Public License for more details.
     *
     * You should have received a copy of the GNU Lesser General Public License
     * along with JasperReports. If not, see <http://www.gnu.org/licenses/>.
     */
    import javax.swing.JButton;
    import javax.swing.JOptionPane;
    
    import net.sf.jasperreports.engine.JRException;
    import net.sf.jasperreports.engine.JasperPrint;
    import net.sf.jasperreports.view.JRViewer;
    
    
    /**
     * @author Teodor Danciu (teodord@users.sourceforge.net)
     * @version 4.6.0
     */
    public class JRViewerPlus extends JRViewer {
    
        /*protected JButton btnPlus = new javax.swing.JButton();*/
    
        public JRViewerPlus(JasperPrint jrPrint) throws JRException {
            super(jrPrint);
            
            tlbToolBar.remove(btnSave);
            tlbToolBar.remove(btnReload);
    
            /*btnPlus = new javax.swing.JButton();
            btnPlus.setToolTipText("Plus...");
            btnPlus.setText("Plus...");
            btnPlus.setPreferredSize(new java.awt.Dimension(80, 23));
            btnPlus.setMaximumSize(new java.awt.Dimension(80, 23));
            btnPlus.setMinimumSize(new java.awt.Dimension(80, 23));
            btnPlus.addActionListener(new java.awt.event.ActionListener() {
                public void actionPerformed(java.awt.event.ActionEvent evt) {
                    btnPlusActionPerformed(evt);
                }
            });
            tlbToolBar.add(btnPlus, 0);*/
        }
    
        protected void setZooms() {
            this.zooms = new int[]{33, 66, 100, 133, 166, 200, 233};
            this.defaultZoomIndex = 2;
        }
    
    
        /*protected void btnPlusActionPerformed(java.awt.event.ActionEvent evt) {
            JOptionPane.showMessageDialog(this, "I just wanted to let you know that you can extend the JRViewer to customize it.\n The button you have pushed was added this way.");
        }*/
    
    
    }
    /*
     * JasperReports - Free Java Reporting Library.
     * Copyright (C) 2001 - 2011 Jaspersoft Corporation. All rights reserved.
     * http://www.jaspersoft.com
     *
     * Unless you have purchased a commercial license agreement from Jaspersoft,
     * the following license terms apply:
     *
     * This program is part of JasperReports.
     *
     * JasperReports is free software: you can redistribute it and/or modify
     * it under the terms of the GNU Lesser General Public License as published by
     * the Free Software Foundation, either version 3 of the License, or
     * (at your option) any later version.
     *
     * JasperReports is distributed in the hope that it will be useful,
     * but WITHOUT ANY WARRANTY; without even the implied warranty of
     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
     * GNU Lesser General Public License for more details.
     *
     * You should have received a copy of the GNU Lesser General Public License
     * along with JasperReports. If not, see <http://www.gnu.org/licenses/>.
     */
    import net.sf.jasperreports.engine.JRException;
    import net.sf.jasperreports.engine.JasperPrint;
    import net.sf.jasperreports.view.JRViewer;
    
    
    /**
     * @author Teodor Danciu (teodord@users.sourceforge.net)
     * @version 4.6.0
     */
    public class JRViewerSimple extends JRViewer {
    
        /**
         *
         */
        public JRViewerSimple(JasperPrint jrPrint) throws JRException {
            super(jrPrint);
            tlbToolBar.remove(btnSave);
            tlbToolBar.remove(btnReload);
        }
    
    }
    /*
     * JasperReports - Free Java Reporting Library.
     * Copyright (C) 2001 - 2011 Jaspersoft Corporation. All rights reserved.
     * http://www.jaspersoft.com
     *
     * Unless you have purchased a commercial license agreement from Jaspersoft,
     * the following license terms apply:
     *
     * This program is part of JasperReports.
     *
     * JasperReports is free software: you can redistribute it and/or modify
     * it under the terms of the GNU Lesser General Public License as published by
     * the Free Software Foundation, either version 3 of the License, or
     * (at your option) any later version.
     *
     * JasperReports is distributed in the hope that it will be useful,
     * but WITHOUT ANY WARRANTY; without even the implied warranty of
     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
     * GNU Lesser General Public License for more details.
     *
     * You should have received a copy of the GNU Lesser General Public License
     * along with JasperReports. If not, see <http://www.gnu.org/licenses/>.
     */
    import java.applet.AppletContext;
    import java.awt.BorderLayout;
    import java.net.MalformedURLException;
    import java.net.URL;
    
    import javax.swing.JOptionPane;
    
    import net.sf.jasperreports.engine.JRException;
    import net.sf.jasperreports.engine.JRPrintHyperlink;
    import net.sf.jasperreports.engine.JasperPrint;
    import net.sf.jasperreports.view.JRHyperlinkListener;
    
    /**
     * @author Teodor Danciu (teodord@users.sourceforge.net)
     * @version 4.6.0
     */
    public class ViewerFrame extends javax.swing.JFrame implements JRHyperlinkListener {
    
        private AppletContext appletContext;
    
        public ViewerFrame(AppletContext appletContext, JasperPrint jasperPrint) throws JRException {
            initComponents();
            this.appletContext = appletContext;
            JRViewerPlus viewer = new JRViewerPlus(jasperPrint);
            viewer.addHyperlinkListener(this);
            this.pnlMain.add(viewer, BorderLayout.CENTER);
        }
    
        public void gotoHyperlink(JRPrintHyperlink hyperlink) {
            switch(hyperlink.getHyperlinkTypeValue()) {
                case REFERENCE : {
                    try {
                        this.appletContext.showDocument(new URL(hyperlink.getHyperlinkReference()), "_blank");
                    } catch (MalformedURLException e) {
                        JOptionPane.showMessageDialog(this, e.getMessage());
                    }
                    break;
                }
                case LOCAL_ANCHOR :
                case LOCAL_PAGE : {
                    break;
                }
                case REMOTE_ANCHOR :
                case REMOTE_PAGE : {
                    JOptionPane.showMessageDialog(this, "Implement your own JRHyperlinkListener to manage this type of event.");
                    break;
                }
                case NONE :
                default : {
                    break;
                }
            }
        }
    
        /** This method is called from within the constructor to
         * initialize the form.
         * WARNING: Do NOT modify this code. The content of this method is
         * always regenerated by the Form Editor.
         */
        private void initComponents() {//GEN-BEGIN:initComponents
            pnlMain = new javax.swing.JPanel();
    
            setTitle("预览");
            setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
            pnlMain.setLayout(new java.awt.BorderLayout());
    
            getContentPane().add(pnlMain, java.awt.BorderLayout.CENTER);
    
            pack();
            java.awt.Dimension screenSize = java.awt.Toolkit.getDefaultToolkit().getScreenSize();
            int width=1000;
            int height=800;
            setSize(new java.awt.Dimension(width, height));
            setLocation((screenSize.width-width)/2,(screenSize.height-height)/2);
        }//GEN-END:initComponents
    
        // Variables declaration - do not modify//GEN-BEGIN:variables
        private javax.swing.JPanel pnlMain;
        // End of variables declaration//GEN-END:variables
    
    }

          (1).把这些代码放入src下,生成class代码

          (2).将class生成jar,我命名print.jar

          (3).jar -cvf print.jar *.class  (生成jar包),放入applets

         5.签名    

          1.创建一个证书
          keytool -genkey -validity 1800 -keystore applet.store -alias applet  
          2.导出证书文件
          keytool -export -keystore applet.store -alias applet -file applet.cer
          3.对jar包进行签名

          jarsigner -keystore applet.store jasperreports-applet-4.6.0.jar applet
          

          jarsigner -keystore applet.store print.jar applet (注意:必须签名这个jar包,要不然打印报错)

         6.页面,自己处理了很多js,

          

           <a title="打印" onclick="is_ie('JRPrinterApplet')"><img src="${ctx}/static/Images/print.jpg" alt=""></a>
                &nbsp;&nbsp;
                <a title="预览" onclick="is_ie('JRViewApplet')" ><img src="${ctx}/static/Images/look.png" alt=""></a></a>
                &nbsp;&nbsp;
                <a title="更方便的使用打印功能" style="font-size: 11px" href="${ctx}/applets/applet.cer">是否安装安全证书?</a>
    function is_ie(str){
            if ((navigator.userAgent.indexOf('MSIE') >= 0 && navigator.userAgent.indexOf('Opera') < 0)||(navigator.userAgent.indexOf("Trident") > -1 && navigator.userAgent.indexOf("rv") > -1)){
                var archive='print.jar,jasperreports-applet-4.6.0.jar,commons-logging-1.1.1.jar,commons-collections-2.1.1.jar,commons-digester-2.1.jar';
                var REPORT_URL='${ctx}/jasper/all_printJasper?';
                var codebase='${ctx}/applets'
                var file='${ctx}/applets/jre-6u45-windows-i586.exe';
                var scriptable=false
                var type='application/x-java-applet;version=1.6.0';
    
                $.each(args,function(key,value){
                    REPORT_URL+=key+"="+value+"&";
                });
                REPORT_URL=change(REPORT_URL);
                REPORT_URL=encodeURI(REPORT_URL);
    
                var write='正在处理'+(str=='JRPrinterApplet'?'打印':'预览')+'...' +
                        '<object classid="clsid:8AD9C840-044E-11D1-B3E9-00805F499D93" width = "0" height = "0"  codebase="'+file+'" mayscript>' +
                        '<param name = "code" value = "'+str+'.class" >' +
                        '<param name = "codebase" value = "'+codebase+'" >' +
                        '<param name = "archive" value = "'+archive+'" >' +
                        '<param name="type" value="'+type+'">' +
                        '<param name="scriptable" value="'+scriptable+'">' +
                        '<param name = "REPORT_URL" value ="'+REPORT_URL+'">' +
                        '<comment>' +
                        '<embed type="'+type+'" code="'+str+'.class" java_codebase="'+codebase+'" archive="'+archive+'" scriptable='+scriptable+' pluginspage="'+file+'" >' +
                        '<noembed></noembed>' +
                        '</embed>' +
                        '</comment>' +
                        '</object>'
                document.write(write);
            }else {
                alert('预览打印仅支持ie浏览器')
            }
        }

     

    最后,终于完成了,总之,觉的jasperreport-applets-4.6官网给的好多错误地方,只有慢慢去找问题

    哎...今天够累的,签到来了1...
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|小黑屋|Java自学者论坛 ( 声明:本站文章及资料整理自互联网,用于Java自学者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-5-19 21:44 , Processed in 0.071922 second(s), 30 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表