天天看點

ireport5.6.0+jasperreports-5.6.0+applet實作用戶端列印

       我也是第一次使用ireport這個報表工具。在網上找了各種資料,最終實作了列印功能,當把程式部署到伺服器上才知道,并不能實作用戶端列印。後來繼續百度,找到了可以通過applet實作用戶端列印的方法,也找到了很多列子,跟着敲了一邊,因為使用的jasperreports的版本不一緻,是以也遇到了各種問題。

       我最開始做列印參考http://aijnecjay.iteye.com/blog/1689372 這裡寫的,因為版本不一緻,在浏覽器上不能彈出列印提示。

最終檢視java控制台,才知道缺少什麼jar包,缺什麼就加什麼,一步一步完善。先說下需要用到的jar包,下載下傳連結https://download.csdn.net/download/wlj_wangjun/10579753

     1. 先寫Servlet

package com.tianjian.report.applet;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.servlet.ServletContext;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.tianjian.report.util.DBUtil;

import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;

public class printServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;  
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response){
        ServletContext context = request.getSession().getServletContext();
        String filepath=context.getRealPath("ireport/entryExamination/Onboarding.jasper");
        
            try {
                    //這裡因為需要實作批量列印,是以使用list ,将所有需要 JasperPrint 裝在list中
                    List<JasperPrint> list = new ArrayList();
            
                    Map<String,Object> map = new HashMap();
                    map.put("peId", "100");
                    map.put("peVisitId", "6");
                    
                    JasperPrint jasperPrint = JasperFillManager.fillReport(filepath,map, DBUtil.getConnection());
                    list.add(jasperPrint);
            
                response.setContentType("application/octet-stream");   
                ServletOutputStream ouputStream = response.getOutputStream();   
                ObjectOutputStream oos = new ObjectOutputStream(ouputStream);   
                oos.writeObject(list);//将所有JasperPrint對象寫入對象輸出流中   
                oos.flush();   
                oos.close(); 
                    
            } catch (JRException e) {
                    e.printStackTrace();
                } catch (Exception e) {
                    e.printStackTrace();
                } 
    }  
    
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response){ 
    }          
}
           

2.在web.xml中配置servlet

<servlet>  
      <servlet-name>printServlet</servlet-name>  
      <servlet-class>com.tianjian.report.applet.printServlet</servlet-class>  
  </servlet>  
  <servlet-mapping>  
      <servlet-name>printServlet</servlet-name>  
      <url-pattern>/printServlet</url-pattern>  
  </servlet-mapping>
           

在浏覽器中輸入 http://localhost:8080/report/printServlet 測試servlet是否編寫成功,若成功,浏覽器會彈出 下載下傳提示

ireport5.6.0+jasperreports-5.6.0+applet實作用戶端列印

3.建立一個applet類

package com.tianjian.report.applet;

