iText5添加页眉、页脚,logo、页码等实现

6 篇文章 0 订阅

iText5添加页眉、页脚,logo、页码等实现

iText5添加页眉、页脚

iText5添加页眉和页脚通过事件出发,需要继承PdfPageEventHelper,重写onEndPage方法进行处理,然后setPageEvent到PdfWriter。
以下边的页眉页脚为例:
页眉: 左边为logo,右边报告简称;
页脚:左边为导出人名,中间为页码,右边为导出日期;
将页眉和页脚都放在在表格里边,然后页眉仅显示底部边框,页脚仅显示顶部边框,做到分割线的作用。
注意点就是总页码,总页码是动态,只有到了写完整个文档,才能知道总页码,所以需要使用PdfTemplate,在页面关闭事件,写入到模板对象里。

版本及maven依赖

在这里插入图片描述

PdfHeaderFooterEvent

@Slf4j
public class PdfHeaderFooterEvent extends PdfPageEventHelper {

    private final static String FONT_PATH = "C:\Windows\Fonts\simsun.ttc,0";

    private final static BaseFont BASE_FONT = BaseFont.createFont(FONT_PATH, BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);

    private final static String logoPath = "D:\Users\admin\Downloads\logo.png";

    //总页码使用的模板对象
    public PdfTemplate totalNumTemplate = null;

    /**
     * 重写页面结束时间  分别添加页眉、页脚
     */
    @Override
    public void onEndPage(pdfWriter writer, Document docment){
        try{
            this.addPageHeader(writer, docment);
        }catch(Exception e){
            log.error("添加页眉出错", e);
        }

        try{
            this.addPageFooter(writer, docment);
        }catch(Exception e){
            log.error("添加页脚出错", e);
        }
    }

    /**
     * 页眉
     */
    private void addPageHeader(pdfWriter writer, Document docment){
        //创建字体
        Font textFont = new Font(BASE_FONT, 10f);

        //两列  一列logo  一列项目简称
        PdfTable table = new PdfTable(2);
        //设置表格宽度 A4纸宽度减去两个边距  比如我一边30  所以减去60
        table.setTotalWidth(PageSize.A4.getWidth()-60);

        //logo
        //创建图片对象
        Image logo = Image.getInstance(logoPath);
        //创建一个Phrase对象 再添加一个Chunk对象进去  Chunk里边是图片
        Phrase logoP = new Phrase("", textFont);
        //自己调整偏移值 主要是y轴值
        logoP.add(new Chunk(logo, 0, -35))
        PdfPCell logoCell = new PdfPCell(logoP);
        //只保留底部边框和设置高度
        logoCell.disableBorderSide(13);
        logoCell.setFixedHeight(40);
        table.addCell(logoCell);

        Phrase nameP = new Phrase("TEST", textFont);
        PdfPCell nameCell = new PdfPCell(nameP);
        //只保留底部边框和设置高度 设置水平居右和垂直居中
        nameCell.disableBorderSide(13);
        nameCell.setFixedHeight(40);
        nameCell.setHorizontalAlignment(Element.ALIGN_RIGHT);
        nameCell.setVerticalAlignment(Element.ALIGN_MIDDLE);
        table.addCell(logoCell);

        //再把表格写到页眉处  使用绝对定位
        table.writeSelectedRows(0, -1, 30, Page.A4.getHeight()-20, write.getDirectContent());
    }

