`
小杨学JAVA
  • 浏览: 900645 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

iText5报表_页眉与页脚

 
阅读更多
撞转载自:
1.概述
iText5中并没有之前版本HeaderFooter对象设置页眉和页脚,可以利用PdfPageEventHelper来完成页眉页脚的设置工作。PdfPageEventHelper中包含以下事件处理器。
onOpenDocument() — 当打开一个文档时触发,可以用于初始化文档的全局变量。
onStartPage() — 当一个页面初始化时触发,可用于初始化页面的设置参数,但是注意这个函数触发时,该页面并没有创建好,不用利用这个函数添加内容,最好利用onEndPage()处理页面的初始化。
onEndPage() — 在创建一个新页面完成但写入内容之前触发,是添加页眉、页脚、水印等最佳时机。
onCloseDocument() — 在文档关闭之前触发,可以用于释放一些资源。

2.重载PdfPageEventHelper类
定义一个类HeaderFooter,继承了父类PdfPageEventHelper
在文档的每个页面中,必须定义一个Ractangle矩形,其中参数为art,这样在HeaderFooter类中就可以通过这个矩形,获取文档的边框位置,从而设置页眉和页脚。
代码如下:
  1. import com.itextpdf.text.Document;
  2. import com.itextpdf.text.Element;
  3. import com.itextpdf.text.Phrase;
  4. import com.itextpdf.text.Rectangle;
  5. import com.itextpdf.text.pdf.ColumnText;
  6. import com.itextpdf.text.pdf.PdfPageEventHelper;
  7. import com.itextpdf.text.pdf.PdfWriter;

  8. public class HeaderFooter extends PdfPageEventHelper{
  9. public void onEndPage (PdfWriter writer, Document document) {
  10. Rectangle rect = writer.getBoxSize("art");
  11. switch(writer.getPageNumber() % 2) {
  12. case 0:
  13. ColumnText.showTextAligned(writer.getDirectContent(),
  14. Element.ALIGN_RIGHT, new Phrase("even header"),
  15. rect.getRight(), rect.getTop(), 0);
  16. break;
  17. case 1:
  18. ColumnText.showTextAligned(writer.getDirectContent(),
  19. Element.ALIGN_LEFT, new Phrase("odd header"),
  20. rect.getLeft(), rect.getTop(), 0);
  21. break;
  22. }
  23. ColumnText.showTextAligned(writer.getDirectContent(),
  24. Element.ALIGN_CENTER, new Phrase(String.format("page %d", writer.getPageNumber())),
  25. (rect.getLeft() + rect.getRight()) / 2, rect.getBottom() - 18, 0);
  26. }
  27. }
调用代码如下
  1. import com.itext.HeaderFooter;
  2. import com.itextpdf.text.pdf.PdfPageEventHelper;
  3. import com.itextpdf.text.pdf.PdfWriter;
  4. import com.itextpdf.text.pdf.ColumnText;
  5. import com.itextpdf.text.*;
  6. import java.io.FileOutputStream;

  7. public class HeaderAndFooterDemo {
    public static void main(String[] args){
  8. Document document = new Document(PageSize.A4, 50, 50, 50, 50);
  9. try{
  10. PdfWriter writer=PdfWriter.getInstance(document,
  11. new FileOutputStream("C:\\testHeaderAndFooter.pdf") );
  12. Rectangle rect = new Rectangle(36, 54, 559, 788);
  13. rect.setBorderColor(BaseColor.BLACK);
  14. writer.setBoxSize("art", rect);
  15. HeaderFooter header=new HeaderFooter();

  16. writer.setPageEvent(header);
  17. document.open();

  18. document.newPage();
  19. Paragraph par = new Paragraph("first paragraph");
  20. document.add(par);

  21. document.newPage();
  22. Paragraph par2 = new Paragraph("second paragraph");
  23. document.add(par2);

  24. document.close();
  25. }catch(Exception e){
  26. e.printStackTrace();
  27. }
  28. }
  29. }

3. 解决第X页/共Y页问题
我们通过PdfWriter中的getPageNumber()函数获取当前是第几页,但是没有办法获取文档共多少页。
我们可以利用XObject对象,iText仅在调用释放模板方法后才将PdfTemplate写入到OutputStream中,否则对象将一直保存在内存中,直到关闭文档。
我们可以给第1个页面添加template,直到最后一个页面才将内容写入到这个模板。
  1. import com.itextpdf.text.Document;
  2. import com.itextpdf.text.DocumentException;
  3. import com.itextpdf.text.Element;
  4. import com.itextpdf.text.ExceptionConverter;
  5. import com.itextpdf.text.Image;
  6. import com.itextpdf.text.Phrase;
  7. import com.itextpdf.text.Rectangle;
  8. import com.itextpdf.text.pdf.ColumnText;
  9. import com.itextpdf.text.pdf.PdfPCell;
  10. import com.itextpdf.text.pdf.PdfPTable;
  11. import com.itextpdf.text.pdf.PdfPageEventHelper;
  12. import com.itextpdf.text.pdf.PdfTemplate;
  13. import com.itextpdf.text.pdf.PdfWriter;

  14. public class TableHeader extends PdfPageEventHelper{
  15. String header;
  16. PdfTemplate total;

  17. public void setHeader(String header){
  18. this.header=header;
  19. }

  20. public void onOpenDocument(PdfWriter writer,Document document){
  21. total = writer.getDirectContent().createTemplate(30,16);
  22. }

  23. public void onEndPage (PdfWriter writer, Document document) {
  24. PdfPTable table = new PdfPTable(3);
  25. try{
  26. table.setWidths(new int[]{24,24,2});
  27. table.setTotalWidth(527);
  28. table.setLockedWidth(true);
  29. table.getDefaultCell().setFixedHeight(20);
  30. table.getDefaultCell().setBorder(Rectangle.BOTTOM);

  31. table.addCell(header);
  32. table.getDefaultCell().setHorizontalAlignment(
  33. Element.ALIGN_RIGHT);
  34. table.addCell(String.format("page %d of",writer.getPageNumber()));
  35. PdfPCell cell = new PdfPCell(Image.getInstance(total));
  36. cell.setBorder(Rectangle.BOTTOM);
  37. table.addCell(cell);
  38. table.writeSelectedRows(0,-1,34,803,writer.getDirectContent());

  39. }
  40. catch(DocumentException de){
  41. throw new ExceptionConverter(de);
  42. }
  43. }

  44. public void onCloseDocument(PdfWriter writer,Document document){
  45. ColumnText.showTextAligned(total,Element.ALIGN_LEFT,new Phrase(String.valueOf(writer.getPageNumber()-1)),2,2,0);

  46. }
  47. }
调用代码如上面HeaderAndFooterDemo.java所示。


参考文献
1.Adding page events to PdfWriter (iText 5).http://what-when-how.com/itext-5/adding-page-events-to-pdfwriter-itext-5/
2iText5参考. http://api.itextpdf.com/itext/

 

分享到:
评论
2 楼 小杨学JAVA 2012-09-26  
可能是你设置的显示位置不对
1 楼 fxiaozj 2012-09-20  
怎么打印出来还是没有第X页/共Y页?

相关推荐

    itextpdf 使用之 html 转 pdf 页眉页脚带图片

    本教程将深入讲解如何使用iTextPDF库将HTML内容转化为PDF,并在生成的PDF文档中添加页眉和页脚,同时包含图片。 首先,我们需要了解iTextPDF的基本概念。iTextPDF库提供了一系列API,用于构建PDF文档。HTML转PDF的...

    Itext打印各种样式报表集合

    这些文件可能包含了如何使用Itext创建和定制报表的代码片段,包括设置页眉和页脚、添加图片(如`001.bmp`)以及处理复杂的数据结构。`AnotherPrint04016.java`和`AnotherPrint04016Service.java`可能涉及到服务层的...

    ITEXT 用于生产PDF报表

    2. **报表布局**:ITEXT支持复杂的页面布局,如页眉、页脚、多列布局、页码设置等。通过`HeaderFooter`类可以轻松定制这些元素,而`ColumnText`类则用于实现多列文本的自动分布。 3. **数据绑定**:在生成报表时,...

    最新版IText_API

    8. **事件处理**:开发者可以通过监听事件来控制PDF的生成过程,如页眉页脚的添加、页码的计算等,实现更精细的定制。 9. **PDF解析和解析器**:除了生成PDF,IText API还可以解析已存在的PDF文件,提取文本、图像...

    .net版本Itextsharp根据模板导出pdf报表_0520.rar

    6. **事件处理**:通过实现PdfWriter的事件接口,如PdfPageEventHelper,可以在PDF页面创建前后执行自定义逻辑,如添加页眉和页脚。 7. **PDF安全性**:Itextsharp也允许设置PDF文档的安全性,如限制打印、复制和...

    net版本Itextsharp根据模板导出pdf报表__0525.rar

    在实际应用中,可能还需要处理更复杂的情况,如嵌套表格、图片、页眉页脚等,但基本流程与上述步骤相似,只是需要更精细地控制PDF元素的创建和填充。 总之,Itextsharp为.NET开发者提供了一种强大的工具来处理PDF...

    itextpdf-5.5.5

    5. **水印与页眉页脚**:通过`PdfStamper`类,可以在PDF上添加水印、页眉和页脚,增强文档的版权保护和视觉效果。 6. **PDF安全与加密**:可以对PDF进行加密,限制打印、复制、编辑等操作,保护文档内容的安全。 ...

    itext_5.5.4

    通过API,你可以添加文本、图像、表格、超链接、页眉和页脚等元素。此外,5.5.4版本还支持对已有PDF文档进行编辑,如添加水印、删除页面、合并PDF等。 2. **字体支持** IText 支持多种字体,包括TrueType(TTF)和...

    itext生成pdf文件-表格

    iava使用itext实现pdh的输出.doc”文档,虽然无法直接查看具体内容,但可以推测其可能包含了更多关于iText使用方法的实例和示例,包括如何处理表格的细节、样式设置、事件处理(如页眉页脚)以及如何与其他iText功能...

    iText(PDF格式打印)学习整理

    8. **事件处理**:通过PdfWriter的事件监听机制,可以在PDF生成过程中执行自定义操作,如页眉页脚的添加。 四、iText使用示例 在实际项目中,你可以通过以下步骤使用iText: 1. **初始化Document对象**:创建一个...

    itext相关jar包

    此外,还可以插入图片、创建复杂的表格、添加页眉页脚、设置页码、应用样式模板等。IText提供了API来实现这些功能,使得即使没有深入的Word编程经验,也能轻松创建高质量的文档。 在实际应用中,例如企业报表生成、...

    利用iText包实现Java报表打印.pdf

    此外,iText还支持事件处理,可以自定义页面事件,比如添加页眉、页脚,或者在每个页面上打印时间戳。通过实现`PdfWriter.PageEvent`接口,你可以定义自己的`onStartPage()`和`onEndPage()`方法。 总的来说,iText...

    iText多种jar包

    使用iText时,开发者需要理解PDF文档的结构,包括页眉、页脚、段落、字体、颜色等元素的设置。同时,iText提供了一套API,可以通过编程方式创建和操作PDF文档。例如,`ColumnText`类用于多列文本布局,`PdfWriter`...

    Itext jar

    7. **事件处理和自定义行为**:iText还支持回调机制,开发者可以通过实现特定接口在PDF生成过程中插入自定义逻辑,比如添加水印、页眉页脚等。 8. **性能优化**:对于大量HTML内容的转换,性能是一个重要的考虑因素...

    iText-2.1.5.jar and iTextAsian.jar

    7. **事件处理**:iText支持事件驱动模型,比如`PageEvent`可以用来在页面创建前后执行自定义操作,如添加页眉和页脚。 8. **版面设计**:通过`ColumnText`类,可以实现多列文本布局,适合创建复杂的报告或目录。 ...

    itext2.1.1.jar iTextAsian.jar

    4. **事件处理**:通过实现PdfWriter的监听器接口,可以在PDF生成过程中执行自定义操作,例如页码计数或页眉页脚的添加。 5. **数字签名**:iText 提供了添加数字签名的功能,增强了PDF的安全性。 6. **加密和权限...

    iText 类库

    4. **事件处理和自定义渲染**:iText允许注册事件监听器,以便在特定时刻执行自定义操作,如页面分割、页眉页脚的添加。此外,还可以实现自己的PdfWriter实例,控制PDF的渲染过程。 5. **数字签名和安全**:iText ...

    itext-5.5.8.jar与itexasian已兼容,无需二次下载itexasian

    4. **事件处理**:`iText`支持事件驱动的编程模型,通过监听器机制,可以在PDF生成过程中执行自定义操作,如页面创建、页眉页脚添加等。 5. **表单处理**:能够填充AcroForms或者创建交互式PDF表单,使得用户可以...

    itext-5.2.0.zip

    2. 在已有的PDF文档上添加水印、页眉页脚或注释。 3. 将HTML、XML转换为PDF,方便网页内容的离线阅读。 4. 处理PDF表单,填充数据、签名验证等。 5. 打包多个PDF文件为一个PDF,或者拆分大型PDF。 6. 对PDF进行加密...

Global site tag (gtag.js) - Google Analytics