`

iText生成PDF文件,每页显示页码以及总页数的实现

    博客分类:
  • Java
PHP 
阅读更多
如果想在页眉或者页脚加上第x页这样的信息,用普通的HeaderFooter就能轻松搞定。
HeaderFooter footer = new HeaderFooter(new Phrase("第:",FontChinese), new Phrase("页",FontChinese));    
footer.setBorder(Rectangle.NO_BORDER);  
document.setFooter(footer);  
document.open();


如果想在每页显示第x页/共y页这样的功能,实现起来没有那么轻松。
官方页面有具体实现的例子,连接地址:
http://itextdocs.lowagie.com/tutorial/directcontent/pageevents/index.php
源码:
http://itextdocs.lowagie.com/examples/com/lowagie/examples/directcontent/pageevents/PageNumbersWatermark.java

源码里面的东西比较繁多,精简以后如下:

import java.io.FileOutputStream;

import com.lowagie.text.Document;
import com.lowagie.text.Element;
import com.lowagie.text.ExceptionConverter;
import com.lowagie.text.Font;
import com.lowagie.text.PageSize;
import com.lowagie.text.Paragraph;
import com.lowagie.text.pdf.BaseFont;
import com.lowagie.text.pdf.PdfContentByte;
import com.lowagie.text.pdf.PdfPageEventHelper;
import com.lowagie.text.pdf.PdfTemplate;
import com.lowagie.text.pdf.PdfWriter;

public class PdfExport extends PdfPageEventHelper{
	
	public PdfTemplate tpl;
	public BaseFont bf;

	public static void main(String[] args) {
		Document document = new Document(PageSize.A4, 20, 20, 20, 20);
		try {			
			PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream("D:\\HelloItext.pdf"));
			writer.setPageEvent(new PdfExport());
			
			BaseFont bfChinese = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
	
			document.open();
			
			Paragraph title = new Paragraph("测试内容。。。。", new Font(bfChinese,15));
			title.setAlignment(Element.ALIGN_CENTER);
			document.add(title);	
		} catch (Exception de) {
			de.printStackTrace();
		}
		document.close();
	}
	
	public void onOpenDocument(PdfWriter writer, Document document) {
        try {
            tpl = writer.getDirectContent().createTemplate(100, 100);
            bf = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);   
        }
        catch(Exception e) {
            throw new ExceptionConverter(e);
        }
    }
    
    public void onEndPage(PdfWriter writer, Document document) {
       //在每页结束的时候把“第x页”信息写道模版指定位置
        PdfContentByte cb = writer.getDirectContent();
        cb.saveState();
        String text = "第" + writer.getPageNumber() + "页,共";
        cb.beginText();
        cb.setFontAndSize(bf, 8);
        cb.setTextMatrix(460, 786);//定位“第x页,共” 在具体的页面调试时候需要更改这xy的坐标
        cb.showText(text);
        cb.endText();
        cb.addTemplate(tpl, 492, 786);//定位“y页” 在具体的页面调试时候需要更改这xy的坐标

        cb.saveState();
        cb.stroke();
        cb.restoreState();       
        cb.closePath();//sanityCheck();
    }
    
    public void onCloseDocument(PdfWriter writer, Document document) {
       //关闭document的时候获取总页数,并把总页数按模版写道之前预留的位置
       tpl.beginText();
       tpl.setFontAndSize(bf, 8);
       tpl.showText(Integer.toString(writer.getPageNumber() - 1)+"页");
       tpl.endText();
       tpl.closePath();//sanityCheck();
    }
}
分享到:
评论
1 楼 lyw985 2010-04-09  
感谢LZ解决困扰我许久的问题

相关推荐

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

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

    itext操作word生成目录、页码、表格、插入图片

    本篇将深入探讨如何使用iText来实现Word文档中的目录生成、页码设置、表格创建以及图片插入等功能。 首先,我们需要理解的是,由于iText主要用于PDF,所以在操作Word时,我们通常会借助于像Apache POI这样的库来...

    C#拆分PDF(iText)

    3. **遍历PDF页面**:通过`PdfReader.GetNumberOfPages()`获取PDF的总页数,然后使用`PdfCopy.AddPage`方法将每一页添加到新的PDF文件中。 4. **定义拆分规则**:根据Excel中的规则,这可能涉及到基于页码、内容或...

    Java读取Word文档页数

    本主题将深入探讨如何利用给定的`itextpdf-5.5.9.jar`和`jacob.jar`这两个库来实现Java读取Word文档页数的功能。 `jacob.jar`是一个Java到COM桥接库,它允许Java应用程序调用Microsoft Office组件,如Word,从而...

    java实现查找PDF关键字所在页码及其坐标

    这个方法将PDF文件转换为byte数组,然后使用iText库来解析PDF文件的内容,最后返回一个List[]>对象,其中每个元素代表一个匹配的位置,分别包含页码、x轴和y轴坐标。 在main方法中,可以调用这个方法来查找PDF文件...

    基于itextsharp的PDF分割合并完整示例

    处理PDF文件时,有时我们需要将其拆分或合并,以满足特定的需求。iTextSharp是一款强大的.NET库,专门用于处理PDF文档。在这个项目中,我们将深入探讨如何使用iTextSharp库在C#环境下进行PDF的拆分与合并。 首先,...

    Common.zip

    在每一页被创建时,这个事件监听器会被触发,我们可以在其中添加页码。例如,创建一个名为`PageNumberEventListener`的类,重写`onEndPage(PdfWriter writer, Document document)`方法,在其中使用`ColumnText`或者...

    pdfmerge.zip

    为了确保合并后的文件页码正确,需要对每一页进行重新编号。这可能涉及到计算总页数,然后根据原页面的顺序和位置调整新文档中的页码。 此外,PDFMerge可能还具备优化功能,如减少文件大小。在合并过程中,可以去除...

    Java 解析pdf源码(含详细注释和依赖jar)

    3. **解析页面**:遍历PDF的页码,对每一页创建一个`PdfStamper`或`PdfCopy`对象,这允许我们在现有PDF上添加或修改内容。 4. **提取文本**:若要提取PDF中的文本,可以使用`PdfTextExtractor`类的`getTextFromPage...

    教你怎么利用ireport软件制作jasper报表文件,是报表模版软件

    系统内置的变量如$V{PAGE_NUMBER}和$V{PAGE_COUNT}可以用来显示页码和页数。 通过ireport,开发者能够创建各种复杂的报表,包括表格、图表、图像等,并且能够方便地从数据库或其他数据源获取数据,生成美观且信息...

    eXtremeTable分页控件完整例子(数据分页+数据导出)

    此外,它还支持自定义分页样式和交互,例如显示总记录数、当前页数和页码选择器等。 在分页的基础上,eXtremeTable 还提供了数据导出功能,这使得用户能够方便地将表格数据保存到本地文件中。以下是具体导出方式的...

    iReport+jasperReports制作WEB报表pdf

    为了实现 WEB 报表功能,我们需要安装 Java 开发工具包 (JDK)、WEB 服务器以及数据库。本文以 JDK1.5、Resin 2.1.7 和 SQL Server 2000 为例进行说明。 - **JDK 安装**: 下载并安装 JDK1.5,确保环境变量设置正确。...

    PdfReader

    `getNumberOfPages()` 方法返回PDF的总页数,`getInfo()` 可以获取PDF的元数据,如作者、标题等。`getAcroFields()` 返回AcroFields对象,这可用于处理PDF中的表单字段。 对于PDF文档的内容提取,PdfReader提供了`...

Global site tag (gtag.js) - Google Analytics