Wednesday, July 23, 2014

Jasper Applet in Grails

I want to view the report from web browser, something like :

First, download jasper report source project in this article I use jasper 5.6.0 and download from this link : http://sourceforge.net/projects/jasperreports/files/jasperreports/JasperReports%205.6.0/jasperreports-5.6.0-project.zip/download After download extract the file and go to sample directory (jasperreports-5.6.0\demo\samples) from command prompt / shell terminal and compile using ant (ant.apache.org). To compile the sample just run : ant

Copy files from folder jasperreports-5.6.0\demo\samples\webapp\applets :
  • commons-collections-3.2.1.jar
  • commons-logging-1.1.1.jar
  • jasperreports-applet-5.6.0.jar
  • JRViewerSimple.class
  • EmbeddedViewerApplet.class
Copy to web-app\applets folder (in our grails project)

Create a controller that send an octet-stream, my controller : 

import javax.servlet.ServletOutputStream
import net.sf.jasperreports.engine.JasperCompileManager;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;

class LaporanController {

 def dataSource
    

 def embedbarang() {

  String namaFile, reportName, dotJasper
  namaFile = "barang"

      reportName = grailsApplication.getMainContext().getResource('reports/' + namaFile + '.jrxml').file.getAbsoluteFile()
      dotJasper = grailsApplication.getMainContext().getResource('reports/' + namaFile + '.jasper').file.getAbsoluteFile()

  // compiles jrxml
  JasperCompileManager.compileReportToFile(reportName);
  // fills compiled report with parameters and a connection
  // JasperPrint print = JasperFillManager.fillReport(reportName + ".jasper", parameters, connection);
  JasperPrint print = JasperFillManager.fillReport(dotJasper, null, dataSource.getConnection());


  response.setContentType("application/octet-stream");
  ServletOutputStream outputStream = response.getOutputStream();
  
  ObjectOutputStream oos = new ObjectOutputStream(outputStream);
  oos.writeObject(print);
  oos.flush();
  oos.close();

  outputStream.flush();
  outputStream.close();

 }

}
Load the applet from .gsp file :

For copy-paste purpose :
<APPLET  CODE = "EmbeddedViewerApplet.class" codebase="${request.contextPath}/applets"  ARCHIVE = "jasperreports-applet-5.6.0.jar,commons-logging-1.1.1.jar,commons-collections-3.2.1.jar" WIDTH = "100%" HEIGHT = "600"></XMP>
    <PARAM NAME = CODE VALUE = "EmbeddedViewerApplet.class" >
    <PARAM NAME = CODEBASE VALUE = "${request.contextPath}/applets" >
    <PARAM NAME = ARCHIVE VALUE = "jasperreports-applet-5.6.0.jar,commons-logging-1.1.1.jar,commons-collections-2.1.1.jar" >

    <PARAM NAME="type" VALUE="application/x-java-applet;version=1.2.2">
    <PARAM NAME="scriptable" VALUE="false">
    <PARAM NAME = "REPORT_URL" VALUE ="${request.contextPath}/laporan/embedbarang">
</APPLET>



NB:

Sunday, July 20, 2014

Grails using jasper report without plugin

This snippet is used to generate .pdf file and the send the byte array to the browser, so the user can print the .pdf directly to the printer. I use jasper report to generate the .pdf file. My grails version is 2.4.2. First, download the necessary .jar file, I use this version of jar :

  • commons-beanutils-1.9.2.jar
  • commons-collections-3.2.jar
  • commons-digester-2.1.jar
  • commons-logging-1.2.jar
  • itext-2.1.7.jar
  • jasperreports-5.6.0.jar

You can download from this link : https://drive.google.com/file/d/0B3BD2OiyeQ3UQWN2Nk82R1dhYmM/edit?usp=sharing

After download the .jar files, put those .jar file to the /lib folder. Then I use this code in my controller :

import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JRExporter;
import net.sf.jasperreports.engine.JRExporterParameter;
import net.sf.jasperreports.engine.JasperCompileManager;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.export.JRPdfExporter;

class LabController {

    def dataSource
    
    def print() {
     try {
      String reportName, namaFile, dotJasper
      namaFile = "barang"
      reportName = grailsApplication.mainContext.getResource('reports/' + namaFile + '.jrxml').file.getAbsoluteFile()
      dotJasper = grailsApplication.mainContext.getResource('reports/' + namaFile + '.jasper').file.getAbsoluteFile()

      // Report parameter
      Map reportParam = new HashMap()

      // compiles jrxml
      JasperCompileManager.compileReportToFile(reportName);
      // fills compiled report with parameters and a connection
      JasperPrint print = JasperFillManager.fillReport(dotJasper, reportParam, dataSource.getConnection());

      ByteArrayOutputStream  pdfStream = new ByteArrayOutputStream();

      // exports report to pdf
      JRExporter exporter = new JRPdfExporter();
      exporter.setParameter(JRExporterParameter.JASPER_PRINT, print);
      exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, pdfStream); // your output goes here
   
      exporter.exportReport();

     } catch (Exception e) {
   
      throw new RuntimeException("It's not possible to generate the pdf report.", e); 
     } finally {
      render(file: pdfStream.toByteArray(), contentType: 'application/pdf')
     }
    }
}