How do I get all the fields and value from a PDF f

2020-02-06 17:11发布

问题:

Using the code below, I'm trying to get all the fields and their values, but it's only returning the field values. What do I need to do to get both?

   package PrintFiled;
    /*

        Usage: java TestDocument <pdf file>

    */

    import java.io.File;
    import java.io.FileOutputStream;
    import java.util.Collection;

    import java.util.HashMap;
    import java.util.List;
    import java.util.Iterator;
    import java.util.Map;

    import org.pdfbox.pdmodel.interactive.form.PDField;

    import com.lowagie.text.pdf.AcroFields;
    import com.lowagie.text.pdf.MultiColumnText;
    import com.lowagie.text.pdf.PdfDictionary;
    import com.lowagie.text.pdf.RadioCheckField;
    import com.lowagie.text.pdf.PdfSignature;

    import com.lowagie.text.pdf.PdfReader;
    import com.lowagie.text.pdf.PdfStamper;
    import com.lowagie.text.pdf.AcroFields;
    import com.lowagie.text.pdf.AcroFields.*;

    public class TestDocument
    {
        public static void main(String[] args) throws Exception
        {

            // get the destination

            String location = "test/";

            if (location != null && !location.endsWith(File.separator))

            {

            location = location + File.separator;

            }



            PdfReader reader = new PdfReader(location + "acc.pdf");

            String name = "Output.pdf";

            PdfStamper stamp = new PdfStamper(reader, new FileOutputStream(location + name));

            AcroFields form = stamp.getAcroFields();


            String last = "subform[0].LastName[0]";

            String first = "subform[0].FirstName[0]";

            String ProcessDate="subform[0].ProcessDate[0]";

            form.setField(last, "HRISTOV");

            form.setField(first, "NEDKO");
            form.setField(ProcessDate, "Process");

            System.out.println("last Name  :"+last.toString());


            Map val =new HashMap();
            //val=form.getFieldCache();
            //System.out.println("Value   :"+val);
             Iterator it = val.entrySet().iterator();
             while (it.hasNext()) 
                {
                    Map.Entry pairs = (Map.Entry)it.next();
                    System.out.println("Key   :"+pairs.getKey() + " = "+"Value  :" + pairs.getValue());
                }

                    Collection fieldlist = form.getFields().keySet();
    //              for (Iterator i = val.iterator(); i.hasNext(); ) 
                         for (Iterator i = fieldlist.iterator(); i.hasNext(); ) 
                                {

                                    System.out.println(i.next().toString());

                                System.out.println("Value    :"+val);
                                }
            /*List fields = form.getFields();
            Iterator fieldsIter = fields.iterator();

            System.out.println(new Integer(fields.size()).toString()
                    + " top-level fields were found on the form");

         while (fieldsIter.hasNext()) {
                PDField field = (PDField) fieldsIter.next();
               // processField(field, "|--", field.getPartialName());
                System.out.println("Field  :"+fieldsIter);
           }
             */
            System.out.println("First Name:"+form.getField(first));
            System.out.println("LastName  :"+form.getField(last));
            System.out.println("ProcessDate :"+form.getField(ProcessDate));

            // close pdf stamper
            stamp.setFormFlattening(true);
            stamp.close();
            reader.close();
        }
    }

回答1:

To get all the fields and their values with iText:

// you only need a PdfStamper if you're going to change the existing PDF.
PdfReader reader = new PdfReader( pdfPath );

AcroFields fields = reader.getAcroFields();

Set<String> fldNames = fields.getFields().keySet();

for (String fldName : fldNames) {
  System.out.println( fldName + ": " + fields.getField( fldName ) );
}

Beyond that, it would help if we could see a PDF that is giving you trouble.



回答2:

Here's the answer updated for iText version 7.0.2:

PdfReader reader = new PdfReader( pdfPath );
PdfDocument document = new PdfDocument(reader);
PdfAcroForm acroForm = PdfAcroForm.getAcroForm(document, false);
Map<String,PdfFormField> fields = acroForm.getFormFields();
for (String fldName : fields.keySet()) {
  System.out.println( fldName + ": " + fields.get( fldName ).getValueAsString() );
}
document.close();
reader.close();


标签: pdf itext