¿Cómo puedo mostrar las imágenes de un reporte PDF con Jasper Reports en cualquier equipo?

publicado por: Anonymous

Os comento que el siguiente código funciona correctamente…

En el siguiente código se aprecia el controlador “ReportPDF”…

class ReportPDFController {

   def index() {

       File fichero = new File("src/main/webapp/reports/reporteGuiaDocente")

       //Map parametros = new HashMap()
       //parametros.put("path", fichero.getAbsolutePath())

       //compila e imprime el reporte
       JasperReport jReportPortada = JasperCompileManager.compileReport(fichero.getAbsolutePath() + "/portada.jrxml")
       JasperPrint jPrintPortada = JasperFillManager.fillReport(jReportPortada, new HashMap(), new JREmptyDataSource())

       JasperReport jReportIndice = JasperCompileManager.compileReport(fichero.getAbsolutePath() + "/indice.jrxml")
       JasperPrint jPrintIndice = JasperFillManager.fillReport(jReportIndice, new HashMap(), new JREmptyDataSource())

       //Guarda los reportes en un 'ArrayList'
       List<JasperPrint> jPrintList = new ArrayList<JasperPrint>()
       jPrintList.add(jPrintPortada)
       jPrintList.add(jPrintIndice)

       /*Se exporta como 'entrada', la lista de reportes "jPrintList" y se exporta como 'salida', el reporte 'pdf' en
       su respectiva ruta*/
       JRPdfExporter exporter = new JRPdfExporter()
       exporter.setExporterInput(SimpleExporterInput.getInstance(jPrintList))
       exporter.setExporterOutput(new SimpleOutputStreamExporterOutput("/Users/administrador/Documents/reportes/guia_docente.pdf"))

       exporter.exportReport()

       //se configura la exportacion del reporte
       //SimplePdfExporterConfiguration configuration = new SimplePdfExporterConfiguration()
       //configuration.setCreatingBatchModeBookmarks(true)
       //exporter.setConfiguration(configuration)
       //exporter.exportReport()
    }
}

A continuación se muestra la vista index.gsp…

<!DOCTYPE html>
<html>
    <head>

    </head>
    <body>
        <h1>Reportes PDF</h1>
    </body>
</html>

En cuanto al código del reporte (jrxml) “portada” e “índice”…

portada.jrxml

<?xml version="1.0" encoding="UTF-8"?>
<!-- Created with Jaspersoft Studio version 6.3.1.final using JasperReports Library version 6.3.1  -->
<!-- 2017-09-29T18:27:09 -->
<jasperReport xmlns="http://jasperreports.sourceforge.net/jasperreports" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports http://jasperreports.sourceforge.net/xsd/jasperreport.xsd" name="portada" language="groovy" pageWidth="595" pageHeight="842" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" uuid="155b2097-291c-4bc3-a576-8be9d7c925d7">
    <property name="com.jaspersoft.studio.data.defaultdataadapter" value="One Empty Record"/>
    <queryString>
        <![CDATA[]]>
    </queryString>
    <background>
        <band splitType="Stretch"/>
    </background>
    <title>
        <band height="111" splitType="Stretch">
            <frame>
                <reportElement x="10" y="0" width="537" height="111" uuid="11c9a4fb-69f9-4071-a167-4fbd1e4223c4"/>
                <image>
                    <reportElement x="3" y="0" width="531" height="110" uuid="9a130fcc-355e-4758-98ae-2cbea2795ad4"/>
                    <imageExpression ><![CDATA["/Users/administrador/Desktop/ReportPDF/src/main/webapp/reports/reporteGuiaDocente/imagenes/cabecera.png"]]></imageExpression>
                </image>
                <image>
                    <reportElement x="116" y="9" width="310" height="90" uuid="fdeeaeb2-b2e9-4c60-b11b-ce1faaefb10d"/>
                    <imageExpression><![CDATA["/Users/administrador/Desktop/ReportPDF/src/main/webapp/reports/reporteGuiaDocente/imagenes/logo.png"]]></imageExpression>
                </image>
            </frame>
        </band>
    </title>

indice.jrxml

