zoukankan      html  css  js  c++  java
  • 关于jasperreport对应java打印机的解决方案

        对于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.
     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官网给的好多错误地方,只有慢慢去找问题

  • 相关阅读:
    .NET开发中应该遵循的几点建议
    .NET开发中应该遵循的几点建议
    .NET开发中应该遵循的几点建议
    查询CPU占用高的SQL语句的解决方案
    查询CPU占用高的SQL语句的解决方案
    HTTP消息中Header头部信息整理
    HTTP消息中Header头部信息整理
    HTTP消息中Header头部信息整理
    mac搭建本地服务器
    常用的GIT
  • 原文地址:https://www.cnblogs.com/yzssoft/p/7591165.html
Copyright © 2011-2022 走看看