将PdfFormField添加到大PDF

时间:2017-03-29 20:54:13

标签: java pdf itext7

我根据CreateFormInTable.java中的iText7示例代码,使用自定义渲染器在Table单元格上添加PdfTextFormField。这最初是有效的,直到我在PDF的第3页或更高版本上创建一个表,此时我得到了一个例外:

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示例文件中的Document构造函数之后:

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

我已经在7.0.1和7.0.2上对其进行了测试,结果相同。

1 个答案:

答案 0 :(得分:1)

嗯,目前一些与表单相关的功能要求整个PDF文档结构在内存中运行。这意味着不能刷新任何对象。但布局DocumentRenderer会在可能的情况下刷新页面。该问题仅针对三页或更多页面重现,因为有一个小的“窗口”未刷新的页面。

样本中确实没有提到这一点,将来可以进行改进。在当前版本中,要获取所需的PDF,可以使用以下构造函数将Document设置为“推迟刷新”模式:

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