从PDF中提取xdp或xfa

时间:2013-09-03 08:50:01

标签: pdf adobe xfa xdp

我使用Adobe LiveCycle Designer创建了一个PDF表单。我现在正努力在PDF填写完成后以编程方式提取数据。

我尝试使用poppler(qt4绑定,但我想这没关系),但显然poppler无法处理XFA表单。虽然evince和okular能够显示表单......

据我了解,PDF包含一个XDP,而XDP又包含XFA表单。我的问题是,如何从PDF中提取数据?

如果有库,c ++,java,python或PHP是我的选择。

1 个答案:

答案 0 :(得分:5)

构成XFA的XML文档( XDP格式)存储为<​​strong> AcroForm 字典中 XFA 键的值(交互式表格字典)。 AcroForm 字典是从目录字典(PDF文档的)引用的。

XFA 值可以是流或流数组。如果它是一个流,它包含整个XML文档。如果它是一个数组,则不同的流包含单独的XDP数据包。连接它们将提供完整的XML文档。

其中一个XDP数据包是 dataSets 数据包。实际表单数据将位于此数据包的子元素中: xfa:data 。例如:

<xfa:dataSets xmlns:xfa="http://www.xfa.org/schema/xfa-data/1.0/">
  <xfa:data>
    <!-- arbitrary XML data, e.g.: -->
    <Employee>
      <FirstName>John</FirstName>
      <Name>Doe</Name>
    </Employee>
  </xfa:data>
</xfa:dataSets>

任何提供对PDF对象的低级访问的PDF库都可用于提取XML文档。只需浏览目录&gt; AcroForm &gt;的 XFA

某些PDF库可能提供更高级别的便捷方法。

免责声明:我是iText软件员工。) 例如,使用iText(Java),您只需执行此操作即可将XFA作为org.w3c.dom.Document

PdfReader reader = new PdfReader(pdfFile);
XfaForm xfa = reader.getAcroFields().getXfa();
org.w3c.dom.Document doc = xfa.getDomDocument();

或者只是将 dataSets 数据包作为org.w3c.dom.Node获取:

org.w3c.dom.Node datasets = xfa.getDatasetsNode();