Creación de un Reporte Web con Imágenes en JasperReports 3.0.0

Partiendo del ejemplo básico modificaremos el archivo pom.xml para que soporte itext 2.0.8 por cuestiones relativas a la compatibilidad de versiones, el archivo modificado sería.

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
 <modelVersion>4.0.0</modelVersion>
 <groupId>jrwebapp</groupId>
 <artifactId>jrwebapp</artifactId>
 <packaging>war</packaging>
 <version>1.0-SNAPSHOT</version>
 <name>jrwebapp Maven Webapp</name>
 <url>http://maven.apache.org</url>
 <dependencies>
 <dependency>
 <groupId>javax.servlet</groupId>
 <artifactId>servlet-api</artifactId>
 <version>2.2</version>
 <scope>provided</scope>
 <optional>true</optional>
 </dependency>
 <dependency>
 <groupId>commons-beanutils</groupId>
 <artifactId>commons-beanutils</artifactId>
 <version>1.7.0</version>
 <scope>compile</scope>
 </dependency>
 <dependency>
 <groupId>commons-collections</groupId>
 <artifactId>commons-collections</artifactId>
 <version>[2.1,)</version>
 <scope>compile</scope>
 </dependency>
 <dependency>
 <groupId>commons-digester</groupId>
 <artifactId>commons-digester</artifactId>
 <version>[1.7,)</version>
 <scope>compile</scope>
 </dependency>
 <dependency>
 <groupId>commons-logging</groupId>
 <artifactId>commons-logging</artifactId>
 <version>[1.0,)</version>
 <scope>compile</scope>
 </dependency>
 <dependency>
 <groupId>eclipse</groupId>
 <artifactId>jdtcore</artifactId>
 <version>[3.1.0,)</version>
 <scope>compile</scope>
 </dependency>
 <dependency>
 <groupId>com.lowagie</groupId>
 <artifactId>itext</artifactId>
 <version>2.0.8</version>
 <scope>compile</scope>
 </dependency>
 <dependency>
 <groupId>jasperreports</groupId>
 <artifactId>jasperreports</artifactId>
 <version>3.0.0</version>
 </dependency>
 <dependency>
 <groupId>mysql</groupId>
 <artifactId>mysql-connector-java</artifactId>
 <version>5.1.6</version>
 </dependency>
 <dependency>
 <groupId>junit</groupId>
 <artifactId>junit</artifactId>
 <version>3.8.1</version>
 <scope>test</scope>
 </dependency>
 </dependencies>
 <build>
 <finalName>jrwebapp</finalName>
 <pluginManagement>
 <plugins>
 <plugin>
 <groupId>org.apache.maven.plugins</groupId>
 <artifactId>maven-compiler-plugin</artifactId>
 <version>2.0.2</version>
 <configuration>
 <source>1.5</source>
 <target>1.5</target>
 </configuration>
 </plugin>
 <plugin>
 <groupId>org.apache.maven.plugins</groupId>
 <artifactId>maven-eclipse-plugin</artifactId>
 <version>2.4</version>
 <configuration>
 <downloadSources>false</downloadSources>
 <wtpversion>1.5</wtpversion>
 </configuration>
 </plugin>
 </plugins>
 </pluginManagement>
 </build>
</project>

En la consola ejecutamos los comandos:

mvn clean install

Luego

mvn eclipse:clean eclipse:eclipse

Creamos el archivo detObjMet.jrxml cuyo contenido es el siguiente:

