2016-09-29 349 views
0

查看我的组织内部,互联网上的很多Java代码示例以及iTextPdf的示例,有一种通用模式,从返回的页数减去1,例如: numberOfPages = writer.getPageNumber() - 1; // writer是类型PdfWriter 它看起来像iTextPdf考虑一个潜在的下一页,不管它是否存在。这对我来说并没有多大意义,但它很有用。ITextPdf PdfWriter.getPageNumber()返回一个额外页码

  • getPageNumber()是否确实一致地将页数加1?
  • 我可以从这个得到更多的见解吗? (我们使用的iText 5.5.6)

的情况下发生这种情况时,为了得到的总页数在一个页面事件的onCloseDocument()方法使用getPageNumber()时。在这种情况下,返回的值超过了一个数字。

+0

这取决于上下文。没有这个背景,就不能提供答案。 –

+0

谢谢,布鲁诺,您的回应。上下文是代码重写onCloseDocument()以获得总页数,然后我们发现响应超过了一个数字。 –

+0

在这种情况下,我可以(也将会)回答这个问题。 –

回答

1

此答案仅适用于iText 5; iText 7使用完全不同的方法。

  • 当您在iText 5中关闭文档时,iText始终会调用newPage()方法来确定文档中的最后一页。 newPage()方法也会初始化一个新页面,但由于在关闭文档后没有内容可以添加,所以新页面将为空,并且它将永远不会显示在您的文档中(因为空页面将被忽略)。在永远不会完全存在的新页面的初始化期间,页面计数会加1。
  • 当您在iText 5中关闭文档时,onCloseDocument()方法是最后调用的方法之一。它在使用newPage()方法后调用,这也意味着:在页码增加1之后。

所以,当你在onCloseDocument()方法使用getPageNumber()方法,你需要减去一个页面。

这种奇怪的行为只有一个原因:iText有机地增长,和PDF创建过程(“5个步骤”)早于页面事件。我们没有想到在iText最初设计时添加页面事件。页面事件被固定在最初的设计上,并且会产生一些后果,比如你在问题中提到的“问题”。

正如我们在JavaOne谈话“糟糕,我们打破了我们的API”中所解释的那样,我们决定不要打破API很长一段时间,即使打破API会导致更多的优雅和更少的怪癖,如你提及。对于iText 7,我们决定从头开始重写iText(打破所有后向兼容性),以便这种奇怪的现象不再存在。