    /**
     * 页脚
     */
    private void addPageFooter(PdfWriter writer, Document docment){
        //创建字体
        Font textFont = new Font(BASE_FONT, 10f);

        //三列  一列导出人  一列页码   一列时间
        PdfTable table = new PdfTable(3);
        //设置表格宽度 A4纸宽度减去两个边距  比如我一边30  所以减去60
        table.setTotalWidth(PageSize.A4.getWidth()-60);
        //仅保留顶部边框
        table.getDefaultCell().disableBorderSide(14);
        table.getDefaultCell().setFixedHeight(40);
        table.getDefaultCell().setVerticalAlignment(Element.ALIGN_MIDDLE);

        //导出人
        table.addCell(new Phrase("admin", textFont));

        //页码
        //初始化总页码模板
        if(null == totalNumTemplate){
            totalNumTemplate = write.getDirectContent().createTemplate(30, 16);
        }
        //再嵌套一个表格 一左一右  左边当前页码 右边总页码 
        PdfTable pageNumTable = new PdfTable(2);
        pageNumTable.setTotalWidth(new float[]{80f, 80f});
        pageNumTable.setLockedWidth(true);
        pageNumTable.setPaddingTop(-5f);
        //第一列居右
        pageNumTable.getDefaultCell().disableBorderSide(15);
        pageNumTable.getDefaultCell().setFixedHeight(16);
        pageNumTable.getDefaultCell().setHorizontalAlignment(Element.ALIGN_RIGHT);
        pageNumTable.getDefaultCell().setVerticalAlignment(Element.ALIGN_BOTTOM);
        pageNumTable.addCell(new Phrase(writer.getPageNumber()+" / ", textFont));
        //第二列居左
        Image totalNumImg = Image.getInstance(totalNumTemplate);
        totalNumImg.setPaddingTop(-5f);
        pageNumTable.getDefaultCell().setPaddingTop(-18f);
        pageNumTable.getDefaultCell().setHorizontalAlignment(Element.ALIGN_LEFT);
        pageNumTable.getDefaultCell().setVerticalAlignment(Element.ALIGN_TOP);
        pageNumTable.addCell(totalNumImg);
        //把页码表格添加到页脚表格
        table.addCell(pageNumTable);

        //日期
        table.addCell(new Phrase(new Date(), textFont));

        //再把表格写到页脚处  使用绝对定位
        table.writeSelectedRows(0, -1, 30, 40, write.getDirectContent());
    }

    /**
     * 文档关闭事件
     */
    @Override
    public void onCloseDocument(PdfWriter writer, Document docment){
        //创建字体
        Font textFont = new Font(BASE_FONT, 10f);
        //将最后的页码写入到总页码模板
        String totalNum = writer.getPageNumber + "页";
        totalNumTemplate.beginText();
        totalNumTemplate.setFontAndSize(BASE_FONT, 5f);
        totalNumTemplate.showText(totalNum);
        totalNumTemplate.setHeight(16f);
        totalNumTemplate.endText();
        totalNumTemplate.closePath();
    }
}

PdfTest

public class PdfTest{

    public static void main(String[] args){
        String pdfPath = "test.pdf";
        Document docment = new Documnet(PageSize.A4);
        PdfWriter writer = PdfWriter.getInstance(docment, new FileOutputStream(pdfPath));
        docment.open();
        PdfHeaderFooterEvent event = new PdfHeaderFooterEvent();
        writer.setPageEvent(event);
        document.add(new Paragraph("test  contents"));
        document.close();
    }
}

以上就是iText5添加页脚页眉的全部伪代码逻辑。

  • 0
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
要设置iTextPDF的页眉页脚,您可以按照以下步骤进行操作: 1. 首先,您需要下载并导入iTextPDF库,您可以在此链接中下载itextpdf-5.5.13.jar文件。 2. 创建一个PdfWriter实例来写入PDF文件,并传入文档对象和文件输出流,例如: ```java PdfWriter pdfWriter = PdfWriter.getInstance(document, new FileOutputStream(pdfFile)); ``` 3. 创建一个类来实现PdfPageEventHelper接口,来自定义页眉页脚的内容。例如,您可以创建一个PdfHeaderFooter类来设置页眉页脚内容。 ```java public class PdfHeaderFooter extends PdfPageEventHelper { public void onEndPage(PdfWriter writer, Document document) { // 在页面结束时添加页眉页脚的内容 // 可以使用PdfContentByte对象在页面的指定位置添加文本或图像 } } ``` 4. 将该类的实例设置为PdfWriter的PageEvent属性,以便在文档生成过程中调用它。 ```java pdfWriter.setPageEvent(new PdfHeaderFooter()); ``` 5. 在PdfHeaderFooter类的onEndPage方法中,您可以使用PdfContentByte对象来添加页眉页脚的内容。您可以使用setFontAndSize方法设置字体和字号,使用showTextAligned方法添加文本,并使用addImage方法添加图像。 6. 在添加页眉页脚时,您可能需要设置特定的字体,以确保文本的显示效果与HTML页面一致。您可以创建一个AsianFontProvider类来设置字体类型,使其与HTML页面字体一致。 以上是设置iTextPDF的页眉页脚的一般步骤,您可以根据实际需求进行进一步的定制。希望对您有帮助!123 #### 引用[.reference_title] - *1* [itext Pdf页眉/页脚/水印](https://blog.csdn.net/Kally_tao/article/details/127053356)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}} ] [.reference_item] - *2* *3* [itext 生成pdf文件添加页眉页脚](https://blog.csdn.net/weixin_30699465/article/details/97089506)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值