Я действительно надеюсь, что у кого-то есть подсказка по этому вопросу макета, потому что у меня уже нет идей.
Хотя я думаю, что моя проблема как-то связана с проектами, то есть с тем, как Jasper обрабатывает их (макет), вот некоторая общая информация о приложении.
По сути, у нас есть клиент-серверное приложение JAVA, и мы используем Jasper для генерации нескольких отчетов. Проекты Jasper обрабатываются сервлетом на стороне сервера и отправляются клиенту в виде файлов jrprint, где они представляются пользователю. У нас также есть скриптлет, который делает некоторые вещи - объединяет данные и т. Д.
Отчет, с которым у меня возникли проблемы, имеет следующую структуру, показанную во фрагменте кода # 1
Данные для него получены из SQL-запроса, который отлично работает, поэтому меня беспокоит только макет.
В деталях у меня есть несколько текстовых полей, которые визуализируют некоторую иерархию и другое текстовое поле, которое может содержать относительно большой объем текста. Я упаковал каждый из них в рамку, они оба строят другую рамку.
Под ними у меня есть еще один кадр, который может содержать 0,1 или 2 изображения (в идеале). Я получаю отчет, содержащий страницы, подобные той, что во вложении 1.
Моя цель состоит в том, чтобы страницы отчета были свободными, если между указанным выше кадром и рамкой изображения нет места - как в приложении 2, и, конечно, текст в верхней рамке. На данный момент это возможно только если я избавлюсь от длинного текста.
На мой взгляд, проблема заключается в определении поля для длинного текста. Поскольку я не знаю, какой длины будет эта строка, я определяю ее высотой 13 (фрагмент кода # 2), то есть только одну строку. Из-за свойств растягивания полей он приспосабливается соответственно, но при этом он выталкивает изображения на переменное число строк. Итак, есть ли способ избежать того «толчка», который разрушает дизайн.
Код:
<band height="245" isSplitAllowed="false"><!-- 245 -->
<frame>
<reportElement isRemoveLineWhenBlank="true"
positionType="Float" width="545" y="0" x="0" height="75"
stretchType="RelativeToBandHeight">
</reportElement>
<box>
<pen lineColor="black" lineStyle="Solid"
lineWidth="1" />
</box>
<frame>
<reportElement isRemoveLineWhenBlank="true"
positionType="FixRelativeToTop" width="200" y="0" x="55"
height="75" stretchType="RelativeToTallestObject"/>
<box>
<pen lineColor="green" lineStyle="Solid"
lineWidth="3" />
</box>
<textField isStretchWithOverflow="true" pattern=""
isBlankWhenNull="true" evaluationGroup="Ebene2">
<reportElement x="0" y="0" width="200"
height="13" positionType="Float" isRemoveLineWhenBlank="true"
isPrintInFirstWholeBand="true">
<printWhenExpression><![CDATA[new Boolean( ($F{AnlagenEbeneOfSchaden}).intValue()==1 )]]></printWhenExpression>
</reportElement>
<textElement>
<font fontName="Arial" size="10"
isBold="true" isItalic="false" isUnderline="false"
isStrikeThrough="false" pdfFontName="Helvetica-Bold"
pdfEncoding="CP1252" isPdfEmbedded="false" />
</textElement>
<textFieldExpression class="java.lang.String"><![CDATA[((alwin2Scriptlet)$P{REPORT_SCRIPTLET}).getStrukturBezMitStandOrtEbeneDB($F{Strukturcode1}, 1)]]></textFieldExpression>
</textField>
<textField isStretchWithOverflow="true" pattern=""
isBlankWhenNull="true" evaluationGroup="Ebene2">
<reportElement x="15" y="0" width="185"
height="13" mode="Opaque" positionType="Float"
isRemoveLineWhenBlank="true" isPrintInFirstWholeBand="true" />
<textElement>
<font fontName="Arial" size="10"
isBold="true" isItalic="false" isUnderline="false"
isStrikeThrough="false" pdfFontName="Helvetica-Bold"
pdfEncoding="CP1252" isPdfEmbedded="false" />
</textElement>
<textFieldExpression class="java.lang.String"><![CDATA[((alwin2Scriptlet)$P{REPORT_SCRIPTLET}).getStrukturBezMitStandOrtEbeneDB($F{Strukturcode1}, 2)]]></textFieldExpression>
</textField>
<textField isStretchWithOverflow="true" pattern=""
isBlankWhenNull="true" evaluationGroup="Ebene3">
<reportElement mode="Opaque" x="30" y="15"
width="170" height="13" positionType="Float"
isRemoveLineWhenBlank="true" />
<textElement>
<font fontName="Arial" size="10"
isBold="false" isItalic="false" isUnderline="false"
isStrikeThrough="false" pdfFontName="Helvetica"
pdfEncoding="CP1252" isPdfEmbedded="false" />
</textElement>
<textFieldExpression class="java.lang.String"><![CDATA[((alwin2Scriptlet)$P{REPORT_SCRIPTLET}).getStrukturBezMitStandOrtEbeneDB($F{Strukturcode1}, 3)]]></textFieldExpression>
</textField>
<textField isStretchWithOverflow="true" pattern=""
isBlankWhenNull="true">
<reportElement mode="Opaque" x="45" y="30"
width="155" height="13" positionType="Float"
isRemoveLineWhenBlank="true" />
<textElement>
<font fontName="Arial" size="10"
isBold="false" isItalic="false" isUnderline="false"
isStrikeThrough="false" pdfFontName="Helvetica"
pdfEncoding="CP1252" isPdfEmbedded="false" />
</textElement>
<textFieldExpression class="java.lang.String"><![CDATA[((alwin2Scriptlet)$P{REPORT_SCRIPTLET}).getStrukturBezMitStandOrtEbeneDB($F{Strukturcode1}, 4)]]></textFieldExpression>
</textField>
<textField isStretchWithOverflow="true" pattern=""
isBlankWhenNull="true">
<reportElement mode="Opaque" x="60" y="45"
width="140" height="13" positionType="Float"
isRemoveLineWhenBlank="true" />
<textElement>
<font fontName="Arial" size="10"
isBold="false" isItalic="false" isUnderline="false"
isStrikeThrough="false" pdfFontName="Helvetica"
pdfEncoding="CP1252" isPdfEmbedded="false" />
</textElement>
<textFieldExpression class="java.lang.String"><![CDATA[((alwin2Scriptlet)$P{REPORT_SCRIPTLET}).getStrukturBezMitStandOrtEbeneDB($F{Strukturcode1}, 5)]]></textFieldExpression>
</textField>
<textField isStretchWithOverflow="true" pattern=""
isBlankWhenNull="true">
<reportElement mode="Opaque" x="75" y="60"
width="125" height="13" positionType="Float"
isRemoveLineWhenBlank="true" />
<textElement>
<font fontName="Arial" size="10"
isBold="false" isItalic="false" isUnderline="false"
isStrikeThrough="false" pdfFontName="Helvetica"
pdfEncoding="CP1252" isPdfEmbedded="false" />
</textElement>
<textFieldExpression class="java.lang.String"><![CDATA[((alwin2Scriptlet)$P{REPORT_SCRIPTLET}).getStrukturBezMitStandOrtEbeneDB($F{Strukturcode1}, 6)]]></textFieldExpression>
</textField>
</frame>
<textField isStretchWithOverflow="true" pattern=""
isBlankWhenNull="true">
<reportElement mode="Opaque" x="30" y="1" width="20"
height="13" isRemoveLineWhenBlank="true" />
<textElement>
<font fontName="Arial" size="10" isBold="true"
isItalic="false" isUnderline="false" isStrikeThrough="false"
pdfFontName="Helvetica" pdfEncoding="CP1252"
isPdfEmbedded="false" />
</textElement>
<textFieldExpression class="java.lang.Integer"><![CDATA[$V{REPORT_COUNT}]]></textFieldExpression>
</textField>
<textField isStretchWithOverflow="true" pattern=""
isBlankWhenNull="true">
<reportElement mode="Opaque" x="515" y="1"
width="20" height="13" isRemoveLineWhenBlank="true" />
<textElement textAlignment="Right">
<font fontName="Arial" size="11" isBold="true"
isItalic="false" isUnderline="false" isStrikeThrough="false"
pdfFontName="Helvetica-Bold" pdfEncoding="CP1252"
isPdfEmbedded="false" />
</textElement>
<textFieldExpression class="java.lang.String"><![CDATA[$F{Bewertung}]]></textFieldExpression>
</textField>
<frame>
<reportElement isRemoveLineWhenBlank="true"
positionType="FixRelativeToTop" width="240" y="0" x="255"
height="15" stretchType="RelativeToTallestObject" />
<box>
<pen lineColor="red" lineStyle="Solid"
lineWidth="3" />
</box>
<textField isStretchWithOverflow="true"
isBlankWhenNull="true">
<reportElement mode="Opaque" x="0" y="1"
width="240" height="13" isRemoveLineWhenBlank="true"
isPrintWhenDetailOverflows="true" />
<textElement verticalAlignment="Top">
<font fontName="Arial" size="10"
isBold="false" isItalic="false" isUnderline="false"
isStrikeThrough="false" pdfFontName="Helvetica"
pdfEncoding="CP1252" isPdfEmbedded="false" />
</textElement>
<textFieldExpression class="java.lang.String"><![CDATA[$F{SCHADENGRUPPE} + ($F{SCHADENBESCHREIBUNG}!=null?$F{SCHADENBESCHREIBUNG}:"")+" ["+$F{SCHADENNR}+"]"]]></textFieldExpression>
</textField>
</frame>
</frame>
<frame>
<reportElement isRemoveLineWhenBlank="true"
positionType="Float" width="545" y="76" x="0" height="155">
<printWhenExpression><![CDATA[new Boolean( (!($F{BILD1_FILE} == null) ) || (!($F{BILD2_FILE} == null)) )]]></printWhenExpression>
</reportElement>
<!-- <box padding="5">
<pen lineColor="black" lineStyle="Solid"
lineWidth="3" />
</box>
-->
<image vAlign="Top" hAlign="Center">
<reportElement positionType="Float" x="303" y="0"
width="212" height="145" isPrintWhenDetailOverflows="true"
isRemoveLineWhenBlank="true">
<printWhenExpression><![CDATA[new Boolean( (!($F{BILD1_FILE} == null) ) && ($F{BILD2_FILE} == null) )]]></printWhenExpression>
</reportElement>
<graphicElement />
<imageExpression class="java.awt.Image"><![CDATA[$F{BILD1_FILE}]]></imageExpression>
</image>
<image vAlign="Top" hAlign="Center">
<reportElement positionType="Float" x="303" y="0"
width="212" height="145" isPrintWhenDetailOverflows="true"
isRemoveLineWhenBlank="true">
<printWhenExpression><![CDATA[new Boolean( (!($F{BILD2_FILE} == null)) && ($F{BILD1_FILE} == null) )]]></printWhenExpression>
</reportElement>
<graphicElement />
<imageExpression class="java.awt.Image"><![CDATA[$F{BILD2_FILE}]]></imageExpression>
</image>
<image vAlign="Top" hAlign="Center">
<reportElement positionType="Float" x="70" y="0"
width="212" height="145" isPrintWhenDetailOverflows="true"
isRemoveLineWhenBlank="true">
<printWhenExpression><![CDATA[new Boolean( (!($F{BILD1_FILE} == null) ) && (!($F{BILD2_FILE} == null)) )]]></printWhenExpression>
</reportElement>
<graphicElement />
<imageExpression class="java.awt.Image"><![CDATA[$F{BILD1_FILE}]]></imageExpression>
</image>
<image vAlign="Top" hAlign="Center">
<reportElement positionType="Float" x="303" y="0"
width="212" height="145" isPrintWhenDetailOverflows="true"
isRemoveLineWhenBlank="true">
<printWhenExpression><![CDATA[new Boolean( (!($F{BILD2_FILE} == null)) && (!($F{BILD1_FILE} == null)) )]]></printWhenExpression>
</reportElement>
<graphicElement />
<imageExpression class="java.awt.Image"><![CDATA[$F{BILD2_FILE}]]></imageExpression>
</image>
</frame>
<line>
<reportElement positionType="Float" mode="Opaque" x="0"
y="240" width="525" height="1" />
<graphicElement pen="Thin" />
</line>
<!--
<frame>
<reportElement isRemoveLineWhenBlank="true"
positionType="Float" width="545" y="86" x="0" height="170">
<printWhenExpression><![CDATA[new Boolean( (!($F{BILD1_FILE} == null) ) || (!($F{BILD2_FILE} == null)) )]]></printWhenExpression>
</reportElement>
<box>
<pen lineColor="black" lineStyle="Solid"
lineWidth="1" />
</box>
</frame>
-->
</band>
Код:
<textField isStretchWithOverflow="true"
isBlankWhenNull="true">
<reportElement mode="Opaque" x="0" y="1"
width="240" height="13" isRemoveLineWhenBlank="true"
isPrintWhenDetailOverflows="true" />
<textElement verticalAlignment="Top">
<font fontName="Arial" size="10"
isBold="false" isItalic="false" isUnderline="false"
isStrikeThrough="false" pdfFontName="Helvetica"
pdfEncoding="CP1252" isPdfEmbedded="false" />
</textElement>
<textFieldExpression class="java.lang.String"><![CDATA[$F{SCHADENGRUPPE} + ($F{SCHADENBESCHREIBUNG}!=null?$F{SCHADENBESCHREIBUNG}:"")+" ["+$F{SCHADENNR}+"]"]]></textFieldExpression>
</textField>
Скриншоты:
снимок экрана 1
снимок экрана 2