我已从模板生成PDF。 PDF在其中间有一个可变长度的字段。我正在努力使它如果字段的内容溢出,那么程序将使用第二个实例模板作为第二个页面并继续在那里的相同字段。这可能吗?
答案 0 :(得分:3)
这只有在您展平表单时才有效。我写了一个概念证明,其中我有一个PDF格式src
,其中有一个名为"body"
的字段:
public void manipulatePdf(String src, String dest) throws DocumentException, IOException {
PdfReader reader = new PdfReader(src);
Rectangle pagesize = reader.getPageSize(1);
PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(dest));
Paragraph p = new Paragraph();
p.add(new Chunk("Hello "));
p.add(new Chunk("World", new Font(FontFamily.HELVETICA, 12, Font.BOLD)));
AcroFields form = stamper.getAcroFields();
Rectangle rect = form.getFieldPositions("body").get(0).position;
int status;
PdfImportedPage newPage = null;
ColumnText column = new ColumnText(stamper.getOverContent(1));
column.setSimpleColumn(rect);
int pagecount = 1;
for (int i = 0; i < 100; ) {
i++;
column.addElement(new Paragraph("Hello " + i));
column.addElement(p);
status = column.go();
if (ColumnText.hasMoreText(status)) {
newPage = loadPage(newPage, reader, stamper);
triggerNewPage(stamper, pagesize, newPage, column, rect, ++pagecount);
}
}
stamper.setFormFlattening(true);
stamper.close();
reader.close();
}
public PdfImportedPage loadPage(PdfImportedPage page, PdfReader reader, PdfStamper stamper) {
if (page == null) {
return stamper.getImportedPage(reader, 1);
}
return page;
}
public void triggerNewPage(PdfStamper stamper, Rectangle pagesize, PdfImportedPage page, ColumnText column, Rectangle rect, int pagecount) throws DocumentException {
stamper.insertPage(pagecount, pagesize);
PdfContentByte canvas = stamper.getOverContent(pagecount);
canvas.addTemplate(page, 0, 0);
column.setCanvas(canvas);
column.setSimpleColumn(rect);
column.go();
}
如您所见,我们创建了一个PdfImportedPage
实例,我们插入了一个以此页面为背景的新页面。我们使用ColumnText
在字段定义的位置添加内容。