【问题标题】:How to get the content of PDF form text fields using pdfbox?如何使用 pdfbox 获取 PDF 表单文本字段的内容?
【发布时间】:2014-12-03 22:02:21
【问题描述】:

我正在使用它来使用 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 获取它?

【问题讨论】:

  • 包含可编辑文本字段的 PDF 表单。 - 哪种表单?旧的 AcroForm 表格还是 XFA 表格?
  • 如果是 Acroforms 那么我推荐源代码包中的 PrintFields.java 示例。
  • 有没有办法从表单本身判断它是哪种类型的表单?

标签: java pdf pdfbox


【解决方案1】:

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

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

}

【讨论】:

  • PDFieldTreeNode 不在 jar 版本 1.8.12 中是否有替代方法
  • @Mayank 上面的代码适用于版本 2.*。要在 1.8.* 中使用它,只需将类型更改为 PDField。不是 100% 肯定,但快速查看文档表明了这一点。链接:pdfbox.apache.org/docs/1.8.12/javadocs/org/apache/pdfbox/…
  • 谢谢,但我想要一个严格用于 1.8.* 的解决方案。反正我已经解决了。还是谢谢。
  • List&lt;PDFieldTreeNode&gt; fields = form.getFields(); 对于 2.0.* 来说绝对不正确。此外,您的代码仅循环通过顶级字段。请参阅 javadoc。最好使用getFieldIterator()
【解决方案2】:

PDFieldTreeNode 似乎不再受支持。试试PDField

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-22
    • 1970-01-01
    • 1970-01-01
    • 2014-10-13
    • 1970-01-01
    • 2021-01-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多