我正在尝试使用iText(版本5.5.9)编写Java应用程序,以自动化使用某些数据填充动态PDF的过程 . 目前我有代码从文件中读取数据并将它们插入到XFA数据结构中 . 输出PDF文件包含新数据,但问题是输入PDF中的所有隐藏表单都在输出文件中可见 . 关于输入PDF文件(模板)的说明:文件大约有8页,并且正在使用XFA提供动态内容 . 根据所选选项(单选按钮,检查或组合框),某些表单可以是可见的或隐藏的 .
我必须在追加模式下使用PdfStamper,所以目前我有这个代码:
m_Reader = new PdfReader(INPDF_PATH);
m_Stamper = new PdfStamper(m_Reader
, new FileOutputStream(OUTPDF_PATH)
, '\0' // the same pdf version as original file
, true // append mode - fixing adobe's signature and advanced functions problem
);
AcroFields form = m_Stamper.getAcroFields();
m_PdfXfaForm = form.getXfa();
m_XfaFormDocument = m_PdfXfaForm.getDomDocument();
// … Reads data form file and insert them to XML structure (using org.w3c.dom API)
NodeList datasetList = m_XfaFormDocument.getElementsByTagName(TOP_DATA_TAG_NAME);
Node tmp = datasetList.item(0);
m_PdfXfaForm.fillXfaForm(tmp);
m_Stamper.close();
m_Reader.close();
就像我上面写的那样,数据会被附加,但输入PDF中的所有隐藏表单都在输出文件中可见 . 所有单选按钮,检查和组合框都具有与输入文件中相同的值 . 当重置选项时,给定的表单会再次隐藏(更改为其他选项并更改回所需的选项) .
我从AcroFields(从创建的PdfStamper对象)获取后,在从数据插入(用PdfReader对象打开输出文件)之后转储了XFA的DOM结构,diff仅显示插入的数据(插入数据的XML树结构已经手动验证( Adobe Reader XI)添加了行) . 因此在输出文件中,表单属性保持不变,尤其是presence =“hidden” .
这是我用来转储XFA XML结构的代码:
Transformer tf;
try {
tf = TransformerFactory.newInstance().newTransformer();
tf.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
tf.setOutputProperty(OutputKeys.INDENT, "yes");
tf.transform(new DOMSource(m_XfaFormDocument), new StreamResult(new FileOutputStream(OUT_FILE_XML_DUMP)));
} catch (Exception e) {}
我也尝试使用iText 7并基于this example我移植了我的应用程序,但结果是一样的 .
我正在寻找类似的问题,但我找不到任何解决方案,因为这是我第一次尝试使用iText我自己无法解决这个问题,所以我正在寻找能够通过presence =“hidden”属性修复可见性表单的解决方案在使用PdfStamper创建的输出文件中 .