IText 编写器返回上一页

har*_*ash 2 java pdf pdf-generation itext

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

Document document = new Document();
PdfWriter writer=  PdfWriter.getInstance(document, new FileOutputStream(test+ "/"+filename));
Run Code Online (Sandbox Code Playgroud)

现在,在整个程序中,有很多地方我正在使用 document.newPage()

我正在使用 canvas.showText(Integer.toString(123));

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

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

Bru*_*gie 5

你的问题的答案是肯定的和否定的。

不,无法返回上一页,因为 iText 最初(由我)设计用于互联网环境。一旦 adocument.newPage()被触发,带有上一页内容的字节流就会被刷新到OutputStream. 通过这样设计,我特意打破了基于 MVC 的PDF 库(如 Apache FOP)使用的设计模式,以创建一个真正快速的PDF 库。

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

因此,在回答您的问题时:如果您想在第 3 页添加一个值,但直到您在第 4 页上才知道该值,您需要PdfTemplate在第 3 页添加一个,PdfTemplate当您添加内容时“重4页上一旦确认,关于价值PdfTemplate不会改变了,你可以放开PdfTemplate。在您释放 的那一刻PdfTemplate,XObject 的内容流将被写入OutputStream.