我正在尝试使用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创建的输出文件中 .