我正在使用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
。