我使用的textField溢出,相对于我的textField,我想在pageFooter中添加脚注。
仅当页面包含我的textField时,才需要在pageFooter中打印文本,或者至少在页面包含它时使页脚显示。
示例:
我的.jrxml文件中有一个名为“ Witnesseth”和“ A节”的部分,如下所示:
现在,这个见证人可能已经很长了,由于篇幅太长,可以移动到下一页。
当前它出现在每一页上,但我只希望它出现在A部分的打印位置上。
答案 0 :(得分:2)
如果您不愿意发布详细的结果(这也不简单),则在jasper-reports中创建脚注有两个主要挑战:
textField溢出时将在哪个页面上开始/结束?
只有通过分组或使用不同的详细信息带,您才能轻松获得有关textField
将在哪一页开始的信息。
pageFooter
是固定大小的(无法动态缩放)
您需要预先定义脚注的空间,在某些有限的情况下,您可以使用可以动态缩放但在某些情况下有限的groupFooter带。
考虑到这一点,没有没有解决方案可以处理脚注,因此,我将向大家展示一个简单案例的解决方案。
我们的限制是,相对于textField的脚注将位于 textField开始的页面,此外, pageFooter仅允许最多3个脚注x页面(这是我的预定义空间)。请注意,它将 通过添加伪造内容,可以很容易地在文本字段结束的页面上添加脚注 新的详细信息区域中的textField。
这个想法是使用一个简单的JRScriplet
,当在textField上调用printWhenExpression
时将收集数据(它可能会被调用多次,因此我们需要进行处理)。在pageFooter
中,我们将请求收集的数据来生成脚注列表。
JRScriplet ,我们将调用addFootnote
添加注释,并调用getFootnoteDatasource
打印当前脚注。
public class FootnoteScriplet extends JRDefaultScriptlet {
//Distinct ordered values (since jasper may call more then once)
private TreeSet<String> footNotes;
public FootnoteScriplet(){
super();
this.footNotes = new TreeSet<>();
}
/**
* Add a footnote
* @param footNote, string of footNote
* @return always <code>true</true> since we use in printWhenExpression
*/
public boolean addFootnote(String footNote){
this.footNotes.add(footNote);
return true;
}
/**
* Get the datasource for footNotes and clear for future use.
* @return
*/
public JRDataSource getFootnoteDatasource(){
JRBeanCollectionDataSource ds = new JRBeanCollectionDataSource(new ArrayList<>(footNotes));
this.footNotes.clear();
return ds;
}
}
jrxml ,与OnEmptyRecord数据源一起运行以进行测试,其结构是使用多个明细带,在textField的printWhenExpression
(始终返回true
中调用我们的脚本)进行添加脚注,然后使用jr:list
组件在pageFooter
中显示收集的脚注。
<?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="Footnotes" pageWidth="595" pageHeight="842" whenNoDataType="AllSectionsNoDetail" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" scriptletClass="my.package.FootnoteScriplet" uuid="b5b15f62-e36a-4c91-a871-ea43faa7d0af">
<subDataset name="footNoteDS" uuid="884dba42-5c44-4049-a50a-b7e13cc47607">
<queryString>
<![CDATA[]]>
</queryString>
<field name="_THIS" class="java.lang.String"/>
</subDataset>
<parameter name="TEXT" class="java.lang.String">
<defaultValueExpression><![CDATA["Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit, sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem. Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur? Quis autem vel eum iure reprehenderit qui in ea voluptate velit esse quam nihil molestiae consequatur, vel illum qui dolorem eum fugiat quo voluptas nulla pariatur?"]]></defaultValueExpression>
</parameter>
<queryString>
<![CDATA[]]>
</queryString>
<group name="TEXT2" footerPosition="CollateAtBottom">
<groupExpression><![CDATA["2"]]></groupExpression>
</group>
<detail>
<band height="50">
<textField isStretchWithOverflow="true">
<reportElement x="0" y="0" width="550" height="16" isRemoveLineWhenBlank="true" uuid="8def1808-b5c0-45b6-943f-8a88ec04f02b">
<printWhenExpression><![CDATA[$P{REPORT_SCRIPTLET}.addFootnote("Footnote 1")]]></printWhenExpression>
</reportElement>
<textElement>
<font size="12"/>
</textElement>
<textFieldExpression><![CDATA["(1)" + $P{TEXT} + "\n" + $P{TEXT}]]></textFieldExpression>
</textField>
</band>
<band height="50">
<textField isStretchWithOverflow="true">
<reportElement positionType="Float" x="0" y="0" width="550" height="16" uuid="b6faedf8-11d8-45c8-ac46-e3fb95106140">
<printWhenExpression><![CDATA[$P{REPORT_SCRIPTLET}.addFootnote("Footnote 2")]]></printWhenExpression>
</reportElement>
<textElement>
<font size="12"/>
</textElement>
<textFieldExpression><![CDATA["(2)" + $P{TEXT} + "\n" + $P{TEXT}]]></textFieldExpression>
</textField>
</band>
<band height="50">
<textField isStretchWithOverflow="true">
<reportElement positionType="Float" x="0" y="0" width="550" height="16" uuid="2db72e84-3e07-4e38-b2bb-c172bbd30956">
<printWhenExpression><![CDATA[$P{REPORT_SCRIPTLET}.addFootnote("Footnote 3")]]></printWhenExpression>
</reportElement>
<textElement>
<font size="12"/>
</textElement>
<textFieldExpression><![CDATA["(3)" + $P{TEXT} + "\n" + $P{TEXT}]]></textFieldExpression>
</textField>
</band>
<band height="50">
<textField isStretchWithOverflow="true">
<reportElement positionType="Float" x="0" y="0" width="550" height="16" uuid="4e4b4f2f-4279-4c21-8f0d-62ba92760edd">
<printWhenExpression><![CDATA[$P{REPORT_SCRIPTLET}.addFootnote("Footnote 4")]]></printWhenExpression>
</reportElement>
<textElement>
<font size="12"/>
</textElement>
<textFieldExpression><![CDATA["(4)" + $P{TEXT} + "\n" + $P{TEXT}]]></textFieldExpression>
</textField>
</band>
<band height="50">
<textField isStretchWithOverflow="true">
<reportElement positionType="Float" x="0" y="0" width="550" height="16" uuid="5552de59-29f3-49e7-87aa-ee75b811739d">
<property name="footNote" value=""FootNote 5""/>
<printWhenExpression><![CDATA[$P{REPORT_SCRIPTLET}.addFootnote("Footnote 5")]]></printWhenExpression>
</reportElement>
<textElement>
<font size="12"/>
</textElement>
<textFieldExpression><![CDATA["(5)" + $P{TEXT} + "\n" + $P{TEXT}]]></textFieldExpression>
</textField>
</band>
</detail>
<pageFooter>
<band height="64">
<line>
<reportElement x="13" y="5" width="534" height="1" uuid="c5b242d5-cafa-43ed-9536-391a4728edf6"/>
<graphicElement>
<pen lineWidth="0.25" lineStyle="Solid"/>
</graphicElement>
</line>
<componentElement>
<reportElement positionType="Float" x="11" y="10" width="470" height="16" uuid="08bbac11-4f61-4858-8d82-639875dfe1c7"/>
<jr:list xmlns:jr="http://jasperreports.sourceforge.net/jasperreports/components" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports/components http://jasperreports.sourceforge.net/xsd/components.xsd" printOrder="Vertical">
<datasetRun subDataset="footNoteDS" uuid="c10d3aaf-8109-4f5b-8099-40450ea9ad7e">
<dataSourceExpression><![CDATA[$P{REPORT_SCRIPTLET}.getFootnoteDatasource()]]></dataSourceExpression>
</datasetRun>
<jr:listContents height="16" width="470">
<textField>
<reportElement x="0" y="0" width="470" height="16" uuid="d6b5f278-02eb-43d0-934e-5282d37950f5"/>
<textElement verticalAlignment="Middle"/>
<textFieldExpression><![CDATA[$F{_THIS}]]></textFieldExpression>
</textField>
</jr:listContents>
</jr:list>
</componentElement>
<textField>
<reportElement positionType="FixRelativeToBottom" x="500" y="44" width="50" height="20" uuid="7e4a61be-7f67-4003-bd6e-1417cd77378b"/>
<textElement textAlignment="Right" verticalAlignment="Middle"/>
<textFieldExpression><![CDATA["P." + $V{PAGE_NUMBER}]]></textFieldExpression>
</textField>
</band>
</pageFooter>
</jasperReport>
输出
这与 ultimate 解决方案相去甚远,答案是要说明与脚注有关的问题,并给出如何处理它们的初步思路。
答案 1 :(得分:0)
我通过遵循this answer on SO.
修复了此问题的版本这可能是Petter所说的“参数黑客技巧”,但即使前一页溢出,它也确实跟随脚注所在的页面,等等。