<?xml version="1.0" encoding="UTF-8"?>
<!-- Created with Jaspersoft Studio version 6.3.1.final using JasperReports Library version 6.3.1  -->
<!-- 2017-09-29T18:27:45 -->
<jasperReport xmlns="http://jasperreports.sourceforge.net/jasperreports" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports http://jasperreports.sourceforge.net/xsd/jasperreport.xsd" name="indice" language="groovy" pageWidth="595" pageHeight="842" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" uuid="fb55037e-b80d-4ad2-8ecc-50ebe8884c96">
    <property name="com.jaspersoft.studio.data.defaultdataadapter" value="One Empty Record"/>
    <queryString>
        <![CDATA[]]>
    </queryString>
    <background>
        <band splitType="Stretch"/>
    </background>
    <title>
        <band height="60" splitType="Stretch">
            <frame>
                <reportElement x="10" y="0" width="537" height="54" uuid="30cabdb5-372c-484c-a624-756c4ec6449d"/>
                <image>
                    <reportElement x="370" y="14" width="166" height="16" uuid="d0c62415-c062-4f97-b28b-937ba4b157af"/>
                    <imageExpression><![CDATA["/Users/administrador/Desktop/ReportPDF/src/main/webapp/reports/reporteGuiaDocente/imagenes/cabecera.png"]]></imageExpression>
                </image>
                <textField>
                    <reportElement x="0" y="34" width="537" height="20" forecolor="#9C9C9C" uuid="75defcff-9da0-458a-b952-813cf32922f1"/>
                    <textElement verticalAlignment="Middle">
                        <font fontName="Arial" size="11" isBold="true"/>
                    </textElement>
                    <textFieldExpression><![CDATA["Asignatura"]]></textFieldExpression>
                </textField>
            </frame>
        </band>
    </title>

Los reportes se encuentran en la siguiente ruta del proyecto:

introducir la descripción de la imagen aquí

Como os comenté anteriormente, el código funciona correctamente. Sin embargo hay un detalle a tener en cuenta, la captura de imágenes de los reportes de la portada.jrxml e indice.jrxml se hace mediante una ruta absoluta. A continuación os facilito una parte del código que he puesto anteriormente.

portada.jrxml

<image>
    <reportElement x="3" y="0" width="531" height="110" uuid="9a130fcc-355e-4758-98ae-2cbea2795ad4"/>
    <imageExpression ><![CDATA["/Users/administrador/Desktop/ReportPDF/src/main/webapp/reports/reporteGuiaDocente/imagenes/cabecera.png"]]></imageExpression>
</image>
<image>
    <reportElement x="116" y="9" width="310" height="90" uuid="fdeeaeb2-b2e9-4c60-b11b-ce1faaefb10d"/>
    <imageExpression><![CDATA["/Users/administrador/Desktop/ReportPDF/src/main/webapp/reports/reporteGuiaDocente/imagenes/logo.png"]]></imageExpression>
</image>

indice.jrxml

<image>
    <reportElement x="370" y="14" width="166" height="16" uuid="d0c62415-c062-4f97-b28b-937ba4b157af"/>
    <imageExpression><![CDATA["/Users/administrador/Desktop/ReportPDF/src/main/webapp/reports/reporteGuiaDocente/imagenes/cabecera.png"]]></imageExpression>
</image>

El problema que se presenta con este tipo de ruta, es que las imágenes no podrían mostrarse en otros equipos, puesto que la ruta que he especificado podría no existir.

Alguien sabe… ¿cómo podría añadir una ruta relativa para la captura de imágenes en los reportes “portada.jrxml” y “indice.jrxml” para que se puedan mostrar en cualquier equipo?

solución

Al final, he logrado solucionar el problema de la ruta relativa para las imágenes de los reportes. He creado un proyecto “JasperReports Project” con la aplicación “Jaspersoft studio” cuyo espacio de trabajo (workspace) es “src/main/webapp/reports/” y una carpeta denominada “imágenes” para añadir las imágenes que se van a utilizar en el reporte, tal como se muestra en la siguiente imagen:

introducir la descripción de la imagen aquí

Para los principiantes os recomiendo que echéis un vistazo al tutorial que se muestra a continuación: Tutorial para insertar una imagen JasperReports

A continuación os explicaré las modificaciones que se han hecho para la solucionar el problema;

En el controlador “ReportPDF”, se ha creado un “MAP” para añadir la ruta absoluta donde se encuentra el reporte y de esta forma obtener las imágenes del reporte mediante el paso de parámetros.

File fichero = new File("src/main/webapp/reports/reportesGuiaDocente")

Map parametros = new HashMap()
parametros.put("path", fichero.getAbsolutePath())

//compila e imprime el reporte
JasperReport jReportPortada = JasperCompileManager.compileReport(fichero.getAbsolutePath() + "/portada.jrxml")
JasperPrint jPrintPortada = JasperFillManager.fillReport(jReportPortada, parametros, new JREmptyDataSource())

JasperReport jReportIndice = JasperCompileManager.compileReport(fichero.getAbsolutePath() + "/indice.jrxml")
JasperPrint jPrintIndice = JasperFillManager.fillReport(jReportIndice, parametros, new JREmptyDataSource())

Además se ha implementando la siguiente línea de parámetos en los reportes,
portada.jrxml e indice.jrxml. Para más información acerca de los parámetros de los reportes os recomiendo el siguiente enlace (tutorial parámetros JasperReports)

<parameter name = "path" class = "java.lang.String"/>

