仅在第一页上打印页脚 [英] Print footer on first page only

查看:324
本文介绍了仅在第一页上打印页脚的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想在jasper报告的第一页上显示一个页脚。

I would like to have a footer appear only on the first page of jasper reports.

搜索论坛后,我看到了这个问题并且不正确地回答了几个问题在这里。正如许多人所建议的那样,我尝试在页脚带上表达时打印一个打印件以防止它在第一页上面时打印:

After searching the forums, I have seen this question asked and improperly answered several times here. As many have suggested I have tried putting a print when expression on the footer band to prevent it from printing when it isn't the first page like:

new Boolean($V{PAGE_NUMBER}.intValue() == 1)

但这不起作用。结果是页面页脚的所有属性都没有打印,但页脚块仍然会打印并占用空间,从而阻止细节使用整个页面。实际上,你有一个页脚在第一页上有数据,页脚在每个后续页面都没有数据。

This does not work though. The result is that none of the attributes of the page footer print, but the footer block still prints and takes up space preventing the detail from using the whole page. Effectively, you have a footer with data on the first page and a footer with no data on every following page.

有没有人知道如何实际使这项工作?

Does anyone know a trick how to actually make this work?

推荐答案

绝对没有直接的方法来实现它,至少目前版本的Jasper库可用。然而,这是一个非常粗略的解决方法,在类似的要求中对我们有用。我今天早上只将代码的页脚管理部分分成了一个示例项目,并且工作正常。

Definitely there does not seem to be a direct way of achieving it, at least with current version of Jasper libraries available. However here's a very crude workaround that worked for us in a similar requirement. I separated out only the footer management part of the code into a sample project this morning and it works fine.

注意:


  • 不确定这是否适用于复杂报告(特别是如果需要打印列页脚,我们手动修改columnFooterOffsetY值)。我们必须生成一个只包含标题,细节和页脚带的简单报告。

  • 重要的是,我不建议将此解决方案用于复杂的需求,因为它可能会导致长期的可维护性问题(尤其是如果您将来迁移到更高版本的jasperreports库,可能已经修改了报表填充逻辑。)

  • 我已经使用JasperReports库版本5.0.0进行测试。

