Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/389.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用pdfbox获取PDF表单文本字段的内容?_Java_Pdf_Pdfbox - Fatal编程技术网

Java 如何使用pdfbox获取PDF表单文本字段的内容?

Java 如何使用pdfbox获取PDF表单文本字段的内容?,java,pdf,pdfbox,Java,Pdf,Pdfbox,我使用org.apache.pdfbox获取PDF文件的文本 File f = new File(fileName); if (!f.isFile()) { System.out.println("File " + fileName + " does not exist."); return null; } try { parser = new PDFParser(new FileInp

我使用org.apache.pdfbox获取PDF文件的文本

File f = new File(fileName);  
      if (!f.isFile()) {
             System.out.println("File " + fileName + " does not exist.");
         return null;
    }

        try {
            parser = new PDFParser(new FileInputStream(f));
        } catch (Exception e) {
             System.out.println("Unable to open PDF Parser.");
            return null;
        }
   try {
           parser.parse();
             cosDoc = parser.getDocument();
           pdfStripper = new PDFTextStripper();           
          pdDoc = new PDDocument(cosDoc);
            parsedText = pdfStripper.getText(pdDoc);
        } catch (Exception e) {
            e.printStackTrace();
        }

到目前为止,它对我使用过的PDF非常有效。现在我有了一个PDF表单,其中有可编辑的文本字段。我的代码不返回字段内的文本。我想收到那封信。有没有办法使用PDFBox获取它?

这就是获取AcroForms的键/值的方法:(此特定程序将其打印到控制台。)

package pdf_form_filler;
导入org.apache.pdfbox.pdmodel.PDDocument;
导入org.apache.pdfbox.pdmodel.PDDocumentCatalog;
导入org.apache.pdfbox.pdmodel.interactive.form.*;
导入java.io.File;
导入java.util.*;
公共类pdf\u表格\u填充{
公共静态无效列表字段(PDDocument文档)引发异常{
PDDocumentCatalog=doc.getDocumentCatalog();
PDAcroForm form=catalog.getAcroForm();
列表字段=form.getFields();
用于(PDFieldTreeNode字段:字段){
对象值=field.getValue();
字符串名称=field.getFullyQualifiedName();
系统输出打印(名称);
系统输出打印(“=”);
系统输出打印(值);
System.out.println();
}
}
公共静态void main(字符串[]args)引发异常{
文件=新文件(“test.pdf”);
PDDocument doc=PDDocument.load(文件);
列表字段(doc);
}
}

PDFieldTreeNode
似乎不再受支持。请尝试使用包含可编辑文本字段的PDF表单哪种形式?好的旧AcroForm表单或XFA表单?如果是Acroforms,那么我推荐源代码包中的PrintFields.java示例。有没有办法从表单本身判断它是哪种类型的表单?PDFieldTreeNode不在jar版本1.8.12中,是否有其他方法it@Mayank以上代码适用于vesion 2。*。要与1.8.*一起使用,只需将类型更改为PDField。不是100%确定,但快速查看文档可以看出这一点。链接:谢谢,但我想要一个严格适用于1.8*的解决方案。反正我已经解决了。谢谢你。
List fields=form.getFields()对于2.0.*来说绝对不正确。此外,您的代码只在顶级字段中循环。请参阅javadoc。最好使用
getFieldIterator()
package pdf_form_filler;

import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDDocumentCatalog;
import org.apache.pdfbox.pdmodel.interactive.form.*;
import java.io.File;
import java.util.*;

public class pdf_form_filler {

    public static void listFields(PDDocument doc) throws Exception {
        PDDocumentCatalog catalog = doc.getDocumentCatalog();
        PDAcroForm form = catalog.getAcroForm();
        List<PDFieldTreeNode> fields = form.getFields();

        for(PDFieldTreeNode field: fields) {
            Object value = field.getValue();
            String name = field.getFullyQualifiedName();
            System.out.print(name);
            System.out.print(" = ");
            System.out.print(value);
            System.out.println();
        }
    }

    public static void main(String[] args) throws Exception {
        File file = new File("test.pdf");
        PDDocument doc = PDDocument.load(file);
        listFields(doc);
    }

}