Jasper子报表InputStream标题不显示图像

时间:2017-11-13 12:35:33

标签: java jasper-reports subreport

我有一个主报表和子报表,我将一个参数传递给子报表作为输入流。我将在子报表头中使用此参数作为徽标(图像)。如果我将图像添加到子报表并使用此参数,则子报表仅显示我的数据源和图像的第一条记录。如果我不使用此图像,我的子报表将列出我的数据源的所有记录。我试图将图像放在细节,标题和标题中,但它没有用。如果我直接从子报表使用图像,它运行良好,但我需要从Java发送此参数(文件路径)。

可能是什么问题?

编辑:我提供了一些代码。

主要报告:

 <?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="e-BordroIsciToplu" pageWidth="595" pageHeight="842" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" uuid="a3c2690b-2af8-4210-8775-cb69cd6557f7">
    <property name="ireport.zoom" value="1.5394743546921228"/>
    <property name="ireport.x" value="0"/>
    <property name="ireport.y" value="0"/>
    <property name="ireport.background.image.properties" value="true,true,0.25,138,273,0,0,386,161"/>
    <parameter name="SUBREPORT_DIR" class="java.lang.String" isForPrompting="false">
        <defaultValueExpression><![CDATA["W:\\Projects\\modules\\common\\src\\resources\\report\\templates\\"]]></defaultValueExpression>
    </parameter>
    <parameter name="ANTET" class="java.io.InputStream"/>
    <parameter name="AY" class="java.lang.String"/>
    <field name="topluInfo" class="java.util.List"/>
    <detail>
        <band height="109" splitType="Stretch">
            <subreport runToBottom="false">
                <reportElement positionType="Float" stretchType="RelativeToTallestObject" x="0" y="0" width="533" height="100" uuid="cd6571c7-c8da-4120-868f-82999376c3d3"/>
                <parametersMapExpression><![CDATA[]]></parametersMapExpression>
                <subreportParameter name="SUBREPORT_DIR">
                    <subreportParameterExpression><![CDATA[]]>  </subreportParameterExpression>
                </subreportParameter>
                <subreportParameter name="AY">
                    <subreportParameterExpression><![CDATA[$P{AY}]]></subreportParameterExpression>
                </subreportParameter>
                <subreportParameter name="ANTET">
                    <subreportParameterExpression><![CDATA[$P{ANTET}]]></subreportParameterExpression>
                </subreportParameter>
                <dataSourceExpression><![CDATA[new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($F{topluInfo})]]></dataSourceExpression>
                <subreportExpression><![CDATA[$P{SUBREPORT_DIR} + "e-topluSubreportTest.jasper"]]></subreportExpression>
            </subreport>
        </band>
    </detail>
</jasperReport>

子报表:

<?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="e-topluSubreport" language="groovy" pageWidth="595" pageHeight="842" columnWidth="545" leftMargin="20" rightMargin="30" topMargin="20" bottomMargin="20" uuid="a3c2690b-2af8-4210-8775-cb69cd6557f7">
    <property name="ireport.zoom" value="1.5394743546921228"/>
    <property name="ireport.x" value="0"/>
    <property name="ireport.y" value="0"/>
    <property name="ireport.background.image.properties" value="true,true,0.25,138,273,0,0,386,161"/>
    <parameter name="SUBREPORT_DIR" class="java.lang.String" isForPrompting="false">
        <defaultValueExpression><![CDATA["W:\\Projects\\modules\\common\\src\\resources\\report\\templates\\"]]></defaultValueExpression>
    </parameter>
    <parameter name="ANTET" class="java.io.InputStream"/>
    <parameter name="AY" class="java.lang.String"/>
    <detail>
        <band height="139" splitType="Stretch">
            <staticText>
                <reportElement x="5" y="105" width="185" height="15" uuid="023f69c4-13a4-419e-b64b-d41da9f937fa"/>
                <box>
                    <pen lineWidth="0.25"/>
                    <topPen lineWidth="0.25"/>
                    <leftPen lineWidth="0.25"/>
                    <bottomPen lineWidth="0.25"/>
                    <rightPen lineWidth="0.25"/>
                </box>
                <textElement verticalAlignment="Middle">
                    <font size="8" isBold="true" pdfEncoding="Cp1254"/>
                </textElement>
                <text><![CDATA[  BORDRO TÜRÜ  ]]></text>
            </staticText>
            <staticText>
                <reportElement x="5" y="120" width="185" height="15" uuid="e7aac3af-4436-4488-9b00-e93ed875119f"/>
                <box>
                    <pen lineWidth="0.25"/>
                    <topPen lineWidth="0.25"/>
                    <leftPen lineWidth="0.25"/>
                    <bottomPen lineWidth="0.25"/>
                    <rightPen lineWidth="0.25"/>
                </box>
                <textElement verticalAlignment="Middle">
                    <font size="8" isBold="true" pdfEncoding="Cp1254"/>
                </textElement>
                <text><![CDATA[  PARA BİRİMİ]]></text>
            </staticText>
            <staticText>
                <reportElement x="5" y="79" width="500" height="15" uuid="55328d4d-8ce4-44aa-9217-405be02338b6"/>
                <box>
                    <pen lineWidth="0.0"/>
                    <topPen lineWidth="0.0"/>
                    <leftPen lineWidth="0.0"/>
                    <bottomPen lineWidth="0.0"/>
                    <rightPen lineWidth="0.0"/>
                </box>
                <textElement verticalAlignment="Middle">
                    <font size="8" isBold="true" pdfEncoding="Cp1254"/>
                </textElement>
                <text><![CDATA[* test]]></text>
            </staticText>
            <image>
                <reportElement x="5" y="23" width="101" height="35" uuid="057a515d-61a7-4f54-9c5e-234acaede0e5"/>
                <imageExpression><![CDATA[$P{ANTET}]]></imageExpression>
            </image>
        </band>
        <band height="50"/>
    </detail>
</jasperReport>

2 个答案:

答案 0 :(得分:1)

您的原始报告仅显示第一条记录的图像,因为InputStream只能读取一次。如果对一个多次打印的图像元素使用单个InputStream实例,它将在第一次正常工作,但之后它将无法从流中读取任何数据。

你可以做两件事。一种是将图像数据作为字节数组而不是流传递。

第二种是为图像元素设置if not key.isdigit(): # Key isn't between 0 and 9. Can be uppercase or a symbol, though. if ord(key.lower()) >= 97 and ord(key.lower()) <= 122: # Do your thing. It's pretty much the same as before but with one more step. 。这将在首次渲染元素时缓存图像对象,然后在再次打印图像元素时使用缓存的图像。

从性能的角度来看,第二种方法会更好,因为图像数据不会被多次读取。您还可以通过将图像数据作为字节数组传递并设置isUsingCache标志来组合解决方案。

答案 1 :(得分:0)

我找到了解决方案。我从子报表中删除图像,并将图像放在主报表的页眉中。它解决了我的问题,但我仍然想知道为什么它只显示一条记录的上一个问题。感谢您的意见和宝贵的时间。