从PDF中提取xdp或xfa

ars*_*bon 7 pdf adobe xfa xdp-pdf

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

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

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

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

rhe*_*ens 5

组成XFA 的XML文档(以XDP格式)存储为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>
Run Code Online (Sandbox Code Playgroud)

任何提供对PDF对象的低级访问的PDF库都可用于提取XML文档.只需浏览目录 > AcroForm > 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();
Run Code Online (Sandbox Code Playgroud)

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

org.w3c.dom.Node datasets = xfa.getDatasetsNode();
Run Code Online (Sandbox Code Playgroud)