Search code examples
javajspjasper-reportsservlet-3.0

Is it possible to use jasper report with java to make it like a popup coming in the browser window?


I am using Jasper report with java. I want to make the export file ask for the location to download when launching it as web app.

What i am doing now is. I am giving a path for the file(PDF,DOCX,XLS) to be exported in a location. What i need is, the browser should make a popup and ask for the file location to be downloaded just like firefox.

I've done it in a java application, by providing a path,

Connection conn = null;
    ResultSet rs = null;
    JasperReport jasperReport = null;
    JasperPrint print = null;
    String filename = "Report.pdf";
    String query = "{CALL get_report_data()}";
    try {
        if (conn == null) 
        {
            String hostName = "localhost";
            String dbName = "test";
            String userName = "root";
            String password = "root";
            try {
                Class.forName("com.mysql.cj.jdbc.Driver");
                String connectionURL = "jdbc:mysql://" + hostName + ":3306/" + dbName;
                conn = DriverManager.getConnection(connectionURL, userName, password);
            } catch (Exception e) {
                System.out.println(e);
            }
        }
        CallableStatement cstmt = conn.prepareCall(query);

        rs = cstmt.executeQuery();

        JRResultSetDataSource resultSetDataSource = new JRResultSetDataSource(rs);

        jasperReport = JasperCompileManager
                .compileReport("E:\\Eclipse 2019-03 Workspace\\Report\\static_land_report.jrxml");

        Map<String, Object> parameters = new HashMap<String, Object>();

        print = JasperFillManager.fillReport(jasperReport, parameters, resultSetDataSource);

JasperExportManager.exportReportToPdfFile(print, "E:\Eclipse 2019-03 Workspace\Report\static_land_report.pdf");

Now, i want the above code to be done in web app, and without providing the path.


Solution

  • thanks for reaching out. But, i found a solution.

    package com.report.java;
    
    import java.io.ByteArrayOutputStream;
    import java.io.IOException;
    import java.io.OutputStream;
    import java.sql.CallableStatement;
    import java.sql.Connection;
    import java.sql.ResultSet;
    import java.util.HashMap;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import net.sf.jasperreports.engine.JRResultSetDataSource;
    import net.sf.jasperreports.engine.JasperCompileManager;
    import net.sf.jasperreports.engine.JasperFillManager;
    import net.sf.jasperreports.engine.JasperPrint;
    import net.sf.jasperreports.engine.JasperReport;
    import net.sf.jasperreports.engine.export.JRPdfExporter;
    import net.sf.jasperreports.export.SimpleExporterInput;
    import net.sf.jasperreports.export.SimpleOutputStreamExporterOutput;
    
    public class PdfReportDownload extends HttpServlet {
        private static final long serialVersionUID = 1L;
    
        public PdfReportDownload() {
            super();
        }
    
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            try 
            {
                generatePdfReport(response);
            } 
            catch (Exception e) {
                e.printStackTrace();
            }
    
        }
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            doGet(request, response);
        }
    
        public void generatePdfReport(HttpServletResponse response) 
        {
            try 
            {
                Connection conn=null;
                ResultSet rs=null;
                JasperReport jasperReport = null;
                String query ="{CALL get_report_data()}";
                try 
                {   
                    if(conn==null)
                    {
                        try 
                        {
                            conn= MySQLConnection.getConnection();
    
                        } 
                        catch (Exception ex) {
                            ex.printStackTrace();
                        }
                    }   
                CallableStatement cstmt = conn.prepareCall(query);
    
                rs = cstmt.executeQuery();
    
                JRResultSetDataSource resultSetDataSource = new JRResultSetDataSource(rs);  
    
                jasperReport = JasperCompileManager.compileReport("E:\\Eclipse 2019-03 Workspace\\Report_Download\\static_land_report.jrxml");
                JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, new HashMap <String, Object>(), resultSetDataSource);
    
                JRPdfExporter pdfExporter = new JRPdfExporter();
                pdfExporter.setExporterInput(new SimpleExporterInput(jasperPrint));
                ByteArrayOutputStream pdfReportStream = new ByteArrayOutputStream();
                pdfExporter.setExporterOutput(new SimpleOutputStreamExporterOutput(pdfReportStream));
                pdfExporter.exportReport();
    
                response.setContentType("application/pdf");
                response.setHeader("Content-Length", String.valueOf(pdfReportStream.size()));
                response.addHeader("Content-Disposition", "attachment; filename=Report.pdf;");
    
                OutputStream responseOutputStream = response.getOutputStream();
                responseOutputStream.write(pdfReportStream.toByteArray());
                responseOutputStream.close();
                pdfReportStream.close();
            } 
            catch (Exception e) 
            {
                    System.out.println(e);
            }
            }
            catch(Exception e) 
            {
                System.out.println(e);
            }
        }
    
    }
    

    On invoking this servlet, the report gets download