Java iText:PDF生成。一个模板。更多的投入。一个输出

Java iText:PDF生成。一个模板。更多的投入。一个输出,java,pdf,itext,Java,Pdf,Itext,我尝试用itext生成pdf。首先,我读入一个现有模板,并在方法stampFormular(Formular Formular,PdfStamper stamper)中标记公式。stamp方法有效。但是我有一个问题,在输出文件中添加更多的公式 我想为每个公式盖章的PDF模板“黄色”。所以我用document.add()尝试了一下,但是没有用。所以我试着用pdf writer来做这件事。但这对我来说是行不通的。你知道我如何用一个公式数据在pdf模板上盖章,制作一个新页面,用下一个公式数据在同一个p

我尝试用itext生成pdf。首先,我读入一个现有模板,并在方法
stampFormular(Formular Formular,PdfStamper stamper)
中标记公式。stamp方法有效。但是我有一个问题,在输出文件中添加更多的公式

我想为每个公式盖章的PDF模板“黄色”。所以我用
document.add()
尝试了一下,但是没有用。所以我试着用pdf writer来做这件事。但这对我来说是行不通的。你知道我如何用一个公式数据在pdf模板上盖章,制作一个新页面,用下一个公式数据在同一个pdf模板上盖章吗

public static File createForm(List<Fomular> formulars) {
        Document document = new Document();
        File pdf = null;

        document.open();

        try {
            PdfReader pdfTemplate = new PdfReader('YELLOW');
            PdfStamper stamper = new PdfStamper(pdfTemplate,
                    new FileOutputStream("output.pdf"));
            PdfWriter writer;
            for (Formular f : formulars) {
                stamper = stampFormular(f, stamper);
                writer = stamper.getWriter();
                writer.newPage();
            }

            stamper.close();
            pdfTemplate.close();
            pdf = new File("output.pdf");
            Desktop.getDesktop().open(pdf);
        } catch (DocumentException | IOException e) {
            e.printStackTrace();
        }
        return pdf;
    }
公共静态文件createForm(列表公式){
文档=新文档();
文件pdf=null;
document.open();
试一试{
PdfReader pdfTemplate=新的PdfReader(“黄色”);
PdfStamper压模=新PdfStamper(pdfTemplate,
新的FileOutputStream(“output.pdf”);
编剧;
for(公式f:公式){
压模=压模公式(f,压模);
writer=stamp.getWriter();
writer.newPage();
}
压模关闭();
pdfTemplate.close();
pdf=新文件(“output.pdf”);
Desktop.getDesktop().open(pdf);
}捕获(DocumentException | IOE异常){
e、 printStackTrace();
}
返回pdf;
}

一些观察结果:

您不能从
PdfStamper
获取
PdfWriter
对象,使用
newPage()
并期望它工作。这相当于打开汽车的引擎盖,开始重新布线合适的管子,而不知道任何关于发动机维护的艺术。当您想向母版添加新页面时,应该使用
insertPage()
方法,如中所述

第二个观察:你没有告诉我们你是否在扁平化表单的内容。如果你这样做了,那么很简单,只需使用。换句话说:将
PdfStamper
PdfSmartCopy
组合。特别是如果您反复使用同一模板,
PdfSmartCopy
将比
PdfCopy
提供更好的结果,原因如中所述

假设您的模板需要保持交互式,那么您可能会遇到问题,原因也在该章中进行了解释:具有特定名称的字段的不同可视化必须始终具有相同的值。例如:如果模板中有一个名为
name
的字段,则该字段在文档中的每次出现都必须具有相同的值。如果您不想这样做,您需要重命名
name
,例如重命名为
name1
name2
,等等

需要保持交互的模板串联通常与
PdfCopyFields
一起完成(请参阅文档)。在这里,文档有些过时。在最新版本的iText中,我们现在在
PdfCopy
PdfSmartCopy
中有了一个方法
addDocument()
。此方法允许您一次添加完整文档,从而保持交互性