2017-03-29 7 views
1

Je suis l'ajout d'un PdfTextFormField sur une cellule de tableau à l'aide d'un moteur de rendu personnalisé, comme par exemple le code iText7 dans CreateFormInTable.java. Cela fonctionne d'abord, jusqu'à ce que je crée un tableau à la page 3 ou ultérieure du PDF, à quel point je me fais une exception:Exception lors de l'ajout d'un PdfFormField à un grand PDF

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. 

Il semble assez facile à reproduire, et je peux fournir un échantillon de code complet si vous voulez, mais un moyen simple de voir le problème est d'insérer:

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)); 
} 

directement après le constructeur de document dans le fichier exemple mentionné ci-dessus iText7 Java à:

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

Je l'ai testé sur 7.0.1 et 7.0.2, avec le même résultat.

Répondre

0

Eh bien, actuellement certaines des fonctionnalités liées à la forme requiert toute la structure du document PDF en mémoire pour fonctionner. Cela signifie qu'aucun objet ne peut être rincé. Mais la mise en page DocumentRenderer vide les pages lorsque cela est possible. Le problème se reproduit uniquement pour trois pages ou plus, car il existe une petite "fenêtre" de pages non rincées.

C'est en effet pas mentionné dans l'échantillon et peut être amélioré à l'avenir. Dans la version actuelle, pour obtenir le PDF de votre choix, vous pouvez définir le Document pour fonctionner en mode « report de rinçage » en utilisant le constructeur suivant:

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

Merci, Alexey. Cela a bien fonctionné. – Vernon