<?xml version="1.0" encoding="UTF-8"  ?>
 <!-- Created with iReport - A designer for JasperReports -->
 <!DOCTYPE jasperReport PUBLIC "//JasperReports//DTD Report Design//EN" "http://jasperreports.sourceforge.net/dtds/jasperreport.dtd">
 <jasperReport
 name="detObjMet"
 columnCount="1"
 printOrder="Vertical"
 orientation="Landscape"
 pageWidth="842"
 pageHeight="595"
 columnWidth="782"
 columnSpacing="0"
 leftMargin="30"
 rightMargin="30"
 topMargin="20"
 bottomMargin="20"
 whenNoDataType="NoPages"
 isTitleNewPage="false"
 isSummaryNewPage="false">
 <property name="ireport.scriptlethandling" value="0" />
 <property name="ireport.encoding" value="UTF-8" />
 <import value="java.util.*" />
 <import value="net.sf.jasperreports.engine.*" />
 <import value="net.sf.jasperreports.engine.data.*" />
<parameter name="logoPath" isForPrompting="false"/>
 <parameter name="ukasPath" isForPrompting="false"/>
 <parameter name="sgsPath" isForPrompting="false"/>
<field name="course_id"/>
 <field name="name"/>
 <field name="course"/>
<background>
 <band height="0"  isSplitAllowed="true" >
 </band>
 </background>
 <title>
 <band height="50"  isSplitAllowed="true" >
 <image  evaluationTime="Now" hyperlinkType="None"  hyperlinkTarget="Self" >
 <reportElement
 x="0"
 y="0"
 width="220"
 height="34"
 key="image-1"/>
 <box></box>
 <graphicElement stretchType="NoStretch"/>
 <imageExpression><![CDATA[$P{logoPath}]]></imageExpression>
 </image>
 </band>
 </title>
 <pageHeader>
 <band height="40"  isSplitAllowed="true" >
 <textField isStretchWithOverflow="false" pattern="dd MMM yy" isBlankWhenNull="false" evaluationTime="Report" hyperlinkType="None"  hyperlinkTarget="Self" >
 <reportElement
 x="683"
 y="0"
 width="100"
 height="18"
 key="textField"/>
 <box></box>
 <textElement>
 <font/>
 </textElement>
 <textFieldExpression  ><![CDATA[new java.util.Date()]]></textFieldExpression>
 </textField>
 </band>
 </pageHeader>
 <columnHeader>
 <band height="20"  isSplitAllowed="true" >
 </band>
 </columnHeader>
 <detail>
 <band height="20"  isSplitAllowed="true" >
 <textField isStretchWithOverflow="false" isBlankWhenNull="false" evaluationTime="Now" hyperlinkType="None"  hyperlinkTarget="Self" >
 <reportElement
 x="0"
 y="0"
 width="160"
 height="20"
 key="textField-1"/>
 <box></box>
 <textElement verticalAlignment="Middle">
 <font fontName="Arial" size="9"/>
 </textElement>
 <textFieldExpression  ><![CDATA[$F{course_id}]]></textFieldExpression>
 </textField>
 <textField isStretchWithOverflow="false" isBlankWhenNull="false" evaluationTime="Now" hyperlinkType="None"  hyperlinkTarget="Self" >
 <reportElement
 x="160"
 y="0"
 width="160"
 height="20"
 key="textField-2"/>
 <box></box>
 <textElement verticalAlignment="Middle">
 <font fontName="Arial" size="9"/>
 </textElement>
 <textFieldExpression  ><![CDATA[$F{course}]]></textFieldExpression>
 </textField>
 <textField isStretchWithOverflow="false" isBlankWhenNull="false" evaluationTime="Now" hyperlinkType="None"  hyperlinkTarget="Self" >
 <reportElement
 x="320"
 y="0"
 width="60"
 height="20"
 key="textField-3"/>
 <box></box>
 <textElement verticalAlignment="Middle">
 <font fontName="Arial" size="9"/>
 </textElement>
 <textFieldExpression  ><![CDATA[$F{name}]]></textFieldExpression>
 </textField>
 </band>
 </detail>
 <columnFooter>
 <band height="47"  isSplitAllowed="true" >
 <image  evaluationTime="Now" hyperlinkType="None"  hyperlinkTarget="Self" >
 <reportElement
 x="735"
 y="0"
 width="47"
 height="44"
 key="image-2"/>
 <box></box>
 <graphicElement stretchType="NoStretch"/>
 <imageExpression><![CDATA[$P{ukasPath}]]></imageExpression>
 </image>
 <image  evaluationTime="Now" hyperlinkType="None"  hyperlinkTarget="Self" >
 <reportElement
 x="657"
 y="0"
 width="63"
 height="47"
 key="image-3"/>
 <box></box>
 <graphicElement stretchType="NoStretch"/>
 <imageExpression><![CDATA[$P{sgsPath}]]></imageExpression>
 </image>
 </band>
 </columnFooter>
 <pageFooter>
 <band height="50"  isSplitAllowed="true" >
 </band>
 </pageFooter>
 <lastPageFooter>
 <band height="50"  isSplitAllowed="true" >
 </band>
 </lastPageFooter>
 <summary>
 <band height="50"  isSplitAllowed="true" >
 </band>
 </summary>
 </jasperReport>

