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

时间:2013-11-29 10:48:18

标签: java pdf itext

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

我想为每个Formular标记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;
    }

1 个答案:

答案 0 :(得分:1)

有几点意见:

您无法从PdfWriter获取PdfStamper对象,请使用newPage()并期望它能够正常运行。这相当于打开汽车引擎盖并开始重新安装适合的电子管,而不了解电机维护的技术。当您要向stamper添加新页面时,您应该使用documentation中所述的insertPage()方法。

第二个观察结果:你没有告诉我们你是否正在压缩表格的内容。如果你这样做,那么它很简单,只需使用example mentioned in the documentation就可以了。换句话说:将PdfStamperPdfSmartCopy结合使用。特别是如果您反复使用相同的模板,PdfSmartCopy将提供比PdfCopy更好的结果,原因如chapter 6中所述。

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

需要保持交互的模板的连接过去曾用PdfCopyFields完成(参见文档)。这里的文档有点过时了。在最新版本的iText中,我们现在在addDocument()PdfCopy中有一个方法PdfSmartCopy。此方法允许您一次添加完整文档,从而保留交互性。