将 PdfFormField 添加到大 PDF 时出现异常

Exception when adding a PdfFormField to a big PDF

我正在使用自定义渲染器在 Table 单元格上添加 PdfTextFormField,按照 CreateFormInTable.java 中的 iText7 示例代码。这最初有效,直到我在 PDF 的第 3 页或更高版本上创建 Table,此时我遇到异常:

Caused by: 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:746)
at ...pdf.annot.PdfAnnotation.getPage(PdfAnnotation.java:435)
at ...forms.fields.PdfFormField.regenerateField(PdfFormField.java:1761)
at ...forms.fields.PdfFormField.setValue(PdfFormField.java:1038)
at ...forms.fields.PdfFormField.setValue(PdfFormField.java:999)
at ...forms.fields.PdfFormField.setValue(PdfFormField.java:994)
etc.

似乎很容易重现,如果你愿意,我可以提供完整的代码示例,但查看问题的简单方法是插入:

for (int i=1; i < 2; i++)  // Change 2 to 3 and you get an NPE
{
    Paragraph  para = new Paragraph("Page "+ i);
    doc.add( para );
    doc.add( new AreaBreak( AreaBreakType.NEXT_PAGE ) );
}

在上述 iText7 Java 示例文件中的文档构造函数之后直接位于:

http://developers.itextpdf.com/examples/form-examples/clone-create-fields-table#2350-createformintable.java

我在 7.0.1 和 7.0.2 上测试过,结果相同。

嗯,目前一些与表单相关的功能需要整个 PDF 文档结构都在内存中才能运行。这意味着不能刷新任何对象。但是布局的 DocumentRenderer 会尽可能刷新页面。该问题仅在三个或更多页面上重现,因为有一小部分 "window" 未刷新的页面。

样本中确实没有提到这一点,以后可以改进。在当前版本中,要获得所需的 PDF,您可以使用以下构造函数将 Document 设置为在 "postpone flushing" 模式下运行:

Document doc = new Document(pdfDoc, PageSize.A4, false);