我正在使用iTextSharp动态生成PDF文档 . 我不知道它将包含多少页面 . 我已经设法通过覆盖PdfPageEventHelper上的OnStartPage和OnEndPage来在所有页面上创建页眉和页脚 . 但是,使用这种方法,所有页面上的 Headers 都相同,并且所有页面上的页脚都相同 . 我需要更有活力:我需要在最后一页显示不同的页脚 .
当我在OnEndPage方法中时,我知道页面的页面编号,但我不知道它是否是最后一个 . 当我在OnCloseDocument方法中时,我知道总页数,但我不能从这里“删除”或“删除”或更改OnEndPage添加到最后一页的页脚 .
2 回答
所以你've got a main loop of code that'创建页面和添加内容,对吧?一旦该内容完成,您可以设置
OnEndPage
寻找的全局标志吗?下面的代码(在VB.Net中,抱歉)用一个布尔变量创建一个类(所以我们可以通过引用传递它),一旦我们完成主处理循环,我们设置为
true
,以便OnEndPage
知道做一些不同的事情 . 对于详细IPdfPageEvent
抱歉,VB要求声明所有方法,即使您不使用它们 .我相信你可以修改
PdfTemplate
的实例,直到你调用document.close()
.更改页眉/页脚代码以在
PdfTemplate
中绘制所有内容 .保存页面之间的最后
PdfTemplate
.在调用
document.close()
之前,重置最后一个页眉和页脚,并按照最后一页所需的方式绘制它 .PS:在为多个页面绘制完全相同的东西时,使用
PdfTemplate
非常有效 . 您只需构建一次模板,然后在需要它的每个页面上重复使用它 . 然而,在这种特殊情况下,它实际上增加了一点开销,因为你必须为每个页面创建一个,这样你就可以在事后改变最后一个 .OTOH,如果你在每个页面上都有相同的东西,加上最后一个上面的一些额外的东西,你可以嵌套模板 . 一个具有Unchanging Stuff,另一个模板只是将所有页面包装在所有页面上,而不是最后一个 . 在最后一页上,您可以简单地添加它,而不是重置现有内容 .
PPS:IIRC,这就是你 Build "page x of y"页脚的方式 . 所有页面都包含"page x of "的一些直接内容 . 在
close()
之前渲染完所有页面后,您将使用页数填写该模板 .