ITextPdf PdfWriter.getPageNumber()返回一个额外的页码

ITextPdf PdfWriter.getPageNumber()返回一个额外的页码,pdf,itext,Pdf,Itext,查看我所在组织内的许多Java代码示例、internet上的示例以及iTextPdf中的示例,有一种常见的模式,即从返回的页数中减去1,例如: numberOfPages=writer.getPageNumber()-1;//写入程序为PdfWriter类型 看起来iTextPdf考虑了下一个页面,不管它是否存在。这对我来说没有多大意义,但它确实有效 getPageNumber()确实会持续地将页数增加1吗? 我能得到更多关于这一点的见解吗?(我们正在使用iText 5.5.6) 发生这种情

查看我所在组织内的许多Java代码示例、internet上的示例以及iTextPdf中的示例,有一种常见的模式,即从返回的页数中减去1,例如: numberOfPages=writer.getPageNumber()-1;//写入程序为PdfWriter类型 看起来iTextPdf考虑了下一个页面,不管它是否存在。这对我来说没有多大意义,但它确实有效

  • getPageNumber()确实会持续地将页数增加1吗?
  • 我能得到更多关于这一点的见解吗?(我们正在使用iText 5.5.6)

发生这种情况时的上下文是在页面事件的
onCloseDocument()
方法中使用
getPageNumber()
以获取总页数。在这种情况下,返回的值超过数字1。

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

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

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


正如我们在JavaOne谈话“Oops,我们破坏了我们的API”中所解释的那样,我们已经决定在很长一段时间内不破坏API,即使破坏API会带来更多的优雅和更少的怪癖,就像您提到的那样。对于iText 7,我们决定从头重写iText(打破所有向后兼容性),这样这种奇怪的现象就不再存在了。

这个答案只适用于iText 5;iText 7使用了完全不同的方法

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

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


正如我们在JavaOne谈话“Oops,我们破坏了我们的API”中所解释的那样,我们已经决定在很长一段时间内不破坏API,即使破坏API会带来更多的优雅和更少的怪癖,就像您提到的那样。对于iText 7,我们决定从头重写iText(打破所有向后兼容性),这样这种奇怪的现象就不再存在了。

这取决于上下文。没有这样的背景,就无法提供答案。谢谢你的回答,布鲁诺。上下文是代码重写onCloseDocument()以获得总页数,然后我们发现响应超过了该数字1。在这种情况下,我可以(也将)回答这个问题。这取决于上下文。没有这样的背景,就无法提供答案。谢谢你的回答,布鲁诺。上下文是代码重写onCloseDocument()以获得总页数,然后我们发现响应超出了该数字1。在这种情况下,我可以(也将)回答这个问题。