将 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 示例文件中的文档构造函数之后直接位于:
我在 7.0.1 和 7.0.2 上测试过,结果相同。
嗯,目前一些与表单相关的功能需要整个 PDF 文档结构都在内存中才能运行。这意味着不能刷新任何对象。但是布局的 DocumentRenderer
会尽可能刷新页面。该问题仅在三个或更多页面上重现,因为有一小部分 "window" 未刷新的页面。
样本中确实没有提到这一点,以后可以改进。在当前版本中,要获得所需的 PDF,您可以使用以下构造函数将 Document
设置为在 "postpone flushing" 模式下运行:
Document doc = new Document(pdfDoc, PageSize.A4, false);
我正在使用自定义渲染器在 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 示例文件中的文档构造函数之后直接位于:
我在 7.0.1 和 7.0.2 上测试过,结果相同。
嗯,目前一些与表单相关的功能需要整个 PDF 文档结构都在内存中才能运行。这意味着不能刷新任何对象。但是布局的 DocumentRenderer
会尽可能刷新页面。该问题仅在三个或更多页面上重现,因为有一小部分 "window" 未刷新的页面。
样本中确实没有提到这一点,以后可以改进。在当前版本中,要获得所需的 PDF,您可以使用以下构造函数将 Document
设置为在 "postpone flushing" 模式下运行:
Document doc = new Document(pdfDoc, PageSize.A4, false);