I am facing an issue with printing and closing Jasper reports in my Struts2
application. Here's a brief overview of the problem:

Description: In my Struts2 web application, I have a requirement to
generate Jasper reports and provide an option to print them directly from
the browser. Additionally, I need to automatically close the browser
tab/window after the report is printed.

Approach: I have tried implementing this functionality using JavaScript to
call an action class where I get jasper report print .

*Here's the JavaScript code on button click which call the action *

 var
url="/Ipd/dischargeManagement/bill_print?billNo="+val2+"&admissionId="+val1;
        var popupWin= window.open(url,'Report','menubar, toolbar,
location=center, directories, status, scrollbars, resizable, dependent,
width=600, height=400 left=210, top=260');

*struts2 action configuration *

 <action name="bill_print" class="com.skims.action.DischargeBillAction"
method="getBillPrint">
            <interceptor-ref name="prepare">
                <param name="excludeMethods">getBillPrint</param>
            </interceptor-ref>
            <result name="success" type="stream">
                <param name="contentType">application/pdf</param>
                <param name="inputName">inputStream</param>
                <param
name="contentDisposition">inline;filename="discharge_bill.pdf"</param>
                 <param name="contentLength">${contentLength}</param>
            </result>
            <result
name="input">/views/DischargeManagement/DischargeBill.jsp</result>

        </action>
*Action in controller*

public String getBillPrint() throws Exception {

            HttpServletResponse response =
ServletActionContext.getResponse();
            HttpServletRequest request = ServletActionContext.getRequest();
            //Connection con = null;
            Map map = new HashMap();
            Connection con=null;

            Session session = null;
            Long admissionId=0l;
            Long billNo=0l;
            String empCode=null;
            String imgPath;
            //String wardName=null;
           System.out.println("formate id==="+dischargeBill.getId());

            try {
                    if(request.getParameter("admissionId")!=null)

 admissionId=Long.parseLong(request.getParameter("admissionId"));
                    if(request.getParameter("billNo")!=null)
                     billNo=Long.parseLong(request.getParameter("billNo"));
                    if(request.getParameter("empCode")!=null)
                     empCode=request.getParameter("empCode");
                session = HibernateUtil.getSessionFactory().openSession();
                SessionImpl sessionImpl = (SessionImpl) session;
                con = sessionImpl.connection();


                String reportPath;

                reportPath =
ServletActionContext.getServletContext().getRealPath("/Reports/DischargeBill.jasper");
                imgPath =
ServletActionContext.getServletContext().getRealPath("/images/logo.jpg");


                map.put("imgPath", imgPath);

                map.put("empCode",empCode);
                map.put("admissionId",admissionId);
                map.put("billNo",billNo);

                //System.out.println("sub report
path==="+ServletActionContext.getServletContext().getRealPath("/Reports").concat("\\"));


map.put("SUBREPORT_DIR",ServletActionContext.getServletContext().getRealPath("/Reports").concat("\\"));
                //
map.put("imgPath",ClassLoader.getSystemResourceAsStream("1LOGO.JPG"));
                //map.put(JRParameter.REPORT_FILE_RESOLVER, new
SimpleFileResolver(reportFile));
                JasperReport jasperReport = (JasperReport)
JRLoader.loadObjectFromFile(reportPath);
                net.sf.jasperreports.engine.JasperPrint jasperPrint =
JasperFillManager.fillReport(jasperReport, map, con);
              //for pdf format



                // Export PDF bytes
            ByteArrayOutputStream byteArrayOutputStream = new
ByteArrayOutputStream();
            JRPdfExporter exporter = new JRPdfExporter();
            exporter.setParameter(JRPdfExporterParameter.JASPER_PRINT,
jasperPrint);
            exporter.setParameter(JRPdfExporterParameter.OUTPUT_STREAM,
byteArrayOutputStream);
            // Add JavaScript code to automatically print the PDF
            String javascript = "this.print({bUI: false, bSilent: true,
bShrinkToFit: true});this.close();";
            exporter.setParameter(JRPdfExporterParameter.PDF_JAVASCRIPT,
javascript);

            exporter.exportReport();

            // Set response headers
            response.setContentType("application/pdf");
            response.setHeader("Content-Disposition", "inline;
filename=discharge_bill.pdf");

            // Write PDF bytes to response output stream

 response.getOutputStream().write(byteArrayOutputStream.toByteArray());
             response.getOutputStream().flush();




            } catch (Exception e) {
                e.printStackTrace(System.out);
            } finally {
                if (con != null) {
                    con.close();
                }
                if (session != null) {
                    session.close();
                }
            }

            return SUCCESS;
        }

I would appreciate any insights, suggestions, or alternative approaches to
achieve reliable printing and closing of Jasper reports in a Struts2.5
application




Warm Regards,

Tanveer Ahmad Alaie,
Computer Associate,
Department of Electronics Communication & Information Technology,
* SKIMS,*
*Soura, Srinagar 190011, J&K (India). Cell: +91-9596044274*

Reply via email to