首页 > 解决方案 > JapserReport 中的覆盖页码未反映在最终 PDF 中

问题描述

我正在尝试将其导出List<JapserPrint>为单个 PDF 文件。因为我正在处理多个 JapserPrint 对象,所以我需要在 java 代码中动态更改页码。

我尝试了以下解决方案

我从 List 中创建了一个父 JapserPrint 对象

private void overridePageNumbers(final JasperPrint parentJapserPrint) {

    final int totalPages = jasperPrints.getPages().size();

    final AtomicInteger currentPageNumber = new AtomicInteger(1);

    final List<JRPrintPage> listPages = parentJapserPrint.getPages();

    for (final JRPrintPage currentPage : listPages) {
        final List listElements = currentPage.getElements();

        for (final Object element : listElements) {
            if (element instanceof JRTemplatePrintText) {
                final JRTemplatePrintText templatePrintText = (JRTemplatePrintText) element;

                // set currrent page
                if (templatePrintText.getKey() != null &&
                        templatePrintText.getKey().equalsIgnoreCase("textFieldCurrentPage")) {
                    LOGGER.info(templatePrintText.getFullText());
                    templatePrintText.setText("Page " + currentPageNumber.getAndIncrement() + " of ");
                    LOGGER.info(templatePrintText.getFullText());
                }

                // set total number of pages
                if (templatePrintText.getKey() != null &&
                        templatePrintText.getKey().equalsIgnoreCase("textFieldNumberOfPages")) {
                    LOGGER.info(templatePrintText.getFullText());
                    templatePrintText.setText(String.valueOf(totalPages));
                    LOGGER.info(templatePrintText.getFullText());
                }
            }
        }
    }
}

    <pageFooter>
    <band height="17">
        <property name="com.jaspersoft.studio.unit.height" value="px"/>
        <textField pattern="EEEEE dd MMMMM yyyy">
            <reportElement mode="Transparent" x="0" y="4" width="100" height="13" uuid="4e52ad3d-806e-45fa-ba2c-0d026ce60568"/>
            <textFieldExpression><![CDATA[new java.util.Date()]]></textFieldExpression>
        </textField>
        <textField>
            <reportElement key="textFieldCurrentPage" mode="Opaque" x="573" y="4" width="192" height="13" uuid="d4f96443-350c-49fe-a0af-60ad86fb0f30"/>
            <textElement textAlignment="Right"/>
            <textFieldExpression><![CDATA["${CURRENT_PAGE_NUMBER}"]]></textFieldExpression>
        </textField>
        <textField evaluationTime="Report">
            <reportElement key="textFieldNumberOfPages" mode="Opaque" x="768" y="4" width="31" height="13" uuid="81bfe333-c59e-415c-b570-9136c4ddf6d7"/>
            <textFieldExpression><![CDATA[" " + $V{PAGE_NUMBER}]]></textFieldExpression>
        </textField>
    </band>
</pageFooter>

在日志的帮助下,似乎正在设置文本值。但最终输出的 PDF 文件不显示被覆盖的值。

18:42:05.967 INFO  com.company.service.ReportService - [n/a] Page 1 of
18:42:05.968 INFO  com.company.service.ReportService - [n/a] Page 1 of 
18:42:05.970 INFO  com.company.service.ReportService - [n/a] Page 2 of
18:42:05.971 INFO  com.company.service.ReportService - [n/a] Page 2 of 
18:42:05.975 INFO  com.company.service.ReportService - [n/a] Page 1 of
18:42:05.975 INFO  com.company.service.ReportService - [n/a] Page 3 of 
18:42:05.977 INFO  com.company.service.ReportService - [n/a] Page 2 of
18:42:05.978 INFO  com.company.service.ReportService - [n/a] Page 4 of 

标签: javajasper-reports

解决方案


我自己发现了问题所在

在我的代码中,我使用虚拟器来最小化内存利用率并避免系统遇到内存不足异常。你可以在这里阅读更多

final JRGzipVirtualizer virtualizer = new JRGzipVirtualizer(10);
.
. // other code
.
virtualizer.setReadOnly(true);

new JRGzipVirtualizer(10) 意味着它一次只在内存中保留 10 页,并以压缩形式存储。我还将虚拟器的只读模式覆盖为 true。这就是导致我的问题的原因。它不允许我们在生成 JasperPrint 对象后对其进行覆盖

解决方案:删除代码virtualizer.setReadOnly(true);


推荐阅读