import java.applet.Applet;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.net.URL;
import java.util.List;

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 printApplet extends Applet {

    private static final long serialVersionUID = 1L;  
    private URL url=null;  
  
    public printApplet() {  
        
    }  
  
    @SuppressWarnings("unused")
    public void init() {  
        String strUrl = "http://localhost:8080/report/printServlet"; 
          //String strUrl =getParameter("REPORT_URL");
        if (strUrl != null) {  
            try {  
                url = new URL("http://localhost:8080/report/printServlet");
                //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, "Source URL not specified");  
        }  
    }  
  
    public void start() {  
        System.out.println("..........................start()");
        if (url != null) {  
            try {  
                //JasperPrint obj = (JasperPrint)JRLoader.loadObject(url);
                List<JasperPrint> list = (List<JasperPrint>) JRLoader.loadObject(url);
                System.out.println(list.size());
                for(int i=0;i<list.size();i++){
                    
                    JasperPrintManager.printReport(list.get(i), true); //true:彈出列印機視窗,false不彈出列印機視窗
                }
                //JasperPrintManager.printReport(obj, true);
            } catch (Exception e) {  
                e.printStackTrace();   
            }  
        } else {  
            JOptionPane.showMessageDialog(this, "start():Source URL not specified");  
        }  
    }  
}
           

可以右鍵 Run as -> java Applet  成功則會彈出下面的彈窗。

ireport5.6.0+jasperreports-5.6.0+applet實作用戶端列印

接下來修改 printApplet

ireport5.6.0+jasperreports-5.6.0+applet實作用戶端列印

4.取出printApplet的class檔案,包也帶上。我的是 com.tianjian.report.applet 。

在本地建立一個檔案print。

把 com/tianjian/report/applet/printApplet.class 檔案夾和檔案一起放進來。

然後把 jasperreports-applet-5.6.0.jar 解壓後的檔案全部放入print檔案夾内。

使用指令的方式将這個 print檔案夾重新打成jar包。

在print檔案夾内的位址欄輸入 cmd,

輸入 jar cvf print.jar *   檔案夾内就會有一個print.jar。

現在給print.jar包簽名 以下操作都是在指令視窗執行。

(一).keytool生成證書:keytool -genkey -alias printkey -keystore printstore -validity 3650     (注意:-validity 3650 辨別證書的有效期是10年,如果不寫,預設是3個月。)

(二).keytool導出證書:keytool -export -keystore printstore -alias printkey  -file print.cer      (需要輸入一些資訊,我随便填寫的,會在print檔案夾内生成一個print.cer的檔案,這個檔案名字可以随意取。)

(三).用jarsigner給jar包簽名 :   jarsigner -keystore printstore print.jar printkey 

(jasperreports-5.6.0.jar也要簽名,現在把這個包放到print檔案内,在執行一遍 jarsigner -keystore printstore jasperreports-5.6.0.jar printkey) 不是 這個 jasperreports-applet-5.6.0.jar,看仔細了。

5.  在webapp目錄下建立一個檔案夾 叫applet,(我的項目是maven項目,是以有webapp檔案夾,普通項目就是webRoot檔案夾了)

把所需的jar包 和 剛才簽名的jar包,還有print.cer檔案放進來。jasperreports-applet-5.6.0.jar這個包可以不要了,因為print.jar已經包含這個包了。

ireport5.6.0+jasperreports-5.6.0+applet實作用戶端列印

6.安裝jre_1.8_0_181版本,因為這個版本不會在浏覽器上頻繁的彈出安全提示。下載下傳位址:java.com

安裝完成之後,

在控制台中 點選java  會彈出一個java控制台,選擇 java- 點選檢視 裡面有個清單,把剛才安裝的jre添加進去,勾選,确定。

在 java控制台中 點選 安全 - 裡面有一個"例外站點清單",為了簡單,将我們的項目通路路徑 添加進去例如:localhost:8080/   ; 就把 以localhost:8080/..... 開頭的所有url都設定成例外站點。 點選應用--确定。

設定ie浏覽器,我的是iE11,打開internet選項,

選擇安全,選擇-受信任的站點,-點選 站點-将 http://localhost:8080/位址添加進去,把下面的對該區域中的所有站點要求伺服器驗證(https:)選項去掉。關閉

7.以上都準備好 以後,在jsp中寫個方法

function print(){

var print = document.getElementById("print");
var url="printServlet";

var appletStr='<APPLET ID="JrPrt" CODE="com.tianjian.report.applet.printApplet.class" CODEBASE = "./" ARCHIVE = "applet/xerces-2.9.0.jar, applet/batik-all-1.5.1.jar,applet/batik-dom-1.6-1.jar,applet/batik-svg-dom-1.6-1.jar,applet/commons-digester-2.1.jar,applet/batik-1.1.1.jar,applet/batik-bridge-1.6-1.jar,applet/jasperreports-5.6.0.jar,applet/print.jar,applet/commons-logging-1.1.1.jar,applet/commons-collections-3.2.1.jar" WIDTH = "0" HEIGHT = "0"><PARAM NAME = "type" VALUE="application/x-java-applet;version=1.2.2"><PARAM NAME = "scriptable" VALUE="false"><PARAM NAME = "REPORT_URL" VALUE ="'+url+'"></APPLET>';


print.innerHTML = appletStr;

}
           

寫個onclick事件,調用print方法。成功後會彈出列印機選項視窗。至此 一個applet列印已經做好了。有不足的地方歡迎大家指正。