我用创建了一个PDF表单。现在,我很难从PDF文件中以编程的方式提取数据,因为它已经被填充了。
我试着使用poppler ( qt4绑定,但我想这并不重要)来做这件事,但显然poppler不能处理XFA表单。虽然evince和okular能够显示表单..。
据我所知,PDF包含一个XDP,而XDP又包含XFA表单。我的问题是,如何从PDF中提取这些数据?
如果有库,c++、java、python或PHP是我的选择。
发布于 2015-10-23 00:31:48
组成XFA的XML文档( XDP格式)存储为AcroForm字典(交互式表单字典)中的AcroForm键的值。AcroForm字典是从Catalog字典( 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文档。只需浏览Catalog > 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();
或者只是将dataSets数据包作为org.w3c.dom.Node
获取
org.w3c.dom.Node datasets = xfa.getDatasetsNode();
https://stackoverflow.com/questions/18587878
复制相似问题