Agregamos una carpeta images dentro de la carpeta webapp, la estructura seria la siguiente:

Web Application's Estructure

Web Application's Estructure

Modificamos el método execute de JRServlet y quedaría así:

    protected void service(HttpServletRequest request,
            HttpServletResponse response) throws ServletException, IOException {
        try {
            Connection con;
            Statement stm;
            ResultSet rs;

            String jdbcDriver = "com.mysql.jdbc.Driver";
            Class.forName(jdbcDriver);
            String jdbcUrl = "jdbc:mysql://localhost:3306/course?user=root";
            con = DriverManager.getConnection(jdbcUrl);

            String query = "SELECT COURSE_ID, NAME, COURSE FROM COURSE";
            stm = con.createStatement();
            rs = stm.executeQuery(query);

            JRResultSetDataSource jrds = new JRResultSetDataSource(rs);

            ServletContext sc = getServletConfig().getServletContext();
            String jrxmlPath = "/WEB-INF/classes/reports/detObjMet.jrxml";
            String jasperPath = "/WEB-INF/classes/reports/detObjMet.jasper";

            InputStream is = sc.getResourceAsStream(jasperPath);

            if (is == null) {
                String rp = sc.getRealPath(jrxmlPath);
                JasperCompileManager.compileReportToFile(rp);
                is = sc.getResourceAsStream(jasperPath);
            }

            String vlogoPath = "/images/logo_home_2.jpg";
            String logoPath = sc.getRealPath(vlogoPath);
            String vukasPath = "/images/ukas.gif";
            String ukasPath = sc.getRealPath(vukasPath);
            String vsgsPath = "/images/sgs.gif";
            String sgsPath = sc.getRealPath(vsgsPath);
            HashMap<String, String> params = new HashMap<String, String>();
            params.put("logoPath", logoPath);
            params.put("ukasPath", ukasPath);
            params.put("sgsPath", sgsPath);

            ServletOutputStream sos = response.getOutputStream();
            JasperRunManager.runReportToPdfStream(is, sos, params, jrds);

            response.setContentType("application/pdf");
            sos.flush();
            sos.close();

        } catch (JRException e) {
            StringWriter sw = new StringWriter();
            PrintWriter pw = new PrintWriter(sw);
            e.printStackTrace(pw);
            response.setContentType("text/plain");
            response.getOutputStream().print(sw.toString());
        } catch (ClassNotFoundException e) {
            StringWriter sw = new StringWriter();
            PrintWriter pw = new PrintWriter(sw);
            e.printStackTrace(pw);
            response.setContentType("text/plain");
            response.getOutputStream().print(sw.toString());
        } catch (SQLException e) {
            StringWriter sw = new StringWriter();
            PrintWriter pw = new PrintWriter(sw);
            e.printStackTrace(pw);
            response.setContentType("text/plain");
            response.getOutputStream().print(sw.toString());
        }

    }

Finalmente ejecutamos la aplicación y el resultado sería:

Web Reports with Images

