我有一个主报表和子报表,我将一个参数传递给子报表作为输入流。我将在子报表头中使用此参数作为徽标(图像)。如果我将图像添加到子报表并使用此参数,则子报表仅显示我的数据源和图像的第一条记录。如果我不使用此图像,我的子报表将列出我的数据源的所有记录。我试图将图像放在细节,标题和标题中,但它没有用。如果我直接从子报表使用图像,它运行良好,但我需要从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>
答案 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)
我找到了解决方案。我从子报表中删除图像,并将图像放在主报表的页眉中。它解决了我的问题,但我仍然想知道为什么它只显示一条记录的上一个问题。感谢您的意见和宝贵的时间。