我用Adobe LiveCycle Designer创建了一个PDF表单 . 我现在正在努力在填写完毕后以编程方式从PDF中提取数据 .
我尝试使用poppler(qt4绑定,但我想这没关系)这样做,但显然poppler无法处理XFA表单 . 虽然evince和okular能够显示表格......
据我所知,PDF包含一个XDP,而XDP又包含XFA表单 . 我的问题是,如何从PDF中提取数据?
如果有库,c,java,python或PHP是我的选择 .
组成XFA的XML文档(XDP格式)存储为 AcroForm 字典(交互式表格字典)中 XFA 键的值 . AcroForm 字典是从 Catalog 字典引用的(PDF文档的 Root ) .
XFA 值可以是流或流数组 . 如果's a stream, it contains the entire XML document. If it'是一个数组,则不同的流包含单独的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 :
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
org.w3c.dom.Node datasets = xfa.getDatasetsNode();
1 回答
组成XFA的XML文档(XDP格式)存储为 AcroForm 字典(交互式表格字典)中 XFA 键的值 . AcroForm 字典是从 Catalog 字典引用的(PDF文档的 Root ) .
XFA 值可以是流或流数组 . 如果's a stream, it contains the entire XML document. If it'是一个数组,则不同的流包含单独的XDP数据包 . 连接它们将提供完整的XML文档 .
其中一个XDP数据包是dataSets数据包 . 实际表单数据将位于此数据包的子元素中:xfa:data . 例:
任何提供对PDF对象的低级访问的PDF库都可用于提取XML文档 . 只需浏览 Catalog > AcroForm > XFA 即可 .
一些PDF库可能提供更高级别的便捷方法 .
(免责声明:我是iText软件的员工 . )例如,使用iText(Java),您只需执行此操作即可将XFA作为
org.w3c.dom.Document
:或者只是将dataSets数据包作为
org.w3c.dom.Node
获取: