【发布时间】:2018-10-18 13:14:01
【问题描述】:
我正在尝试在iText7 中实现页脚,文档最后一页的页脚应该不同,我添加了一个事件处理程序,该处理程序在文档关闭时调用,然后尝试循环遍历页面导致空指针异常:
java.lang.NullPointerException
at com.itextpdf.kernel.pdf.PdfDictionary.get(PdfDictionary.java:482)
at com.itextpdf.kernel.pdf.PdfDictionary.get(PdfDictionary.java:152)
at com.itextpdf.kernel.pdf.PdfPage.newContentStream(PdfPage.java:777)
at com.itextpdf.kernel.pdf.PdfPage.newContentStreamBefore(PdfPage.java:212)
这是我要实现的代码:
private void onCloseDocument(
final PdfDocument document, final float xpos, final float ypos)
{
for (int i = 1; i <= document.getPdfDocument().getNumberOfPages(); i++)
{
final PdfPage page = document.getPdfDocument().getPage(i);
final PdfCanvas canvas =
new PdfCanvas(page.newContentStreamBefore(), page.getResources(), document.getPdfDocument());
canvas.beginText();
canvas.setFontAndSize(document.getFont(), FONT_SIZE);
canvas.setLeading(14.4F);
canvas.moveText(xpos, ypos);
if (i == document.getPdfDocument().getNumberOfPages())
{
canvas.showText("Last page");
}
else
{
canvas.showText("Another page");
}
canvas.endText();
canvas.stroke();
canvas.release();
}
}
最初我认为这很有效,因为我插入了一个单独的区域分隔符以使 pdf 分成两页,但是当我添加更多内容并且页面自然增加时,我得到了这个异常,同样我现在已经通过尝试进行了测试插入多个区域中断,我得到相同的异常。
注意* 我发现如果在创建文档时将 immediateFlush 设置为 false,则不会出现此问题。
这样做是否会对性能造成重大影响\不利因素?
【问题讨论】:
-
“这样做是否会对性能造成重大影响\缺点?” - 缺点是您使用更多内存,因为更多的 pdf 文件保存在内存中,直到结束。通常,itext 会尝试将数据写入输出流并尽早释放内存,以免留下太大的内存占用,将
immediateFlush设置为false可以防止这种情况发生。 -
我想了很多,有问题的 pdf 永远不会超过 5-6 页,所以我想这将取决于 NFT。您是否知道一种更合适的基于 Java 的方法来解决特定页面上不同的页脚问题?
-
"你知道更合适的基于 java 的方法吗..." - 如果你使用普通的事件监听器生成页眉和页脚,你可以给那个事件监听器某种方法向它发出信号,下一个事件将针对特殊情况。然后你可以在你的代码中触发这个方法,在适当的时候添加内容。
-
你有类似例子的链接吗?这是我尝试过的,但无法判断它是结束页面事件中的最后一页或插入页面事件侦听器,所以我在这里错过了一些东西。我已经有一个 n 页脚的工作页 x,但无法调整它来检测最后一页。我将有两个页脚,第 x 页,共 n 页,然后一个页脚在除最后一页之外的所有页面上都相同。
-
查看我的答案,它包含一个概念验证。