如何使用数据适配器将jasper报告导出为pdf,该数据适配器将类中的字段作为数据源

时间:2017-06-13 15:19:51

标签: java jasper-reports export-to-pdf

我搜索了很多,我是jasper报道的新手。 我创建了一个简单的jasper报告项目(在jaspersoft studio中),该报告从DataAdapter.xml中获取数据,我将其作为JRDataSource"的自定义实现创建。作为工厂类,我写了这个:

package mydapackage;

import java.math.BigInteger;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.Random;

import net.sf.jasperreports.engine.JRDataSource;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JRField;

public class MyImplementation implements JRDataSource {


    static DateTimeFormatter dtf = DateTimeFormatter.ofPattern("dd MMMM yyyy");
    static LocalDate localDate = LocalDate.now();
    static Random random = new Random();
    static String codigoVer = new BigInteger(50, random).toString(32);

    private static final Integer[] FOJAS_ARRAY = { 25 };
    private static final Integer[] NUMEROTITULO_ARRAY = { 86 };
    private static final Integer[] ANOTITULO_ARRAY = { 2009 };
    private static final String[] REGISTRO_ARRAY = { "Propiedad" };
    private static final String[] VIGENCIA_ARRAY = { "Con Vigencia" };
    private static final Integer[] PRECIO_ARRAY = { 5000 };
    private static final String[] FECHA_ARRAY = { dtf.format(localDate) };
    private static final Integer[] ANOACTUAL_ARRAY = { 2017 };
    private static final String[] BOLETA_ARRAY = { "78965458" };
    private static final String[] ALEATORIO  = { codigoVer };

    private int counter = -1;

    @Override
    public boolean next() throws JRException {
        if (counter < FOJAS_ARRAY.length - 1) {
            counter++;
            return true;
        }
        return false;
    }

    @Override
    public Object getFieldValue(JRField jrField) throws JRException {
        if (jrField.getName().equals("FOJAS"))return FOJAS_ARRAY[counter];
        else if (jrField.getName().equals("NUMEROTITULO"))return NUMEROTITULO_ARRAY[counter];
        else if (jrField.getName().equals("ANOTITULO"))return ANOTITULO_ARRAY[counter];
        else if (jrField.getName().equals("REGISTRO"))return REGISTRO_ARRAY[counter];
        else if (jrField.getName().equals("VIGENCIA"))return VIGENCIA_ARRAY[counter];
        else if (jrField.getName().equals("PRECIO"))return PRECIO_ARRAY[counter];
        else if (jrField.getName().equals("FECHA"))return FECHA_ARRAY[counter];
        else if (jrField.getName().equals("ANOACTUAL"))return ANOACTUAL_ARRAY[counter];
        else if (jrField.getName().equals("BOLETA"))return BOLETA_ARRAY[counter];   
        else if (jrField.getName().equals("COD_VERIFICACION"))return ALEATORIO[counter];
        return "";
    }

    public static JRDataSource getDataSource() {
        return new MyImplementation();
    }
}

我的数据适配器名称只是&#34; DataAdapter.xml&#34; 我的碧玉报告文件名是:&#34; caratula.jrxml&#34;这是代码:

