1

I have a six page PDF with some acrofields on each page. I have deleted page 4 and 5 using following code :

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

But then on Form freezing using following command :

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

I am getting NullPointerException. Reason for this : On Form Flattening , Acro Fields defined on pages are unable to locate the page number, as Page 6 does not exists any more.

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)
Narendra
  • 151
  • 1
  • 12
  • You need to create an object using the `new` command or use `List pagesToKeep = Arrays.asList(new int[]{ 1, 2, 3 });` – Clark Kent Mar 28 '16 at 18:13
  • My issue is form Flattening after deletion of pages in between. pagesToKeep I am deriving though other logic, here its just to tell that I am keeping only some selected pages. Acrofields on last page are resulting in Null pointer while form flattening. – Narendra Mar 28 '16 at 18:17
  • As you describe it, it might simply be a bug. – mkl Mar 28 '16 at 21:33
  • But is there any workaround for this issue? – Narendra Mar 29 '16 at 15:07
  • I got a workaround it , instead of removing the pages from current PDF, copy the selected pages in new PDF using PdfCopy as shown in below comment : – Narendra Apr 06 '16 at 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); – Narendra Apr 06 '16 at 18:18
  • @Narendra You might want to make your solution comments an actual answer and accept it. – mkl May 01 '16 at 08:10
  • By the way, I tried to reproduce the issue with the current 5.5.10 development version. Unfortunately I cannot reproduce your issue with a PDF made by myself. Thus, there either is something special in your PDF (you might want to share it), or in your code (you might want to share a self-contained, runable example), or in your iText version (you might want to tell it). – mkl May 01 '16 at 08:46
  • I am using 5.4.5 iTextpdf. I have also tried with 5.5.10 version, but faced the same issue. – Narendra May 03 '16 at 16:09

1 Answers1

0

I got a workaround it , instead of removing the pages from current PDF, copy the selected pages in new PDF using PdfCopy as shown in below comment : – Narendra Apr 6 '16 at 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);
mkl
  • 90,588
  • 15
  • 125
  • 265
Narendra
  • 151
  • 1
  • 12