Para obtener la ruta relativa de las imágenes de los reportes:

portada.jrxml

<image>
    <reportElement x="3" y="0" width="531" height="110" uuid="9a130fcc-355e-4758-98ae-2cbea2795ad4"/>
    <imageExpression><![CDATA[$P{path} + "/imagenes/cabecera.png"]]></imageExpression>
</image>
<image>
    <reportElement x="116" y="9" width="310" height="90" uuid="fdeeaeb2-b2e9-4c60-b11b-ce1faaefb10d"/>
    <imageExpression><![CDATA[$P{path} + "/imagenes/logo.png"]]></imageExpression>
</image>

indice.jrxml

<image>
    <reportElement x="370" y="14" width="166" height="16" uuid="d0c62415-c062-4f97-b28b-937ba4b157af"/>
    <imageExpression><![CDATA[$P{path} + "/imagenes/cabecera.png"]]></imageExpression>
</image>

A continuación muestro el código un poco más completo acerca de los dos reportes, especificando mediante comentarios, la linea de código que ha sido modificada:

portada.jrxml

<?xml version="1.0" encoding="UTF-8"?>
<!-- Created with Jaspersoft Studio version 6.3.1.final using JasperReports Library version 6.3.1  -->
<!-- 2017-10-01T20:07:06 -->
<jasperReport xmlns="http://jasperreports.sourceforge.net/jasperreports" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports http://jasperreports.sourceforge.net/xsd/jasperreport.xsd" name="portada" language="groovy" pageWidth="595" pageHeight="842" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" uuid="155b2097-291c-4bc3-a576-8be9d7c925d7">
    <property name="com.jaspersoft.studio.data.defaultdataadapter" value="One Empty Record"/>

    //linea modificada
    <parameter name = "path" class = "java.lang.String"/>

    <queryString>
        <![CDATA[]]>
    </queryString>
    <background>
        <band splitType="Stretch"/>
    </background>
    <title>
        <band height="111" splitType="Stretch">
            <frame>
                <reportElement x="10" y="0" width="537" height="111" uuid="11c9a4fb-69f9-4071-a167-4fbd1e4223c4"/>
                <image>
                    <reportElement x="3" y="0" width="531" height="110" uuid="9a130fcc-355e-4758-98ae-2cbea2795ad4"/>
                    //linea modificada
                    <imageExpression><![CDATA[$P{path} + "/imagenes/cabecera.png"]]></imageExpression>
                </image>
                <image>
                    <reportElement x="116" y="9" width="310" height="90" uuid="fdeeaeb2-b2e9-4c60-b11b-ce1faaefb10d"/>
                    //linea modificada
                    <imageExpression><![CDATA[$P{path} + "/imagenes/logo.png"]]></imageExpression>
                </image>
            </frame>
        </band>
    </title>
    ...

indice.jrxml

<?xml version="1.0" encoding="UTF-8"?>
<!-- Created with Jaspersoft Studio version 6.3.1.final using JasperReports Library version 6.3.1  -->
<!-- 2017-10-01T19:45:32 -->
<jasperReport xmlns="http://jasperreports.sourceforge.net/jasperreports" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports http://jasperreports.sourceforge.net/xsd/jasperreport.xsd" name="indice" language="groovy" pageWidth="595" pageHeight="842" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" uuid="fb55037e-b80d-4ad2-8ecc-50ebe8884c96">
    <property name="com.jaspersoft.studio.data.defaultdataadapter" value="One Empty Record"/>

    //linea modificada
    <parameter name = "path" class = "java.lang.String"/>

    <queryString>
        <![CDATA[]]>
    </queryString>
    <background>
        <band splitType="Stretch"/>
    </background>
    <title>
        <band height="60" splitType="Stretch">
            <frame>
                <reportElement x="10" y="0" width="537" height="54" uuid="30cabdb5-372c-484c-a624-756c4ec6449d"/>
                <image>
                    <reportElement x="370" y="14" width="166" height="16" uuid="d0c62415-c062-4f97-b28b-937ba4b157af"/>
                    //linea modificada
                    <imageExpression><![CDATA[$P{path} + "/imagenes/cabecera.png"]]></imageExpression>
                </image>
                <textField>
                    <reportElement x="0" y="34" width="537" height="20" forecolor="#9C9C9C" uuid="75defcff-9da0-458a-b952-813cf32922f1"/>
                    <textElement verticalAlignment="Middle">
                        <font fontName="Arial" size="11" isBold="true"/>
                    </textElement>
                    <textFieldExpression><![CDATA["Asignatura"]]></textFieldExpression>
                </textField>
            </frame>
        </band>
    </title>
    ... 

Espero que esta información les puedan ser útil para los desarrolladores que se estén iniciando con los reportes “JasperReports”.

Respondido por: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *