【问题标题】:How do I get all the fields and value from a PDF file using iText?如何使用 iText 从 PDF 文件中获取所有字段和值?
【发布时间】:2011-05-19 09:18:58
【问题描述】:

使用下面的代码,我试图获取所有字段及其值,但它只返回字段值。我需要做什么才能同时获得两者?

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

【问题讨论】:

  • 从您的 cmets 来看,尚不清楚您的期望。您的代码适用于某些 PDF,但不适用于其他 PDF?我想他们有不同的字段名称。

标签: pdf itext


【解决方案1】:

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

除此之外,如果我们能看到给您带来麻烦的 PDF,那将会有所帮助。

【讨论】:

  • 请注意,有两种不同类型的 PDF 表单。 “AcroForms”是较旧/仍在使用的技术,以及命运多舛的 XFA,现已弃用。
【解决方案2】:

这是针对 iText 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();

【讨论】:

  • 嗨,Mike Godin,我不是开发人员,我想免费做一些工作,边学习边学习。我使用了您的代码并在“PdfDocument document = new PdfDocument(reader);”这一行上我收到错误“构造函数 PdfDocument(PdfReader) 未定义”。我将阅读器设置为“PdfReader reader = new PdfReader("/E1.pdf");”。
  • 可能是版本问题...您使用的是什么版本的 iText?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-27
  • 1970-01-01
  • 2011-05-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多