我们正在使用带有XFAWorker的iText Java 5.5.3将XML注入PDF模板并将其压缩为简单的PDF。
要集成到具有以各种技术构建的部件的系统中,我们使用simple framework
将其包装到http-Server中注射阶段工作正常,但在展平后,某些部分会丢失。
详细信息:
plan_v4.xml有多个// form / PlanItems / PlanItem实例,[CLAIM_plan_v3.pdf] [6]重复显示所有这些实例。这是好的情况。 [CLAIM_plan_v4.pdf] [7]没有显示各个PlanItem实例的重复部分。这是破案。
使用iText的主要代码如下:
// load the XML document that contains the contents of the data element.
// NOT the <data> element itself or anything else.
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setNamespaceAware(true);
DocumentBuilder db = dbf.newDocumentBuilder();
Document newdoc = db.parse(new InputSource(new InputStreamReader(xfaStream, "UTF-8")));
Node newdata = newdoc.getDocumentElement();
// Open the PDF and extract the complete xfa.
PdfReader reader = new PdfReader(pdfStream);
XfaForm xfa = new XfaForm(reader);
Document doc = xfa.getDomDocument();
// Remove all contents of the <data> element
NodeList list = doc.getElementsByTagNameNS("http://www.xfa.org/schema/xfa-data/1.0/", "data");
Node child;
do {
child = list.item(0).getFirstChild();
if (child!=null) {
list.item(0).removeChild(child);
}
} while (child!=null);
// Replace <data> with the new xml to inject.
list.item(0).appendChild(doc.importNode(newdata,true));
ByteArrayOutputStream os = new ByteArrayOutputStream();
PdfStamper stamper = new PdfStamper(reader, os, '\0', false);
xfa.setDomDocument(doc);
xfa.setChanged(true);
XfaForm.setXfa(xfa, stamper.getReader(), stamper.getWriter());
stamper.close();
如果我现在快完成:
response.getOutputStream().write(os.toByteArray());
我得到了好的(但没有得到的)结果。
如果我像这样添加展平阶段:
com.itextpdf.text.Document document = new com.itextpdf.text.Document();
PdfWriter writer = PdfWriter.getInstance(document, response.getOutputStream());
XFAFlattener xfaf = new XFAFlattener(document, writer);
xfaf.flatten(new PdfReader(os.toByteArray()));
document.close();
结果扁平但缺少重复的部分。
有人可以告诉我我做错了什么,所以PlanItems不会在最终的PDF中呈现吗?