0

My requirement: Download a generated pdf report in client side using restApi with jasper report template(.jrxml file)

I am creating reports using jasper report integrate with spring boot. I need to print pdf file for that i created the rest api.The code looks like

@PostMapping("/client-projects")
public void clientProject(@RequestParam String format,@RequestBody List<ProjectReportModel> project,HttpServletResponse response)  {
    
       report.clientProjectReport(format,response,project);
         
    }

service class looks like this

 public void clientProjectReport(String format,List<ProjectReportModel> project,HttpServletResponseresponse){
    
    InputStream stream = this.getClass().getResourceAsStream("/clientProject.jrxml");
    JasperReport report = JasperCompileManager.compileReport(stream);
    JRBeanCollectionDataSource source = new JRBeanCollectionDataSource(project);
    JasperPrint print = JasperFillManager.fillReport(report, null, source);
    if(format.equals("pdf")){
        JasperExportManager.exportReportToPdfStream(print, response.getOutputStream());
         response.setContentType("application/pdf");
         response.addHeader("Content-Disposition", "inline; filename=jasper.pdf;");
    }

Everything works fine when i run the code in the local but when i deploy the code in server(GCP) i faced the following error

java.lang.IllegalArgumentException: name
at java.base/jdk.internal.loader.URLClassPath$Loader.findResource(URLClassPath.java:600) ~[na:na]
at java.base/jdk.internal.loader.URLClassPath.findResource(URLClassPath.java:291) ~[na:na]
at java.base/java.net.URLClassLoader$2.run(URLClassLoader.java:655) ~[na:na]
at java.base/java.net.URLClassLoader$2.run(URLClassLoader.java:653) ~[na:na]
at java.base/java.security.AccessController.doPrivileged(Native Method) ~[na:na]
at java.base/java.net.URLClassLoader.findResource(URLClassLoader.java:652) ~[na:na]
at org.springframework.boot.loader.LaunchedURLClassLoader.findResource(LaunchedURLClassLoader.java:100) ~[app.jar:0.0.1-SNAPSHOT]
at java.base/java.lang.ClassLoader.getResource(ClassLoader.java:1401) ~[na:na]
at org.apache.catalina.loader.WebappClassLoaderBase.getResource(WebappClassLoaderBase.java:1048) ~[tomcat-embed-core-9.0.39.jar!/:9.0.39]
at net.sf.jasperreports.engine.util.JRResourcesUtil.findClassLoaderResource(JRResourcesUtil.java:457) ~[jasperreports-6.6.0.jar!/:6.6.0]
at net.sf.jasperreports.repo.DefaultRepositoryService.getInputStream(DefaultRepositoryService.java:131) ~[jasperreports-6.6.0.jar!/:6.6.0]
at net.sf.jasperreports.repo.InputStreamPersistenceService.load(InputStreamPersistenceService.java:51) ~[jasperreports-6.6.0.jar!/:6.6.0]
at net.sf.jasperreports.repo.DefaultRepositoryService.getResource(DefaultRepositoryService.java:196) ~[jasperreports-6.6.0.jar!/:6.6.0]
at net.sf.jasperreports.repo.RepositoryUtil.findInputStream(RepositoryUtil.java:195) ~[jasperreports-6.6.0.jar!/:6.6.0]
at net.sf.jasperreports.repo.RepositoryUtil.getBytesFromLocation(RepositoryUtil.java:211) ~[jasperreports-6.6.0.jar!/:6.6.0]
at net.sf.jasperreports.renderers.util.RendererUtil.getNonLazyRenderable(RendererUtil.java:179) ~[jasperreports-6.6.0.jar!/:6.6.0]
at net.sf.jasperreports.engine.fill.JRFillImage.evaluateImage(JRFillImage.java:564) ~[jasperreports-6.6.0.jar!/:6.6.0]
at net.sf.jasperreports.engine.fill.JRFillImage.evaluate(JRFillImage.java:489) ~[jasperreports-6.6.0.jar!/:6.6.0]
at net.sf.jasperreports.engine.fill.JRFillElementContainer.evaluate(JRFillElementContainer.java:383) ~[jasperreports-6.6.0.jar!/:6.6.0]
at net.sf.jasperreports.engine.fill.JRFillBand.evaluate(JRFillBand.java:548) ~[jasperreports-6.6.0.jar!/:6.6.0]
at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillTitle(JRVerticalFiller.java:323) ~[jasperreports-6.6.0.jar!/:6.6.0]
at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillReportStart(JRVerticalFiller.java:256) ~[jasperreports-6.6.0.jar!/:6.6.0]
at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillReport(JRVerticalFiller.java:110) ~[jasperreports-6.6.0.jar!/:6.6.0]
at net.sf.jasperreports.engine.fill.JRBaseFiller.fill(JRBaseFiller.java:615) ~[jasperreports-6.6.0.jar!/:6.6.0]
at net.sf.jasperreports.engine.fill.BaseReportFiller.fill(BaseReportFiller.java:432) ~[jasperreports-6.6.0.jar!/:6.6.0]
at net.sf.jasperreports.engine.fill.JRFiller.fill(JRFiller.java:162) ~[jasperreports-6.6.0.jar!/:6.6.0]
at net.sf.jasperreports.engine.fill.JRFiller.fill(JRFiller.java:145) ~[jasperreports-6.6.0.jar!/:6.6.0]
at net.sf.jasperreports.engine.JasperFillManager.fill(JasperFillManager.java:689) ~[jasperreports-6.6.0.jar!/:6.6.0]
at net.sf.jasperreports.engine.JasperFillManager.fillReport(JasperFillManager.java:1005) ~[jasperreports-6.6.0.jar!/:6.6.0]
at com.yenmin.proton.report.service.ReportService.clientProjectReport(ReportService.java:135) ~[classes!/:0.0.1-SNAPSHOT]
at com.yenmin.proton.report.controller.ReportController.clientProject(ReportController.java:42) ~[classes!/:0.0.1-SNAPSHOT]
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:na]
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
at java.base/java.lang.reflect.Method.invoke(Method.java:566) ~[na:na]
at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:197) ~[spring-web-5.3.1.jar!/:5.3.1]
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:141) ~[spring-web-5.3.1.jar!/:5.3.1]

It didn't fill the report ,there it got error don't know why this error occurs we are using docker also while deploying the code in gcp.

If i create a file as tmp file like

  File pdfFile = File.createTempFile("jasper", ".pdf");
    
        try(FileOutputStream pos = new FileOutputStream(pdfFile))
        {
            final JasperReport report = loadTemplate();
            JRBeanCollectionDataSource source = new JRBeanCollectionDataSource(project);
            System.out.println("Fill report error");
            JasperReportsUtils.renderAsPdf(report, null, source, pos);
        
                       
        }
        catch (final Exception e)
        {
            LOG.error(e.getLocalizedMessage(), e);
            
        }
       return pdfFile;
        
  }
 private JasperReport loadTemplate() throws JRException {

 final InputStream reportInputStream = getClass().getResourceAsStream("/clientproject.jrxml");
 final JasperDesign jasperDesign = JRXmlLoader.load(reportInputStream);
 return JasperCompileManager.compileReport(jasperDesign);
        }

everything works but dont know where the files are saved.but file path looks likes "/tmp/client065346395.pdf" i am not clear with how to retrieve the file from tmp folder.

kindly let me know how to resolve this issue or provide me some useful links... Thanks in advance

0 Answers0