我目前有一个PdfReader和一个PdfStamper,我正在填写acrofields . 我现在必须将另一个pdf复制到我填写的那个表单的末尾,当我这样做时,我会丢失我复制的新表单上的acrofield . 这是代码 .
public static void addSectionThirteenPdf(PdfStamper stamper, Rectangle pageSize, int pageIndex){
PdfReader reader = new PdfReader(FacesContext.getCurrentInstance().getExternalContext().getResourceAsStream("/resources/documents/Section13.pdf"));
AcroFields fields = reader.getAcroFields();
fields.renameField("SecurityGuidancePage3", "SecurityGuidancePage" + pageIndex);
stamper.insertPage(pageIndex, pageSize);
stamper.replacePage(reader, 1, pageIndex);
}
我创建原始文档的方式是这样的 .
OutputStream output = FacesContext.getCurrentInstance().getExternalContext().getResponseOutputStream();
PdfReader pdfTemplate = new PdfReader(FacesContext.getCurrentInstance().getExternalContext().getResourceAsStream("/resources/documents/dd254.pdf"));
PdfStamper stamper = new PdfStamper(pdfTemplate, output);
stamper.setFormFlattening(true);
AcroFields fields = stamper.getAcroFields();
有没有办法使用第一段代码合并并将两个acrofield合并在一起?
1 回答
根据您的具体需求,可能会出现不同的情况,但无论如何:您做错了 . 您应该使用
PdfCopy
或PdfSmartCopy
来合并文档 .以下video tutorial解释了不同的方案 .
您可以在iText sandbox中找到大多数示例 .
Merging different forms (having different fields)
如果要合并不同的表单而不展平它们,则应使用
PdfCopy
,如MergeForms示例中所述:在这种情况下,
readers
是包含不同形式(具有不同字段名称)的PdfReader
实例数组,因此我们使用PdfCopy
并确保不会忘记使用setMergeFields()
方法,否则将不会复制字段 .Merging identical forms (having identical fields)
在这种情况下,我们需要重命名字段,因为我们可能希望在不同的页面上使用不同的值 . 在PDF中,字段只能有一个值 . 如果合并相同的表单,则会有多个相同字段的可视化,但每个可视化将显示相同的值(因为实际上只有一个字段) .
我们来看看MergeForms2示例:
如您所见,
renameFields()
方法在内存中创建一个新文档 . 该文档使用PdfSmartCopy
与其他文档合并 . 如果您在这里使用PdfCopy
,您的文档将会膨胀(我们很快就会发现) .Merging flattened forms
在FillFlattenMerge1中,我们使用
PdfStamper
填写表单 . 结果是一个PDF文件保存在内存中,并使用PdfCopy
合并 . 虽然这个例子很好,如果你合并不同的形式,这实际上是 how not to do it 上的一个例子(如video tutorial中所述) .FillFlattenMerge2显示了如何合并正确填充和展平的相同表单:
这是三种情况 . 您的问题对于任何人来说都不太清楚,但您决定哪种方案最适合您的需求 . 我建议你在编码前花时间学习 . 观看视频,尝试示例,如果您仍有疑问,您将能够发布更智能的问题 .