如何构建示例:


  • 使用iReport创建了JRXML,带有printwhenexpression,新的布尔值($ V {PAGE_NUMBER} .intValue()== 1,用于页脚页带。

  • 创建了一个自定义报表填充实例,扩展JRVerticalFiller类。

使用的源XML示例:(添加其他行到XML以便报告包装到多个页面)

Sample source XML used: (add additional lines to the XML so that the report wraps to multiple pages)

<?xml version="1.0" encoding="UTF-8"?>

<employees>
    <employee id="1001" name="AAA" email="aaa@somecorp.com" salary="20500.125"/>
    <employee id="1002" name="BBB" email="bbb@somecorp.com" salary="10000.500"/>
    <employee id="1003" name="CCC" email="ccc@somecorp.com" salary="12275.750"/>
    <employee id="1004" name="DDD" email="ddd@somecorp.com" salary="10750.750"/>
</employees>

使用iReport创建的JRXML(带有页脚带的printwheexpression):

<?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="jr_footer_display_test" pageWidth="792" pageHeight="288" orientation="Landscape" columnWidth="752" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" uuid="27ac3ae2-27da-484b-b088-b4d79aa973cc">
    <property name="ireport.zoom" value="1.0"/>
    <property name="ireport.x" value="0"/>
    <property name="ireport.y" value="0"/>
    <queryString language="xPath">
        <![CDATA[//employee]]>
    </queryString>
    <field name="email" class="java.lang.String">
        <fieldDescription><![CDATA[./@email]]></fieldDescription>
    </field>
    <field name="id" class="java.lang.String">
        <fieldDescription><![CDATA[./@id]]></fieldDescription>
    </field>
    <field name="name" class="java.lang.String">
        <fieldDescription><![CDATA[./@name]]></fieldDescription>
    </field>
    <field name="salary" class="java.lang.String">
        <fieldDescription><![CDATA[./@salary]]></fieldDescription>
    </field>
    <background>
        <band splitType="Stretch"/>
    </background>
    <columnHeader>
        <band height="50">
            <staticText>
                <reportElement uuid="c3d42e71-672e-402f-9fbb-4889be2a269b" x="29" y="2" width="100" height="20"/>
                <textElement/>
                <text><![CDATA[ID]]></text>
            </staticText>
            <staticText>
                <reportElement uuid="a4c42dc4-4276-485a-b5a6-b4e6bd2bc217" x="136" y="2" width="100" height="20"/>
                <textElement/>
                <text><![CDATA[Name]]></text>
            </staticText>
            <staticText>
                <reportElement uuid="157e527b-7ad5-46bf-a06d-2fa0a2686b1e" x="253" y="2" width="100" height="20"/>
                <textElement/>
                <text><![CDATA[Email]]></text>
            </staticText>
            <staticText>
                <reportElement uuid="4d87c542-7057-4bc1-9a7e-fbd6a554f33a" x="386" y="2" width="100" height="20"/>
                <textElement/>
                <text><![CDATA[Salary]]></text>
            </staticText>
        </band>
    </columnHeader>
    <detail>
        <band height="21" splitType="Stretch">
            <textField>
                <reportElement uuid="31d09543-a128-469a-be38-3d8987ba781b" x="29" y="0" width="100" height="20"/>
                <textElement/>
                <textFieldExpression><![CDATA[$F{id}]]></textFieldExpression>
            </textField>
            <textField>
                <reportElement uuid="ce5c11f8-68da-4efd-93fa-e1f1b5ce407f" x="136" y="0" width="100" height="20"/>
                <textElement/>
                <textFieldExpression><![CDATA[$F{name}]]></textFieldExpression>
            </textField>
            <textField>
                <reportElement uuid="300dcc3b-8a2a-489d-8518-7283c95b2f88" x="253" y="0" width="100" height="20"/>
                <textElement/>
                <textFieldExpression><![CDATA[$F{email}]]></textFieldExpression>
            </textField>
            <textField>
                <reportElement uuid="a37f2df9-2459-446d-bc47-488a336aa60e" x="386" y="0" width="100" height="20"/>
                <textElement/>
                <textFieldExpression><![CDATA[$F{salary}]]></textFieldExpression>
            </textField>
        </band>
    </detail>
    <pageFooter>
        <band height="40" splitType="Stretch">
        <printWhenExpression><![CDATA[new Boolean($V{PAGE_NUMBER}.intValue() == 1)]]></printWhenExpression>
            <textField>
                <reportElement uuid="3d9beff7-69b8-44d9-af80-2962b9262368" x="29" y="12" width="80" height="20"/>
                <textElement textAlignment="Left"/>
                <textFieldExpression><![CDATA["Page: "+$V{PAGE_NUMBER}]]></textFieldExpression>
            </textField>
        </band>
    </pageFooter>
</jasperReport>

自定义报表填充程序实现:(这会将高度重置逻辑处理为确保详细信息从第2页起延伸更长时间)

Custom report-filler implementation: (this handles the height resetting logic to ensure detail band stretches longer from page 2 onwards)

public class CustomVerticalFiller extends JRVerticalFiller {

    private JRFillBand detailBand = null;

    private int pageNumber = -1;

    protected CustomVerticalFiller(JasperReportsContext jasperReportsContext, JasperReport jasperReport) throws JRException {
        super(jasperReportsContext, jasperReport);

        detailBand = detailSection.getFillBands()[0];
    }

    // this method gets called after each detail band row is filled
    protected void resolveBandBoundElements(JRFillBand band, byte evaluation) throws JRException {
        if(band == detailBand) {
            if((detailBand.getBreakHeight() > columnFooterOffsetY - offsetY) && (columnIndex == columnCount - 1)) {
                // we have reached end of a page

                pageNumber++;

                // we reset the offset when we are at the end of page 2, so that jasper continues to fill data
                if(pageNumber == 1) {
                    columnFooterOffsetY += pageFooter.getHeight();
                }
            }
        }
    }
}

实际使用自定义填充程序导出PDF的Java代码:

InputStream inputStream = new FileInputStream(new File(<my jrxml file path>));

JRDataSource dataSource = new JRXmlDataSource(new File(<my source xml file path>), "//employee");

Map parameters = new HashMap();

JasperDesign jasperDesign = JRXmlLoader.load(inputStream);
JasperReport jasperReport = JasperCompileManager.compileReport(jasperDesign);

CustomVerticalFiller customVerticalFiller = new CustomVerticalFiller(DefaultJasperReportsContext.getInstance(), jasperReport);
JasperPrint jasperPrint = customVerticalFiller.fill(parameters, dataSource);

JasperExportManager.exportReportToPdfFile(jasperPrint, <target pdf file path>);

这篇关于仅在第一页上打印页脚的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