iText 5.5.3 + XFAWorker:重复部分不渲染

时间:2014-10-23 17:44:51

标签: itext

我们正在使用带有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中呈现吗?

0 个答案:

没有答案