Search code examples
javaspring-mvcspring-bootjasper-reports

Send generated report as email attachment in SpringBoot


I want to be able to send report generated with JasperReports as attachment. Currently in my application I am able to view the report using JasperReportsViewResolver below is my configuration

@Bean
public JasperReportsViewResolver getJasperReportsViewResolver() {
  JasperReportsViewResolver resolver = new JasperReportsViewResolver();
  resolver.setPrefix("classpath:/static/jasper/");
  resolver.setSuffix(".jrxml");
  resolver.setReportDataKey("datasource");
  resolver.setViewNames("rpt_*");
  resolver.setViewClass(JasperReportsMultiFormatView.class);
  resolver.setOrder(0);
  return resolver;
}  

I was not able to get the input resource from this viewresolver so below is the idea I'm thinking of but I'm not sure it is the best way

 JasperDesign jasperDesign =  JRXmlLoader.load(getClass().getResourceAsStream("/jasper/rpt_media.jrxml"));
 JasperReport report = JasperCompileManager.compileReport(jasperDesign);
 JRDataSource reportData = new JREmptyDataSource();

 Map<String, Object> parameters = new HashMap<String, Object>();
 parameters.put("reportTitle", "dfa dafdf d dfd");

 OutputStream stream = new FileOutputStream(tempfile);

 JasperReportsUtils.renderAsPdf(report, parameters, reportData, stream);

after saving the report to random file I do read it and send as attachment.

Any other suggestion?


Solution

  • I found the below to be the best way

        JRDataSource ds = new JRBeanCollectionDataSource(reportList);
    
        Resource report = new ClassPathResource("static/jasper/rpt_report.jasper");
    
        JasperPrint jasperPrint = JasperFillManager.fillReport(report.getInputStream(), Collections.EMPTY_MAP,ds);
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        JasperExportManager.exportReportToPdfStream(jasperPrint, baos);
        DataSource aAttachment =  new ByteArrayDataSource(baos.toByteArray(), "application/pdf");
    
        MimeMessage message = mailSender.createMimeMessage();
        MimeMessageHelper helper = new MimeMessageHelper(message);
    
        helper.setTo("xxxxxx");
    
        helper.setFrom("xxxxx");
        helper.setSubject("Testing Email");
    
        String text = "Testing Email";
    
        helper.setText(text, false);
    
        helper.addAttachment("report.pdf",aAttachment);
    
        mailSender.send(message);