我正在使用itext创建一个pdf文件,如下所示:

Document document = new Document();
PdfWriter writer=  PdfWriter.getInstance(document, new FileOutputStream(test+ "/"+filename));


现在,在整个程序中,有很多地方使用document.newPage()创建新页面

我正在使用canvas.showText(Integer.toString(123));在新页面上写一些文本

是否可以返回到第3页,然后在不使用PDFReader读取创建的pdf的情况下向该页添加文本?

我已经尝试了document.setPageCount(3),但是它似乎没有用(我不确定这是否是我需要的方法)。

最佳答案

您问题的答案是是和不是。

不,不可能返回上一页,因为iText最初(由我设计)是用于Internet环境中的。触发document.newPage()后,具有上一页内容的字节流将立即刷新到OutputStream。通过这种方式设计,我故意破坏了基于MVC的慢速PDF库(例如Apache FOP)使用的设计模式,以创建一个真正快速的PDF库。

是的,可以在页面上引入占位符。在iText术语中,我们称它们为PdfTemplate对象。在PDF术语中,它们称为Form XObjects。最常见的用例是MovieCountries1示例中演示的Y的第X页问题。快速创建PDF时,您无法事先知道文档最终将有多少页。您要添加页码,例如total的第1页,total的第2页,等等。但是,当这些页面刷新到最终用户的浏览器时,您不知道total的值。代替添加值(未知),您将添加一个没有任何内容的PdfTemplate对象。只有知道了total的值后,才将值写入PdfTemplate。在内部,每个页面都有从页面流到该外部对象的引用(这就是为什么它被称为XObject的原因)。

因此,在回答您的问题时:如果要在第3页上添加一个值,但直到第4页时才知道该值,则需要在第3页上添加PdfTemplate,然后将内容添加到在第4页上显示PdfTemplate。一旦确定PdfTemplate的值不再更改,就可以释放PdfTemplate。在释放PdfTemplate的那一刻,XObject的内容流将被写入OutputStream

07-24 09:49