iText PDF在第一页顶部的绝对位置添加文本



我有一个脚本,可以创建一个PDF文件并将内容写入其中。执行完成后,我需要将状态(失败、成功)写入PDF,但状态应该在页面顶部。因此,我提出的解决方案是使用绝对定位文本。以下是我对同一的代码

PdfContentByte cb = writer.DirectContent;
BaseFont bf = BaseFont.CreateFont(BaseFont.HELVETICA, BaseFont.CP1252, BaseFont.NOT_EMBEDDED);
cb.SaveState();
cb.BeginText();
cb.MoveText(700, 30);
cb.SetFontAndSize(bf, 12);
cb.ShowText("My status");
cb.EndText();
cb.RestoreState();

但是当PDF创建多个页面时,它会被添加到PDF的最后一页。如何将其添加到第一页??

还有一种方法可以计算页面的顶部坐标,即左上角坐标吗?

iText的编写考虑到了互联网应用程序。它被设计为尽快从内存中刷新内容:如果一个页面完成,该页面将被发送到OutputStream,并且无法返回该页面。

这并不意味着你的要求是不可能的。PDF有一个被称为Form XObject的概念。在iText中,这个概念是以名称PdfTemplate实现的。这样的PdfTemplate是一个具有固定大小的矩形画布,可以添加到页面中而不作为该页面的一部分。

一个例子应该说明这意味着什么。请查看WriteOnFirstPage示例。在本例中,我们创建了一个PdfTemplate,如下所示:

PdfContentByte cb = writer.getDirectContent();
PdfTemplate message = cb.createTemplate(523, 50);

message对象引用Form XObject。它是页面内容外部的一段内容。

我们将PdfTemplate封装在Image对象中。通过这样做,我们可以像任何其他对象一样将Form XObject添加到文档中:

Image header = Image.getInstance(message);
document.add(header);

现在我们可以添加任意数量的数据:

for (int i = 0; i < 100; i++) {
    document.add(new Paragraph("test"));
}

添加100行"测试"将导致iText创建3个页面。一旦我们进入第3页,我们就不能再访问第1页,但我们仍然可以将内容写入message对象:

ColumnText ct = new ColumnText(message);
ct.setSimpleColumn(new Rectangle(0, 0, 523, 50));
ct.addElement(
    new Paragraph(
        String.format("There are %s pages in this document", writer.getPageNumber())));
ct.go();

如果您检查生成的PDF write_on_first_page.PDF,您会注意到我们最后添加的文本确实在第一页上。

最新更新