itextsharp中的分页
itextsharp的基础用法,这篇文章写的就很细,大家有兴趣可以看看ITextSharp使用说明
我就说一下我在实际应用中使用到的东西。
我们的项目中主要用到的就是章节(Chapter)和区域(Section)这两个元素,基类中定义一个全局的chapter,在子类中使用addsection创建section,然后把所有的数据填充到section中,使用pdfwriter的FitsPage来检测表格的分页。
具体的用法:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 //如果当前页的剩余高度小于offset,执行括号里的内容,自动分页的话就添加一个page 2 if (!PDFGenerate.Instance.FitPage(table,offset)) 3 { 4 section.NewPage(); 5 }
分页之后要面对的下一个问题就是页码的处理了,有两种实现方式:HeaderFooter和PdfEvent中的EndPage事件
HeaderFooter对象提供了三个构造函数,可以对页码进行自定义的设置。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 //设置页码数是否显示、文字水平居中方式、边距 2 HeaderFooter(Properties attributes) 3 4 //设置页码数前面和后面显示的文字,默认显示页码数 5 HeaderFooter(Phrase before, Phrase after) 6 例如第一页 7 HeaderFooter(new Phrase("第"), new Phrase("页")) 8 9 //设置页码数前面的文字、页码数是否显示 10 HeaderFooter(Phrase before, bool numbered)
不过由于这个页码是自动算的,所以,还是推荐使用PdfEvent中的EndPage事件。
自定义一个继承PdfPageEventHelper类的类来进行EndPage事件中的操作
1 public override void OnEndPage(PdfWriter writer, Document document) 2 { 3 //write和document都有PageNumber属性,你也可以不用 4 }
前几天遇到了一种新的情况,一个汇总的pdf怎么拆分,比如用户1的报表有1,2,3页,用户2的报表在4,5,6页,因为EndPage事件是在把数据写入Section之后调用的,在写页码的时候无法获取用户的信息,写用户信息的时候又不知道页码的信息,这就需要在循环用户信息的时候先把数据整理好然后在写页码的时候来处理。
解决方案其实就相当于是多统计了一遍页码,在写用户信息的时候,定义一个私有的Document变量,指定PageEvent,这里用到了另外的一个PdfPageEventHelper类中的事件:OnCloseDocument,在关闭文档的时候检测一下文档的页数,然后添加到Dictionary中,在整体的EndPage中使用。
1 public override void OnCloseDocument(PdfWriter writer, Document document) 2 { 3 int num = document.PageNumber-1; 4 //name是用户名,这里需要注意的是,document.PageNumber并不是最后一页 5 //是最后一页再加1,所以,要减一 6 _numList.add(num,_name); 7 }
因为是在之前写好的基类上面做的,所以,很多地方考虑的很少,关于保存数据应该使用什么元素,也许是一个值得思考的问题。