我使用Web上提供的示例来创建一个能够获取XFA表单的xml结构然后将其设置为填充的应用程序 . 重要代码如下所示:
public void readData(String src, String dest)
throws IOException, ParserConfigurationException, SAXException,
TransformerFactoryConfigurationError, TransformerException {
FileOutputStream os = new FileOutputStream(dest);
PdfReader reader = new PdfReader(src);
XfaForm xfa = new XfaForm(reader);
Node node = xfa.getDatasetsNode();
NodeList list = node.getChildNodes();
for (int i = 0; i < list.getLength(); i++) {
if ("data".equals(list.item(i).getLocalName())) {
node = list.item(i);
break;
}
}
Transformer tf = TransformerFactory.newInstance().newTransformer();
tf.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
tf.setOutputProperty(OutputKeys.INDENT, "yes");
tf.transform(new DOMSource(node), new StreamResult(os));
reader.close();
}
public void fillPdfWithXmlData(String src, String xml, String dest)
throws IOException, DocumentException {
PdfReader.unethicalreading = true;
PdfReader reader = new PdfReader(src);
PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(dest), '\0', true);
AcroFields form = stamper.getAcroFields();
XfaForm xfa = form.getXfa();
xfa.fillXfaForm(new FileInputStream(xml));
stamper.close();
reader.close();
}
当我用它来填写这个表格时:http://www.vzp.cz/uploads/document/tiskopisy-pro-zamestnavatele-hromadne-oznameni-zamestnavatele-verze-2-pdf-56-kb.pdf它工作正常,我可以在Acrobat Reader中看到填写的表格 . 但是,如果我在Foxit Reader中打开文档,我会看到一个空白表单(在最新版本和5.x版本中测试) .
我试着玩一下它并得到了这些 XfaForm(...).getDomDocument()
数据:
由Acrobat Reader填写:http://pastebin.com/kXKyh9EM
福昕阅读器填写:http://pastebin.com/tiZ7EmfE
由iText填写:http://pastebin.com/tTKLMERC
由iText填写后由Foxit Reader填写:http://pastebin.com/Uuq0jS4b
被填充的领域是 . 是否可以使用iText,即使使用福昕阅读器也可以使用iText(并保留XFA签名?)
1 回答
在您填写的iText示例中,有一个多余的
<xfa:data>
元素:这是因为
XfaForm
的fillXfaForm()
方法需要没有<xfa:data>
的XML数据作为根元素 . 所以你的XML数据应该如下所示:我看到你的
readData()
方法提取现有的表单数据,包括<xfa:data>
元素:剥离外部元素应该可以解决您的问题 . 例如: