我正在尝试使用 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 结构,差异仅显示插入的数据(插入的数据的 XML 树结构已手动验证( Adobe Reader XI) 添加了行)。所以在输出文件表单中的属性保持不变,尤其是存在=“隐藏”。
这是我用来转储 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,并基于此示例移植了我的应用程序,但结果是相同的。
我正在寻找类似的问题,但我找不到任何解决方案,因为这是我第一次尝试使用 iText,我自己无法处理这个问题,所以我正在寻找解决方案,它可以修复具有存在 =“隐藏”属性的可见性表单在使用 PdfStamper 创建的输出文件中。