A predecessor of mine used an old (acrobat 3) SDK to create an API which allows for fields to be placed on a PDF via a small GUI tool. Using iText, I am unable to create an AcroFields object based on the fields created with this tool. I have attached a sample PDF which has a single field (EVENT_DATE) which was added using the tool. The error seems to be deep in the AcroFields class:
Error: java.lang.Exception: Error during field operation: java.lang.Exception: Error getting AcroFields: java.lang.ClassCastException java.lang.ClassCastException at com.lowagie.text.pdf.AcroFields.fill(AcroFields.java:99) at com.lowagie.text.pdf.AcroFields.<init>(AcroFields.java:75) at com.lowagie.text.pdf.PdfStamperImp.getAcroFields(PdfStamperImp.java:305) at com.lowagie.text.pdf.PdfStamper.getAcroFields(PdfStamper.java:215) at AcroFieldTest.main(AcroFieldTest.java:57) The sample code below and the sample PDF attached (created via Acrobat4 and the API) can be used to replicate the error. I have several hundred PDFs that have between 5 and 50 fields which I am hoping to use iText on. Any ideas would be greatly appreciated. Thank you Noah Mattern Enterprise Information Solutions <---- sample code ----> /* * AcroFieldTest.java * * Created on January 21, 2005, 9:46 AM */ /** * * @author Noah Mattern */ import java.util.*; import java.sql.*; import java.io.*; import com.lowagie.text.*; import com.lowagie.text.pdf.*; public class AcroFieldTest { public static void main(String args[]) { try { byte[] pdfBytesOut = null; PdfReader reader = null; ByteArrayOutputStream pdfOutput = null; PdfStamper stamper = null; AcroFields form = null; HashMap fieldInfo = null; String tokenValue = ""; System.out.println("Start"); // a PDF made via old API (attached) String filename = "c:\\temp\\FormFieldsAPI.pdf"; FileInputStream inStream = new FileInputStream( filename ); int byteCount = inStream.available(); byte[] pdfBytes = new byte[byteCount]; inStream.read(pdfBytes, 0, byteCount); // read the PDF into an object reader = new PdfReader( pdfBytes ); // make the output object pdfOutput = new ByteArrayOutputStream(); stamper = new PdfStamper(reader, pdfOutput); // create an AcroFields based on the fields on the form try { stamper.setFormFlattening(true); try{ /******* THIS LINE FAILS *******/ form = (AcroFields) stamper.getAcroFields(); } catch( Exception e ){ e.printStackTrace(); throw new Exception( "Error getting AcroFields: " + e.toString() ); } } catch( Exception e ){ throw new Exception( "Error during field operation: " + e.toString() ); } // close the stamper object try{ stamper.close(); } catch( Exception e ){ System.out.println( "Unable to close the PdfStamper: " + e.toString() ); } System.out.println("End"); } catch( Exception e ) { System.out.println( "Error: " + e.toString() ); } } }
FormFieldsAPI.pdf
Description: Adobe PDF document