如何使用iText7生成同一PDF XFA表单的多份副本?
XFA动态表单无法用PdfMerger生成多份副本的解决方案
之前用Acroforms时,靠PdfMerger就能合并生成同一表单的多份副本,但换成XFA动态表单后这套逻辑就失效了。原因很简单:XFA表单基于XML架构,表单的结构、数据、渲染逻辑是绑定在一起的,PdfMerger是页面级别的合并,直接这么做会破坏XFA的完整性,导致合并后的文档没法正常使用动态表单功能。
可行的实现方式
要生成XFA表单的多份副本,得针对XFA的结构来处理,不能直接合并页面。以下是基于iText的实现示例:
// 创建目标文档 PdfDocument destPdf = new PdfDocument(new PdfWriter(dest)); // 处理第一个XFA文档 PdfDocument src1Pdf = new PdfDocument(new PdfReader(SRC1)); XfaForm xfa1 = src1Pdf.getCatalog().getXfaForm(); // 克隆XFA的XML结构 XfaForm clonedXfa1 = new XfaForm(xfa1.getDomDocument()); // 生成临时文档承载克隆后的XFA表单 PdfDocument temp1 = new PdfDocument(new PdfWriter(new ByteArrayOutputStream())); temp1.getCatalog().setXfaForm(clonedXfa1); // 将临时文档的页面复制到目标文档 destPdf.copyPagesTo(1, temp1.getNumberOfPages(), destPdf); temp1.close(); src1Pdf.close(); // 处理第二个XFA文档,逻辑和上面一致 PdfDocument src2Pdf = new PdfDocument(new PdfReader(SRC2)); XfaForm xfa2 = src2Pdf.getCatalog().getXfaForm(); XfaForm clonedXfa2 = new XfaForm(xfa2.getDomDocument()); PdfDocument temp2 = new PdfDocument(new PdfWriter(new ByteArrayOutputStream())); temp2.getCatalog().setXfaForm(clonedXfa2); destPdf.copyPagesTo(1, temp2.getNumberOfPages(), destPdf); temp2.close(); src2Pdf.close(); destPdf.close();
关键说明
- XFA的核心是内部的XML结构,直接合并页面会丢掉这些上下文信息,必须通过克隆XFA的DOM文档来保证每份表单的完整性。
- 每份XFA文档都要单独处理,克隆后生成临时文档再复制页面,这样才能保证每份副本都是独立可用的动态表单。
内容的提问来源于stack exchange,提问作者led
相关产品推荐
相关产品推荐

