2016-03-28 3 views
1

Ich habe eine sechsseitige PDF mit einigen acrofields auf jeder Seite. Ich habe Seite gelöscht 4 und 5 folgenden Code:Nullpointer in itextpdf während Formular mit Acrofields Abflachung

List<Integer> pagesToKeep = Arrays.asList(new int[]{ 1, 2, 3 }); 
pdfReader.selectPages(pagesToKeep); 

Aber dann auf Formular Einfrieren folgenden Befehl:

pdfStamper.setFreeTextFlattening(true); 
    pdfStamper.close(); 

Ich erhalte Nullpointer. Der Grund dafür: On Form Abflachen, Acro Felder auf den Seiten definiert sind nicht in der Lage, die Seitennummer zu finden, wie Page 6 nicht mehr existiert.

Exception Trace:

java.lang.NullPointerException 
    at com.itextpdf.text.pdf.PdfStamperImp.flatFields(PdfStamperImp.java:1019) 
    at com.itextpdf.text.pdf.PdfStamperImp.close(PdfStamperImp.java:227) 
    at com.itextpdf.text.pdf.PdfStamper.close(PdfStamper.java:231) 
    at com.ally.bankapi.service.impl.DocumentServiceImpl.generateDocument(DocumentServiceImpl.java:1272) 
    at com.ally.bankapi.service.impl.DocumentServiceImplTest.testGenerateDocumentSuccess(DocumentServiceImplTest.java:111) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:606) 
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44) 
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15) 
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41) 
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20) 
    at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28) 
    at org.junit.runners.BlockJUnit4ClassRunner.runNotIgnored(BlockJUnit4ClassRunner.java:79) 
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:71) 
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:49) 
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193) 
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52) 
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191) 
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42) 
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184) 
    at org.junit.runners.ParentRunner.run(ParentRunner.java:236) 
    at org.mockito.internal.runners.JUnit45AndHigherRunnerImpl.run(JUnit45AndHigherRunnerImpl.java:37) 
    at org.mockito.runners.MockitoJUnitRunner.run(MockitoJUnitRunner.java:62) 
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50) 
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197) 
+0

Sie benötigen ein Objekt mit dem 'new' Befehl oder verwenden Sie' Liste pagesToKeep = Arrays.asList (new int [] {1, 2, 3}) erstellen; ' –

+0

Mein Problem ist Formular Abflachung nach dem Löschen von Seiten dazwischen. pagesToKeep Ich führe zwar durch andere Logik, hier ist es nur zu sagen, dass ich nur einige ausgewählte Seiten behalte. Acrofields auf der letzten Seite führen zu Null-Zeiger während der Formularabflachung. – Narendra

+0

Wie Sie es beschreiben, könnte es einfach ein Fehler sein. – mkl

Antwort

0

bekam ich eine Abhilfe es, statt die Seiten aus aktuellen PDF entfernen, um die ausgewählten Seiten in neue PDF kopieren PdfCopy, wie in unten Kommentar angezeigt: - Narendra 6. April '16 bei 18:18

pdfStamper.setFormFlattening(true); 
pdfStamper.close(); 
pdfReader.close(); 
//Create a new pdfReader which reads the existing baos 
pdfReader = new PdfReader(baos.toByteArray()); 
Document document = new com.itextpdf.text.Document(); 
PdfCopy copy = null; 
ByteArrayOutputStream copyBaos = new ByteArrayOutputStream(); 
//Create Copy of the same. 
copy = new PdfCopy(document, copyBaos); 
document.open(); 
// Keep only selected pages 
copy.addDocument(pdfReader, pagesToKeep); 
Verwandte Themen