`
liubl2011
  • 浏览: 236565 次
  • 性别: Icon_minigender_1
  • 来自: 沈阳
社区版块
存档分类
最新评论

Itext 学习笔记(六) pdf的页眉页脚

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

2.重载PdfPageEventHelper类
       定义一个类HeaderFooter,继承了父类PdfPageEventHelper
       在文档的每个页面中,必须定义一个Ractangle矩形,其中参数为art,这样在HeaderFooter类中就可以通过这个矩形,获取文档的边框位置,从而设置页眉和页脚。
代码如下:

import com.itextpdf.text.Document;

import com.itextpdf.text.Element;

import com.itextpdf.text.Phrase;

import com.itextpdf.text.Rectangle;

import com.itextpdf.text.pdf.ColumnText;

import com.itextpdf.text.pdf.PdfPageEventHelper;

import com.itextpdf.text.pdf.PdfWriter;



public class HeaderFooter extends PdfPageEventHelper{

    public void onEndPage (PdfWriter writer, Document document) {
        Rectangle rect = writer.getBoxSize("art");

        switch(writer.getPageNumber() % 2) {

        case 0:

            ColumnText.showTextAligned(writer.getDirectContent(),

                    Element.ALIGN_RIGHT, new Phrase("even header"),

                    rect.getRight(), rect.getTop(), 0);

            break;

        case 1:

            ColumnText.showTextAligned(writer.getDirectContent(),

                    Element.ALIGN_LEFT, new Phrase("odd header"),

                    rect.getLeft(), rect.getTop(), 0);

            break;

        }

        ColumnText.showTextAligned(writer.getDirectContent(),

                Element.ALIGN_CENTER, new Phrase(String.format("page %d", writer.getPageNumber())),

                (rect.getLeft() + rect.getRight()) / 2, rect.getBottom() - 18, 0);

    }

}


调用代码如下:
import com.itext.HeaderFooter;

import com.itextpdf.text.pdf.PdfPageEventHelper;

import com.itextpdf.text.pdf.PdfWriter;

import com.itextpdf.text.pdf.ColumnText;

import com.itextpdf.text.*;

import java.io.FileOutputStream;



public class HeaderAndFooterDemo {
    public static void main(String[] args){

        Document document = new Document(PageSize.A4, 50, 50, 50, 50);

        try{

            PdfWriter writer=PdfWriter.getInstance(document,

                    new FileOutputStream("C:\\testHeaderAndFooter.pdf") );

            Rectangle rect = new Rectangle(36, 54, 559, 788);

            rect.setBorderColor(BaseColor.BLACK);

            writer.setBoxSize("art", rect);

            HeaderFooter header=new HeaderFooter();



            writer.setPageEvent(header);

            document.open();



            document.newPage();

            Paragraph par = new Paragraph("first paragraph");

            document.add(par);



            document.newPage();

            Paragraph par2 = new Paragraph("second paragraph");

            document.add(par2);



            document.close();

        }catch(Exception e){

            e.printStackTrace();

        }

    }

}


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

import com.itextpdf.text.DocumentException;

import com.itextpdf.text.Element;

import com.itextpdf.text.ExceptionConverter;

import com.itextpdf.text.Image;

import com.itextpdf.text.Phrase;

import com.itextpdf.text.Rectangle;

import com.itextpdf.text.pdf.ColumnText;

import com.itextpdf.text.pdf.PdfPCell;

import com.itextpdf.text.pdf.PdfPTable;

import com.itextpdf.text.pdf.PdfPageEventHelper;

import com.itextpdf.text.pdf.PdfTemplate;

import com.itextpdf.text.pdf.PdfWriter;



public class TableHeader extends PdfPageEventHelper{

    String header;

    PdfTemplate total;

    

    public void setHeader(String header){

     this.header=header;

    }

    

    public void onOpenDocument(PdfWriter writer,Document document){

        total = writer.getDirectContent().createTemplate(30,16);

    }

    

    public void onEndPage (PdfWriter writer, Document document) {

     PdfPTable table = new PdfPTable(3);

     try{

     table.setWidths(new int[]{24,24,2});

     table.setTotalWidth(527);

     table.setLockedWidth(true);

     table.getDefaultCell().setFixedHeight(20);

     table.getDefaultCell().setBorder(Rectangle.BOTTOM);



     table.addCell(header);

     table.getDefaultCell().setHorizontalAlignment(

     Element.ALIGN_RIGHT);

     table.addCell(String.format("page %d of",writer.getPageNumber()));

     PdfPCell cell = new PdfPCell(Image.getInstance(total));

     cell.setBorder(Rectangle.BOTTOM);

     table.addCell(cell);

     table.writeSelectedRows(0,-1,34,803,writer.getDirectContent());



     }

     catch(DocumentException de){

     throw new ExceptionConverter(de);

     }

    }

    

    public void onCloseDocument(PdfWriter writer,Document document){

        ColumnText.showTextAligned(total,Element.ALIGN_LEFT,new Phrase(String.valueOf(writer.getPageNumber()-1)),2,2,0);

     

    }

}


调用代码会显示页眉为page 1 of 2 字样。


参考文献
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/

分享到:
评论
1 楼 fuchen_pxf 2013-12-23  
请教一个问题,我的页眉是用图片构成的,一个pdf大概20页左右,图片大小在60K,现在pdf导出来的大小= 图片大小*页数+内容大小。大概有1M,可是用adobe另存一下就变成了几百K,您有什么好的建议嘛?

相关推荐

    iText7 html转换为pdf生成页码、页眉、页脚DEMO

    itext7 html转换为pdf;iText7页码、页眉、页脚,itext 的复杂表格实现;完整springboot项目代码

    itext生成PDF设置页眉页脚的实例详解

    首先,需要引入iText的相关jar包,包括itextpdf.jar、itext-asian.jar等。然后,创建一个java类,例如ITextList.java,并在其中引入iText的相关类和方法。 在ITextList.java类中,首先需要创建一个Document对象,...

    java html模板 itext 生成pdf 页眉页脚 合并pdf列子

    搜索了好多篇例子,算是强拼硬凑成现在的样子,还算比较满意吧。 此包中包含可测试成功代码,关联模板、字体文件、jar等 希望能帮助到大家。 这篇文章的作者蛮厉害,有不少借鉴。 ...

    iText把jsp转pdf并支持添加页眉页脚

    在这个场景中,"iText把jsp转pdf并支持添加页眉页脚"涉及到的是如何使用iText将动态生成的JSP页面转换为静态的PDF文件,并在此过程中添加自定义的页眉和页脚。 JSP(JavaServer Pages)是一种服务器端的编程技术,...

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

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

    ITextSharp5.0生成PDF(含页眉页脚的生成)

    在这个主题中,我们将深入探讨如何利用ITextSharp 5.0版本生成包含页眉和页脚的PDF文档。这个过程涉及多个步骤,包括初始化PDF文档、添加页眉和页脚以及编写文本内容。 首先,要开始生成PDF,我们需要导入...

    iText生成word代码及jar包(含页眉页脚)

    4. **Itext生成页眉页脚代码.txt**:这个文本文件包含了使用iText来添加页眉和页脚的具体Java代码。通常,页眉和页脚在文档中起到标识、标题和页码的作用。这个代码示例将指导开发者如何在创建的Word文档每一页上...

    iText 页码、保持表头、页眉、页脚DEMO

    iText页码、页眉、页脚,itext 的复杂表格实现、保留表头、表尾、根据需求生成不同的iText表格

    itextpdf实现页眉页角

    本篇文章将深入探讨如何利用iTextPDF库来实现PDF文档的页眉和页脚功能。 首先,了解iTextPDF库的基本概念是至关重要的。iTextPDF提供了丰富的API,允许开发者创建PDF文档,插入文本、图像,甚至复杂的表格和表单。...

    struts下载带有页眉页脚水印的pdf文件

    然后,创建一个Struts Action,这个Action会调用iText库来解析模板并生成PDF,同时插入所需的页眉、页脚和水印信息。最后,你需要配置Struts的配置文件(struts.xml),以确保这个Action能正确地响应用户的下载请求...

    itext将图片生成PDF(高清版)

    `iText`库提供了许多高级特性,如水印、页眉页脚、链接等,可以根据需求进一步探索和使用。 总之,`iText`是一个强大且灵活的PDF处理工具,通过设置正确的DPI和缩放方式,我们可以轻松地将PNG等图片转换为高质量的...

    iText_pdf.rar_iText pdf_itext PDF类

    4. **页面布局**:iText提供了灵活的页面布局选项,如页眉和页脚的自定义、页面大小和方向的调整等。 5. **事件处理**:iText支持监听PDF生成过程中的各种事件,如页面创建、文档结束等,可以在此基础上实现自定义...

    itext5.4.2 html2pdf

    iText是一个开源的PDF库,它提供了创建、编辑、阅读和解析PDF文档的能力。在5.4.2这个版本中,开发者添加了对HTML到PDF转换的特性,使得用户可以方便地将网页内容转化为PDF格式,这对于生成报告、手册或者保存网页...

    利用Itext实现html转pdf

    Itext是一个强大的PDF处理库,它提供了多种功能,包括创建、修改和解析PDF文档。在这个场景中,我们将讨论如何利用Itext库在不修改源代码的情况下,实现HTML到PDF的转换,并处理换行问题。 首先,我们需要理解Itext...

    android Itext生产PDF文件添加图片页眉的简单例子

    implementation 'com.itextpdf:itextg:5.5.13' } ``` `iText`提供了丰富的API来创建PDF文档,包括插入文本、图像、表格等。为了添加图片页眉,我们需要创建一个`PdfDocument`对象,并在其每一页上添加图片。以下是...

    Java 使用itext将html转pdf并下载demo

    通过学习和实践,你可以进一步了解如何自定义PDF布局、添加页眉页脚、处理图片等高级功能。在压缩包文件"demo-itext"中,可能包含了一个简单的示例项目,你可以参考该项目的代码来加深理解和应用。

    iText7 itextpdf/html2pdf

    iText7 用于html转换pdf核心包-html2pdf-1.0.1.jar。。。。

    PDF文件添加页眉页脚水印

    PDF文件添加页眉页脚和水印是PDF文档编辑中的常见需求,这通常涉及到PDF处理技术,特别是针对PDF内容的叠加操作。在这个过程中,我们不能直接修改原始PDF文档的内容,而是要在其上添加额外的视觉元素,如页眉、页脚...

    Android使用iText生成pdf并读取pdf内容

    implementation 'com.itextpdf:itextg:5.5.13' } ``` 接下来,我们来讨论如何生成PDF。在Android中,通常会使用`Document`类作为PDF的容器,`Paragraph`和`Font`类用于构造文本内容。以下是一个简单的例子,展示...

    JAVA使用itextpdf实现HTML转PDF

    本主题聚焦于使用Java的iTextPDF库来完成这个任务。iTextPDF是一个强大的Java库,允许开发人员创建、修改和优化PDF文档。 首先,我们需要了解HTML和PDF之间的差异。HTML是一种标记语言,用于构建和设计网页,而PDF...

Global site tag (gtag.js) - Google Analytics