<?xml version="1.0" encoding="UTF-8"?>
<!-- Created with Jaspersoft Studio version 6.3.1.final using JasperReports Library version 6.3.1  -->
<!-- 2017-06-13T11:11:43 -->
<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="caratula_def" language="groovy" pageWidth="612" pageHeight="935" columnWidth="556" leftMargin="28" rightMargin="28" topMargin="28" bottomMargin="28" uuid="3617c6de-583f-41d0-bc9a-92ec55a4cddb">
    <property name="com.jaspersoft.studio.data.defaultdataadapter" value="DataAdapter.xml"/>
    <property name="ireport.zoom" value="1.5"/>
    <property name="ireport.x" value="0"/>
    <property name="ireport.y" value="488"/>
    <field name="FOJAS" class="java.lang.Integer"/>
    <field name="NUMEROTITULO" class="java.lang.Integer"/>
    <field name="ANOTITULO" class="java.lang.Integer"/>
    <field name="REGISTRO" class="java.lang.String"/>
    <field name="VIGENCIA" class="java.lang.String"/>
    <field name="PRECIO" class="java.lang.Integer"/>
    <field name="FECHA" class="java.lang.String"/>
    <field name="ANOACTUAL" class="java.lang.Integer"/>
    <field name="BOLETA" class="java.lang.String"/>
    <field name="COD_VERIFICACION" class="java.lang.String"/>
    <background>
        <band splitType="Stretch"/>
    </background>
    <title>
        <band splitType="Stretch"/>
    </title>
    <pageHeader>
        <band splitType="Stretch"/>
    </pageHeader>
    <columnHeader>
        <band splitType="Stretch"/>
    </columnHeader>
    <detail>
        <band height="799" splitType="Stretch">
            <image>
                <reportElement x="137" y="267" width="287" height="260" uuid="46f3298b-64ec-4179-880e-4b5f40dd71f2"/>
                <imageExpression><![CDATA["C:\\firma\\ESCUDO.png"]]></imageExpression>
            </image>
            <rectangle>
                <reportElement mode="Transparent" x="51" y="69" width="453" height="619" uuid="e6f767f1-8f41-4f03-9bc0-9d6126b8e23e"/>
            </rectangle>
            <image>
                <reportElement x="51" y="82" width="123" height="111" uuid="98fec185-0f0b-44de-bd5e-de0cdd7c79cb"/>
                <imageExpression><![CDATA["C:\\firma\\conservador-logo-of.png"]]></imageExpression>
            </image>
            <staticText>
                <reportElement x="251" y="692" width="253" height="40" uuid="73f3aa14-49a6-47fa-a6e6-46d659d76239"/>
                <textElement textAlignment="Justified">
                    <font size="6"/>
                </textElement>
                <text><![CDATA[Documento incorpora firma electrónica avanzada conforme a Ley N°19.799.
La vigencia de la firma electrónica en el documento, al igual que la integridad y autenticidad del mismo, deben ser verificados en www.conservadortemuco.cl, donde estará disponible por 90 días contados desde la fecha de su emisión.
Documento impreso es sólo una copia del documento original.]]></text>
            </staticText>
            <staticText>
                <reportElement x="162" y="100" width="335" height="28" uuid="fbdf830f-a257-4aee-997b-86cdd2dd39b2"/>
                <textElement textAlignment="Right">
                    <font size="16" isBold="true"/>
                </textElement>
                <text><![CDATA[Conservador de Bienes Raíces de Temuco]]></text>
            </staticText>
            <staticText>
                <reportElement x="342" y="124" width="155" height="12" uuid="caafa104-4346-4480-be66-e52999cc1d00"/>
                <textElement textAlignment="Right">
                    <font size="8"/>
                </textElement>
                <text><![CDATA[Vicuña Mackenna 0361, Temuco]]></text>
            </staticText>
            <staticText>
                <reportElement x="334" y="135" width="163" height="13" uuid="a69883f2-c2f0-43d8-a51b-94e1301d594d"/>
                <textElement textAlignment="Right">
                    <font size="8"/>
                </textElement>
                <text><![CDATA[http://www.conservadortemuco.cl]]></text>
            </staticText>
            <textField isBlankWhenNull="true">
                <reportElement x="91" y="225" width="251" height="23" uuid="6fc40966-65db-4d96-b741-fb7688154b8b"/>
                <textElement>
                    <font size="16" isBold="true"/>
                </textElement>
                <textFieldExpression><![CDATA["Registro de "+$F{REGISTRO}]]></textFieldExpression>
            </textField>
            <textField>
                <reportElement x="91" y="267" width="243" height="23" uuid="f5d27d27-0d48-4673-b9c3-76458ddae2a3"/>
                <textElement>
                    <font size="16" isBold="true"/>
                </textElement>
                <textFieldExpression><![CDATA["Copia "+$F{VIGENCIA}]]></textFieldExpression>
            </textField>
            <textField pattern="dd/MMMMM/yyyy">
                <reportElement x="91" y="332" width="380" height="170" uuid="1b0f23cc-a19b-4e48-b59b-d05c3a804a8c"/>
                <textElement textAlignment="Justified">
                    <font size="12"/>
                </textElement>
                <textFieldExpression><![CDATA["El Conservador de Bienes Raíces de Temuco certifica que la inscripción de fojas "+$F{FOJAS}+" número "+$F{NUMEROTITULO}+" correspondiente al Registro de Propiedad del año "+$F{ANOTITULO}+" , adjunta al presente documento, está conforme con su original y se encuentra vigente al día "+$F{FECHA}+"."+"\n\nLos derechos registrales correspondientes a esta actuación ascienden a la suma de \$ "+$F{PRECIO}+".-"]]></textFieldExpression>
            </textField>
            <textField pattern="dd MMMMM yyyy">
                <reportElement x="143" y="521" width="137" height="20" uuid="a315d92d-94a6-41a8-b764-78f76fe590b7"/>
                <textElement>
                    <font size="12"/>
                </textElement>
                <textFieldExpression><![CDATA[new java.util.Date()]]></textFieldExpression>
            </textField>
            <staticText>
                <reportElement x="91" y="520" width="60" height="20" uuid="4f6aa279-5ee1-4d92-b661-9ecd51f89384"/>
                <textElement>
                    <font size="12"/>
                </textElement>
                <text><![CDATA[Temuco, ]]></text>
            </staticText>
            <image>
                <reportElement x="390" y="561" width="91" height="86" uuid="ce857035-b39f-473d-a6e2-3b36aadb6028"/>
                <imageExpression><![CDATA["C:\\Users\\Fernando\\Desktop\\Timbre_chico.png"]]></imageExpression>
            </image>
            <image>
                <reportElement x="228" y="540" width="216" height="127" uuid="7fbdb127-6008-4c9a-a3b9-2e6b96c9cc66"/>
                <imageExpression><![CDATA["C:\\Users\\Fernando\\Desktop\\firma_htoro.png"]]></imageExpression>
            </image>
            <componentElement>
                <reportElement isPrintRepeatedValues="false" x="45" y="700" width="300" height="39" uuid="0430a4dc-0df9-45ef-83ac-0b5d1fae0e55">
                    <property name="com.jaspersoft.studio.unit.width" value="pixel"/>
                </reportElement>
                <jr:Code128 xmlns:jr="http://jasperreports.sourceforge.net/jasperreports/components" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports/components http://jasperreports.sourceforge.net/xsd/components.xsd">
                    <jr:codeExpression><![CDATA[$F{ANOACTUAL}.toString()+"-"+$F{ANOTITULO}.toString()+"-"+$F{FOJAS}.toString()+"-"+$F{NUMEROTITULO}.toString()+"-"+$F{BOLETA}.toString()]]></jr:codeExpression>
                </jr:Code128>
            </componentElement>
            <textField>
                <reportElement x="65" y="689" width="200" height="19" uuid="e3e5c7a6-44f9-407d-ac01-3a60796f1055"/>
                <textElement>
                    <font fontName="SansSerif" size="8"/>
                </textElement>
                <textFieldExpression><![CDATA["Código de verificación: "+$F{COD_VERIFICACION}]]></textFieldExpression>
            </textField>
        </band>
    </detail>
    <columnFooter>
        <band splitType="Stretch"/>
    </columnFooter>
    <pageFooter>
        <band splitType="Stretch"/>
    </pageFooter>
    <summary>
        <band splitType="Stretch"/>
    </summary>
</jasperReport>

一切正常,但是:我找不到将报告预览保存为PDF文件的方法。

请有人帮帮我吗?我真的经常搜索过......没有找到答案......

提前致谢!!!

1 个答案:

答案 0 :(得分:0)

private void streamPdfReport(OutputStream out, HttpServletResponse response, String reportName, JasperPrint jasperPrint) throws JRException {
    logger.fine("Executing streamReport...");
    response.reset();
    response.setContentType("application/pdf");
    response.setHeader("Content-Disposition", "attachment; filename=" + reportName + ".pdf");
    // work-around for IE bug, where Adobe Reader would put up an error message:
    // "There was an error opening this document. This file cannot be found."
    response.setHeader("Cache-Control", "must-revalidate, post-check=0, pre-check=0");
    JasperExportManager.exportReportToPdfStream(jasperPrint, out);
}

import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperExportManager;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;