Web Reports with Images

package com.rab.ctrl;import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.HashMap;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JRResultSetDataSource;
import net.sf.jasperreports.engine.JasperCompileManager;
import net.sf.jasperreports.engine.JasperRunManager;

/**
* Servlet implementation class JRServlet
*/
public class JRServlet extends HttpServlet {
private static final long serialVersionUID = 1L;

/**
* @see HttpServlet#HttpServlet()
*/
public JRServlet() {
super();
// TODO Auto-generated constructor stub
}

/**
* @see HttpServlet#service(HttpServletRequest request, HttpServletResponse
*      response)
*/
protected void service(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
try {
Connection con;
Statement stm;
ResultSet rs;

String jdbcDriver = “com.mysql.jdbc.Driver”;
Class.forName(jdbcDriver);
String jdbcUrl = “jdbc:mysql://localhost:3306/course?user=root”;
con = DriverManager.getConnection(jdbcUrl);

String query = “SELECT COURSE_ID, NAME, COURSE FROM COURSE”;
stm = con.createStatement();
rs = stm.executeQuery(query);

JRResultSetDataSource jrds = new JRResultSetDataSource(rs);

ServletContext sc = getServletConfig().getServletContext();
String jrxmlPath = “/WEB-INF/classes/reports/detObjMet.jrxml”;
String jasperPath = “/WEB-INF/classes/reports/detObjMet.jasper”;

InputStream is = sc.getResourceAsStream(jasperPath);

if (is == null) {
String rp = sc.getRealPath(jrxmlPath);
JasperCompileManager.compileReportToFile(rp);
is = sc.getResourceAsStream(jasperPath);
}

String vlogoPath = “/images/logo_home_2.jpg”;
String logoPath = sc.getRealPath(vlogoPath);
String vukasPath = “/images/ukas.gif”;
String ukasPath = sc.getRealPath(vukasPath);
String vsgsPath = “/images/sgs.gif”;
String sgsPath = sc.getRealPath(vsgsPath);
HashMap<String, String> params = new HashMap<String, String>();
params.put(“logoPath”, logoPath);
params.put(“ukasPath”, ukasPath);
params.put(“sgsPath”, sgsPath);

ServletOutputStream sos = response.getOutputStream();
JasperRunManager.runReportToPdfStream(is, sos, params, jrds);

response.setContentType(“application/pdf”);
sos.flush();
sos.close();

} catch (JRException e) {
StringWriter sw = new StringWriter();
PrintWriter pw = new PrintWriter(sw);
e.printStackTrace(pw);
response.setContentType(“text/plain”);
response.getOutputStream().print(sw.toString());
} catch (ClassNotFoundException e) {
StringWriter sw = new StringWriter();
PrintWriter pw = new PrintWriter(sw);
e.printStackTrace(pw);
response.setContentType(“text/plain”);
response.getOutputStream().print(sw.toString());
} catch (SQLException e) {
StringWriter sw = new StringWriter();
PrintWriter pw = new PrintWriter(sw);
e.printStackTrace(pw);
response.setContentType(“text/plain”);
response.getOutputStream().print(sw.toString());
}

}

/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse
*      response)
*/
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
}

/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
*      response)
*/
protected void doPost(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
}

}

Etiquetas:

Una respuesta to “Creación de un Reporte Web con Imágenes en JasperReports 3.0.0”

  1. elmerdeve Says:

    Hola! En principio, excelente blog!
    Quería consultarte si sabes de donde puedo obtener las correspondencias de versiones entre jasperreports y dynamicjasper, ya que estoy teniendo un problema que no puedo resolver: En el pom no puedo ingresar una versión de dynamicjasper que sea compatible con la 5.1.0 de jasperreports… Agregue la versión de dynamicjasper que agregue, se me rompe el proyecto al compilarlo… Te agradezco si me podés dar una mano.
    Saludos, Hernán!

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s


A %d blogueros les gusta esto: