java - 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
解决方案
我自己发现了问题所在
在我的代码中,我使用虚拟器来最小化内存利用率并避免系统遇到内存不足异常。你可以在这里阅读更多
final JRGzipVirtualizer virtualizer = new JRGzipVirtualizer(10);
.
. // other code
.
virtualizer.setReadOnly(true);
new JRGzipVirtualizer(10) 意味着它一次只在内存中保留 10 页,并以压缩形式存储。我还将虚拟器的只读模式覆盖为 true。这就是导致我的问题的原因。它不允许我们在生成 JasperPrint 对象后对其进行覆盖
解决方案:删除代码virtualizer.setReadOnly(true);
推荐阅读
- reactjs - Mapbox-GL-JS + REACT:链接单选按钮以切换地图的图层
- c# - 端口不关闭
- php - 使用存储库模式时已在使用接口名称
- javascript - 每天发送邮件
- c# - 如何在文本框中显示由多个连接组成的数据库选择?
- javascript - 如何在点击时删除多个播放列表项?
- python - 对python字节文字感到困惑
- amazon-web-services - Athena 对布尔列没有显示任何值,使用胶水爬虫创建的表
- salesforce - 每 x 天重复 Salesforce Workflow 操作
- javascript - googleapis npm 模块和 webpack 包错误