我使用Adobe LiveCycle Designer创建了一个PDF表单。我现在正努力在PDF填写完成后以编程方式提取数据。
我尝试使用poppler(qt4绑定,但我想这没关系),但显然poppler无法处理XFA表单。虽然evince和okular能够显示表单......
据我了解,PDF包含一个XDP,而XDP又包含XFA表单。我的问题是,如何从PDF中提取数据?
如果有库,c ++,java,python或PHP是我的选择。
答案 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();