我尝试使用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;
}
答案 0 :(得分:1)
有几点意见:
您无法从PdfWriter
获取PdfStamper
对象,请使用newPage()
并期望它能够正常运行。这相当于打开汽车引擎盖并开始重新安装适合的电子管,而不了解电机维护的技术。当您要向stamper
添加新页面时,您应该使用documentation中所述的insertPage()
方法。
第二个观察结果:你没有告诉我们你是否正在压缩表格的内容。如果你这样做,那么它很简单,只需使用example mentioned in the documentation就可以了。换句话说:将PdfStamper
与PdfSmartCopy
结合使用。特别是如果您反复使用相同的模板,PdfSmartCopy
将提供比PdfCopy
更好的结果,原因如chapter 6中所述。
假设您的模板需要保持交互,那么您可能会遇到问题,原因也在该章中进行了解释:具有特定名称的字段的不同可视化必须始终具有相同的值。例如:如果您的模板有一个名为name
的字段,那么文档中此字段的每次出现都必须具有相同的值。如果您不想这样做,则需要重命名name
,例如重命名为name1
,name2
等等。
需要保持交互的模板的连接过去曾用PdfCopyFields
完成(参见文档)。这里的文档有点过时了。在最新版本的iText中,我们现在在addDocument()
和PdfCopy
中有一个方法PdfSmartCopy
。此方法允许您一次添加完整文档,从而保留交互性。