iText 7.0.5 - 表单 - 添加大量带有表单字段的表时出现 NullPointerException

2024-02-27

我用了布鲁诺的例子(https://developers.itextpdf.com/examples/form-examples/clone-create-fields-table https://developers.itextpdf.com/examples/form-examples/clone-create-fields-table) 将表单字段添加到新创建的文档中的表格中。该示例本身运行没有任何问题,但如果我想创建 50 个表,则会出现以下异常:

Exception in thread "main" java.lang.NullPointerException
    at com.itextpdf.kernel.pdf.PdfDictionary.get(PdfDictionary.java:552)
    at com.itextpdf.kernel.pdf.PdfDictionary.getAsArray(PdfDictionary.java:156)
    at com.itextpdf.kernel.pdf.PdfPage.getAnnotations(PdfPage.java:743)
    at com.itextpdf.kernel.pdf.annot.PdfAnnotation.getPage(PdfAnnotation.java:427)
    at com.itextpdf.forms.fields.PdfFormField.regenerateField(PdfFormField.java:1781)
    at com.itextpdf.forms.fields.PdfFormField.setValue(PdfFormField.java:1043)
    at com.itextpdf.forms.fields.PdfFormField.setValue(PdfFormField.java:1004)
    at com.itextpdf.forms.fields.PdfFormField.setValue(PdfFormField.java:999)
    at com.itextpdf.forms.fields.PdfFormField.createText(PdfFormField.java:469)
    at com.itextpdf.forms.fields.PdfFormField.createText(PdfFormField.java:410)
    at com.itextpdf.forms.fields.PdfFormField.createText(PdfFormField.java:391)
    at CreateFormInTable$MyCellRenderer.draw(CreateFormInTable.java:62)
    at com.itextpdf.layout.renderer.TableRenderer.drawChildren(TableRenderer.java:1023)
    at com.itextpdf.layout.renderer.AbstractRenderer.draw(AbstractRenderer.java:458)
    at com.itextpdf.layout.renderer.TableRenderer.draw(TableRenderer.java:948)
    at com.itextpdf.layout.renderer.DocumentRenderer.flushSingleRenderer(DocumentRenderer.java:138)
    at com.itextpdf.layout.renderer.RootRenderer.processRenderer(RootRenderer.java:349)
    at com.itextpdf.layout.renderer.RootRenderer.shrinkCurrentAreaAndProcessRenderer(RootRenderer.java:338)
    at com.itextpdf.layout.renderer.RootRenderer.addChild(RootRenderer.java:236)
    at com.itextpdf.layout.RootElement.add(RootElement.java:109)
    at com.itextpdf.layout.Document.add(Document.java:143)
    at CreateFormInTable.manipulatePdf(CreateFormInTable.java:45)
    at CreateFormInTable.main(CreateFormInTable.java:25)

我在 Windows 8 Enterprise 上使用 Java 1.8.0_121。

修改后的manipulatePdf方法如下所示:

protected void manipulatePdf(String dest) throws Exception {
    PdfDocument pdfDoc = new PdfDocument(new PdfWriter(dest));
    Document doc = new Document(pdfDoc);

    for (int i = 0; i < 50; i++) {
        System.out.println(i);
        Table table = new Table(2);
        Cell cell;
        cell = new Cell().add("Name:");
        table.addCell(cell);
        cell = new Cell();
        cell.setNextRenderer(new MyCellRenderer(cell, "name" + i));
        table.addCell(cell);
        cell = new Cell().add("Address");
        table.addCell(cell);
        cell = new Cell();
        cell.setNextRenderer(new MyCellRenderer(cell, "address" + i));
        table.addCell(cell);
        doc.add(table);
    }
    doc.close();
}

生成 NPE 的完整示例可以在此处找到:https://github.com/trettstadtnlb/itext-table-form-fields https://github.com/trettstadtnlb/itext-table-form-fields

有没有人经历过这种行为或者可以确认这是一个错误?


使用更少的内容很容易在 iText 7.0.x 中重现此行为:

PdfDocument pdfDoc = new PdfDocument(new PdfWriter(dest));
Document doc = new Document(pdfDoc);
doc.add(new AreaBreak(AreaBreakType.NEXT_PAGE));
doc.add(new AreaBreak(AreaBreakType.NEXT_PAGE));

PdfTextFormField field = PdfFormField.createText(pdfDoc, new Rectangle(100, 100, 300, 20), "name", "");
PdfAcroForm form = PdfAcroForm.getAcroForm(pdfDoc, true);
form.addField(field);

doc.close();

这背后的问题是,对于没有关联页面的表单字段(小部件),iText 尝试通过迭代所有文档页面并查找它们各自的注释数组来确定小部件所在的页面。并且它已经这样做了createText,同时设置字段值(并更新小部件外观)...

不过,在上面的代码中,之前新创建的页面(至少是第一个页面)已经被刷新到写入器并在内存中取消初始化。因此,页面上的循环尝试从未初始化的页面字典中检索值,即从null Map,因此NullPointerException.

我不知道这是 iText 中的错误还是仅仅是反模式。


受到@SamuelHuylebroeck评论的启发,我尝试了OP的原始代码和上面的简化代码immediateFlush set to false。事实上,这可以防止异常,并且简化代码的结果看起来不错。然而,OP原始代码的结果并不像他预期的那样,该表是跨四页构建的,但所有字段都出现在最后一页上!

因此,如果表单元素是直接创建的(即不通过事件)设置immediateFlush to false可以被认为是解决方法 (but 不是修复因为早期刷新是 iText 的一个重要特性)。不过,表单创建的一般情况已被破坏,除非有人可以指出这里的代码是 iText 7 反模式并且可以展示应该如何完成。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

iText 7.0.5 - 表单 - 添加大量带有表单字段的表时出现 NullPointerException 的相关文章

  • 对 IText 7 中的所有 PDF 页面使用单一模板

    我有以下内容PDF模板这对于所有的应该是一致的pages添加到我正在创建的 PDF 中 问题是 我只得到这个模板Page 1仅适用于其余页面空白模板已使用 这是现在正在使用的代码 PdfDocument pdfDoc new PdfDocu
  • 在同一页面中在 ColumnDocumentRenderer 和 DocumentRenderer 之间切换?

    我正在使用 iText7 测试一些东西 我有一个场景 我需要在顶部有 DocumentRenderer 段落 然后在同一页面上在其正下方启动 ColumnDocumentRender 2 列 我遇到的问题是 当我更改同一页面上的内容时 它会
  • 每个 iText 文档多个渲染器:更新了更多详细信息

    我正在使用 iText7 创建一个包含多个部分的文档 有些部分要正常格式化 但有些要格式化为列 我可以使用 ColumnDocumentRenderer 对象将其正确格式化为列 但是当我这样做时 整个文件设置为使用列 有什么方法可以让 iT
  • 遍历整个 PDF 并将蓝色更改为黑色(同时更改下划线的颜色)+ iText

    我正在使用下面的代码从 pdf 文本中删除蓝色 它运行良好 但它不是改变下划线颜色 而是正确改变文本颜色 原始文件部分 被操纵的文件 正如您在上面的操作文件中看到的 下划线颜色没有改变 两周以来我一直在寻找解决这个问题的方法 任何人都可以帮
  • 如何使用 iText 7 添加页眉和页脚到 PDF

    使用 iTextSharp 您可以通过将事件附加到 PDF 来将页眉 页脚添加到 PDF 如以下 SO 答案中所述 https stackoverflow com a 19004392 我怎样才能用 iText 7 做同样的事情 这个链接有
  • Visual Studio 更新是否会破坏 iText7?

    我在使用 iText7 7 1 6 和 Visual Studio 2019 时遇到问题 我的程序已经运行一年了 但刚刚将 Visual Studio 社区 从 16 6 1 更新到版本 16 6 2 我进行了重建 但没有更改任何内容 现在
  • iText7 以错误的顺序读出行

    我试图读出 pdf 文档表 但遇到问题 如果我经常打开 PDF 它显示为 item tab item tab item tab item tab item item tab item tab item tab item tab item i
  • iText 7 - 最后一页上的页脚不同 - PdfDictionary 中的空指针

    我正在尝试在中实现页脚iText7 文档最后一页的页脚应该不同 我添加了一个事件处理程序 该事件处理程序在文档关闭时调用 但尝试循环页面会导致空指针异常 java lang NullPointerException at com itext
  • 我的签名结构干扰了使用 itext7 嵌入签名

    我在我的应用程序中使用 itext7 版本 7 1 5 我的场景如下 获取文档的哈希值 从外部签名服务器对哈希进行签名并获取 Pkcs7 使用itext7将签名的pkcs7嵌入到PDF文档中 嵌入 adobe 后无法验证我在文档中的签名 当
  • 从pdf文档中提取图像

    我知道以前也有人问过类似的问题 但是它们已经过时了 有些可以追溯到 2006 年 我有一个 net 3 5 应用程序 带有 iTextSharp 5 我正在转换为 net core iText 7 它从 FedEx 跟踪文档中提取签名 并通
  • 在 iText 中操作路径、颜色等

    我需要分析PDF文件的路径数据并使用iText 7操作内容 操作包括删除 替换和着色 我可以使用如下代码来分析图形 public class ContentParsing public static void main String arg
  • 从文档大纲(书签)中获取页码

    我正在使用 itext7 库来操作一些现有的 PDF 由于某种原因 我无法从大纲中获取页码 我想我应该以某种方式从Pdf目的地 http itextsupport com apidocs itext7 latest com itextpdf
  • iText 7 - HTML 到 PDF 写入 MemoryStream 而不是文件

    我正在使用 iText 7 特别是HtmlConverter ConvertToDocument方法 将 HTML 转换为 PDF 问题是 我真的不想在我的服务器上创建 PDF 文件 我宁愿在内存中完成所有操作 然后将其发送到用户浏览器 以
  • 使用 itext 7 将页码文本添加到 pdf 副本中进行翻转/镜像

    所以 我一直在尝试使用 itext 文档中提供的示例来合并文档并为合并结果创建目录 但是向每个页面添加页码文本的部分并没有像我预期的那样工作 发生的情况是添加的文本在某个水平轴上翻转 如下图所示 另外 用于为添加的文本设置固定位置的方法的
  • 创建表格时如何提高 iText 性能

    嘿 很棒的 Stackoverflow 人 我目前正在评估我们是否应该使用 iText 7 1 9 for Java 还是 C 为此 我创建了一个测试用例 其中我编写了一个包含一堆页面的 PDF 每个页面都包含一个大表格 代码如下 在 Ja
  • iText 7.0.5 - 表单 - 添加大量带有表单字段的表时出现 NullPointerException

    我用了布鲁诺的例子 https developers itextpdf com examples form examples clone create fields table https developers itextpdf com e
  • 使用 PdfMerger iText7 将 PdfDocument 转换为 byte[]

    我有一个要求 我使用生成不同的 pdf iText 7 1 11 我在用PdfMerger即时合并所有 pdf 我能够在本地系统成功生成 pdf 但应用程序需要发送bye 作为回应 我找到的解决方案here https kb itextpd
  • Itext 7 - PdfReader 未使用所有者密码打开错误

    I am using This example https developers itextpdf com content itext 7 jump start tutorial examples chapter 5 for the lat
  • 如何防止 itext7.pdfhtml 创建的 PDF 中的文本跨页中断?

    我正在使用 itext7 版本 7 1 2 和 itext7 pdfhtml 版本 2 0 2 从一些包含不得跨页面中断的元素 例如图形及其随附文本 的 HTML 生成 PDF 我尝试过使用显式分页符 正如在我们的旧版 iTextSharp
  • iText7:如何获取段落的实际宽度

    在添加到文档之前 我需要知道段落的宽度 以磅为单位 我在这里搜索并找到了 Alexey 关于段落高度的答案 所以我用宽度做了它 但它不起作用 无论段落有多长 始终返回矩形的宽度 我尝试了这段代码 private float getRealP

随机推荐