Jasper сообщает о проблеме с пустым отчетом в формате PDF, используя Spring ModelAndView

Я пытаюсь создать отчет в формате PDF с помощью Jasper Reports, используя Spring. Но отчет всегда пустой. Я много искал и не мог найти проблему. Я пытался записать byte[] pdfReport в OutputStream, но результат тот же, отчет всегда пустой.

У меня есть 2 параметра, один из них - testName, а один из них - диаграмма. Оба не могут отображаться в отчете в формате pdf.

Спасибо большое за вашу помощь,

Вот код, который генерирует отчет.

//My class extends MultiActionController

DefaultPieDataset dataset = new DefaultPieDataset();

dataset.setValue(String.format("%s, %s", "pie1", "pie1"),20);
dataset.setValue(String.format("%s, %s", "pie2", "pie2"),80);

JFreeChart chart = ChartFactory.createPieChart("testPie", dataset, true, true, false);

Map model = new HashMap(); 
model.put("chart", chart.createBufferedImage(200, 200)); 
model.put("testName", "test report");
model.put("format", "pdf");

AbstractJasperReportsView  view = new JasperReportsMultiFormatView();
view.setUrl("/WEB-INF/classes/reports/"+"test1"+".jasper");
view.setApplicationContext(getApplicationContext());
view.setContentType("application/pdf");

Properties header = new Properties();
view.setHeaders(header);

ModelAndView mv = new ModelAndView(view, model);

JasperReport report =  (JasperReport) JRLoader.loadObject(getServletContext().getResourceAsStream("/WEB-INF/classes/reports/"+"test1"+".jasper"));

JasperPrint prt = JasperFillManager.fillReport(report, model);
byte[] pdfReport = JasperExportManager.exportReportToPdf(prt);

return mv;

А вот файл jrxml

<?xml version="1.0" encoding="UTF-8"?>
<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="test1" language="groovy" pageWidth="700" pageHeight="842" columnWidth="660" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20">
    <property name="ireport.zoom" value="1.0"/>
    <property name="ireport.x" value="0"/>
    <property name="ireport.y" value="2"/>
    <parameter name="testName" class="java.lang.String"/>
    <parameter name="chart" class="java.awt.Image" isForPrompting="false"/>
    <background>
        <band splitType="Stretch"/>
    </background>
    <title>
        <band height="48" splitType="Stretch"/>
    </title>
    <pageHeader>
        <band height="35" splitType="Stretch"/>
    </pageHeader>
    <columnHeader>
        <band height="14" splitType="Stretch"/>
    </columnHeader>
    <detail>
        <band height="229" splitType="Stretch">
            <image>
                <reportElement x="162" y="13" width="200" height="200"/>
                <imageExpression class="java.awt.Image"><![CDATA[$P{chart}]]></imageExpression>
            </image>
            <textField>
                <reportElement x="37" y="61" width="100" height="20"/>
                <textElement/>
                <textFieldExpression class="java.lang.String"><![CDATA[$P{testName}]]></textFieldExpression>
            </textField>
        </band>
    </detail>
    <columnFooter>
        <band height="112" splitType="Stretch"/>
    </columnFooter>
    <pageFooter>
        <band height="76" splitType="Stretch"/>
    </pageFooter>
    <summary>
        <band height="42" splitType="Stretch"/>
    </summary>
</jasperReport>

person jiraiya    schedule 29.12.2010    source источник


Ответы (2)


Почему вы делаете следующее?

ModelAndView mv = new ModelAndView(view, model);

JasperReport report =  (JasperReport) JRLoader.loadObject(getServletContext().getResourceAsStream("/WEB-INF/classes/reports/"+"test1"+".jasper"));

JasperPrint prt = JasperFillManager.fillReport(report, model);
byte[] pdfReport = JasperExportManager.exportReportToPdf(prt);

return mv;

Использование JasperReportsMultiFormatView() уже совмещает заполнение и экспорт отчета. Нет необходимости в следующем:

JasperReport report =  (JasperReport) JRLoader.loadObject(getServletContext().getResourceAsStream("/WEB-INF/classes/reports/"+"test1"+".jasper"));

JasperPrint prt = JasperFillManager.fillReport(report, model);
byte[] pdfReport = JasperExportManager.exportReportToPdf(prt);

Вы должны объявить файл JRXML и ключ данных отчета в пакете ресурсов.

Я предлагаю вам ознакомиться с этим руководством, которое я написал для Учебника по интеграции Spring 3 MVC — Jasper: http://krams915.blogspot.com/2010/12/spring-3-mvc-jasper.-integration.html

Просто измените представления, чтобы вместо этого использовать JasperReportsMultiFormatView().

Проверьте раздел Учебники для получения дополнительной информации. Если позже у меня будет время, я сделаю учебник, используя JasperReportsMultiFormatView(). Если нет, может быть, завтра. Дайте мне знать, если это поможет вам.

person chris    schedule 29.12.2010
comment
Большое спасибо за ответ. Я удалил ненужный код, но результат тот же, pdf пустой. И мне жаль, что я не знаю, что ключ данных отчета должен быть объявлен в пакете ресурсов. Я просто генерирую файл jrxml с помощью iReports, затем компилирую его с помощью Maven и использую. не могли бы вы рассказать больше о ключе данных отчета? и ваши учебники очень полезны, я буду продолжать читать их. - person jiraiya; 29.12.2010
comment
Пожалуйста. Можете ли вы опубликовать здесь, как вы объявляете новый код и пакет ресурсов? Когда вы создаете файл JRXML из iReports, вам придется что-то там редактировать вручную - person chris; 30.12.2010
comment
Я добавил руководство по использованию JasperReportsMultiFormatView по адресу krams915.blogspot.com/2010/12/ - person chris; 30.12.2010

В отчете jasper есть свойство, называемое «whenNoDataType». Вы пытались установить для этого whenNoDataType="AllSectionsNoDetail"

Также язык отчета указан как «отличный». Почему?

person Aromal C    schedule 07.01.2011
comment
Если вы используете iReport по умолчанию, он использует Groovy. Вы должны вручную изменить его. Я считаю, что было бы лучше, если бы оно было пустым или, по крайней мере, предлагало бы нам выбрать язык. - person chris; 18.01.2011