web-dev-qa-db-ja.com

空白PDF最も単純なJasperreportjrxmlでも

私はjasperreport4.0.1用のglassfish3.1 + JSFを備えたEJBサイトを持っています。このサイトはPDFのストリーミングに問題はありませんが、runReportToPdfStreamを使用してPDFを印刷している間、空白の製品PDF、以下はコードスニペットです。

[〜#〜] ejb [〜#〜]

public class BookEJB {  
    public void printReport() throws ClassNotFoundException, IOException, JRException {
        Map parameterMap = new HashMap();

        FacesContext ctx = FacesContext.getCurrentInstance();
        HttpServletResponse response = (HttpServletResponse) ctx.getExternalContext().getResponse();
        InputStream reportStream = ctx.getExternalContext().getResourceAsStream("/reports/test.jasper");

        ServletOutputStream servletOutputStream = response.getOutputStream();
        servletOutputStream.flush();

        response.setContentType("application/pdf");
        JasperRunManager.runReportToPdfStream(reportStream, servletOutputStream, parameterMap);

        servletOutputStream.flush();
        servletOutputStream.close();
        ctx.responseComplete();
}}

test.jrxml-SQL接続のない単純なレポート

<?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="test" pageWidth="800" pageHeight="1200" columnWidth="555" leftMargin="25" rightMargin="25" topMargin="30" bottomMargin="30">
    <property name="ireport.zoom" value="1.0"/>
    <property name="ireport.x" value="0"/>
    <property name="ireport.y" value="0"/>
    <queryString>
        <![CDATA[]]>
    </queryString>
    <pageHeader>
        <band height="100">
            <staticText>
                <reportElement x="0" y="0" width="285" height="36"/>
                <textElement>
                    <font size="24" isBold="true"/>
                </textElement>
                <text><![CDATA[Report of Testing]]></text>
            </staticText>   
        </band>
    </pageHeader>
    <detail>
        <band height="200">
            <staticText>
                <reportElement x="0" y="0" width="374" height="48"/>
                <textElement>
                    <font size="18"/>
                </textElement>
                <text><![CDATA[If you don't see this, it didn't work blah blah blah.... ]]></text>
            </staticText>
        </band>
    </detail>
    <pageFooter>
        <band height="100"/>
    </pageFooter>
</jasperReport>

jSFでこのレポートを生成するときに、glassfishにエラーログはありませんが、空白のPDFのみが表示されています。分析のためにさらに情報が必要な場合は、お知らせください。

スティーブン

21
Mythox

結局のところ、JasperRunManager.runReportToPdfStream(reportStream, servletOutputStream, parameterMap, new JREmptyDataSource());は問題を解決しました。

JasperreportのSandaからの引用:

デフォルトでは、レポートにデータソース情報が存在しない場合、JRはページを生成しません。別のオプション(レポートのwhenNoDataType属性で設定できます)は、<detail>を除くすべてのレポートセクションを印刷することです。

このレポートには詳細セクションが含まれていますが、一部の静的データのみが含まれています。このセクションも確実に印刷されるようにするには、最も簡単な方法は、単一の空のレコードを含む空のデータソースを提供することです。

47
Mythox

Mythoxが言ったことに加えて、jasperでデータソースを偽造する最良の方法と、必要に応じてJasperServerでも紹介します。

1)空のデータアダプター(単純な.xmlファイル)を定義し、サーバーにデプロイするか、レポートフォルダーに配置します。

<?xml version="1.0" encoding="UTF-8" ?><emptyDataAdapter class="net.sf.jasperreports.data.empty.EmptyDataAdapterImpl"><name>Nuovo Data Adapter 1</name><recordCount>1</recordCount></emptyDataAdapter>

2)メインレポートにリンクします。

<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="repor" language="javascript" pageWidth="612" pageHeight="792" whenNoDataType="NoDataSection" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" isFloatColumnFooter="true" uuid="c0eee90e-1b1a-4f34-ad99-1112847752de">
<property name="net.sf.jasperreports.data.adapter" value="EmptyDataAdapter.xml"/>

xmlがjasperサーバーにデプロイされている場合は、データアダプターのプロパティの値の前に「repo:」を付けます。

属性「whenNoDataType」は無視されます。

その他の詳細 ここ

0
Gaetano