itext生成pdf(附带页眉,页脚,页码)

package cn.picclife.mwx.salesupport.marketactivity.util;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.MalformedURLException;

import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.ExceptionConverter;
import com.itextpdf.text.Font;
import com.itextpdf.text.Image;
import com.itextpdf.text.PageSize;
import com.itextpdf.text.Paragraph;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.PdfContentByte;
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 PDFUtil {

    //页码事件
    private static class PageXofYTest extends PdfPageEventHelper{
        public PdfTemplate total;

        public BaseFont bfChinese;

        /**
         * 重写PdfPageEventHelper中的onOpenDocument方法
         */
        @Override
        public void onOpenDocument(PdfWriter writer, Document document) {
            // 得到文档的内容并为该内容新建一个模板
            total = writer.getDirectContent().createTemplate(500, 500);
            try {

                String prefixFont = "";
                String os = System.getProperties().getProperty("os.name");
                if(os.startsWith("win") || os.startsWith("Win")){
                    prefixFont = "C:\\Windows\\Fonts" + File.separator;
                }else {
                    prefixFont = "/usr/share/fonts/chinese" + File.separator;
                }

                // 设置字体对象为Windows系统默认的字体
                bfChinese = BaseFont.createFont(prefixFont + "simsun.ttc,0", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
            } catch (Exception e) {
                throw new ExceptionConverter(e);
            }
        }

        /**
         * 重写PdfPageEventHelper中的onEndPage方法
         */
        @Override
        public void onEndPage(PdfWriter writer, Document document) {
            // 新建获得用户页面文本和图片内容位置的对象
            PdfContentByte pdfContentByte = writer.getDirectContent();
            // 保存图形状态
            pdfContentByte.saveState();
            String text = writer.getPageNumber() + "/";
            // 获取点字符串的宽度
            float textSize = bfChinese.getWidthPoint(text, 9);
            pdfContentByte.beginText();
            // 设置随后的文本内容写作的字体和字号
            pdfContentByte.setFontAndSize(bfChinese, 9);

            // 定位‘X/‘
            float x = (document.right() + document.left()) / 2;
            float y = 56f;
            pdfContentByte.setTextMatrix(x, y);
            pdfContentByte.showText(text);
            pdfContentByte.endText();

            // 将模板加入到内容(content)中- // 定位‘Y‘
            pdfContentByte.addTemplate(total, x + textSize, y);

            pdfContentByte.restoreState();
        }

        /**
         * 重写PdfPageEventHelper中的onCloseDocument方法
         */
        @Override
        public void onCloseDocument(PdfWriter writer, Document document) {
            total.beginText();
            try {
                String prefixFont = "";
                String os = System.getProperties().getProperty("os.name");
                if(os.startsWith("win") || os.startsWith("Win")){
                    prefixFont = "C:\\Windows\\Fonts" + File.separator;
                }else {
                    prefixFont = "/usr/share/fonts/chinese" + File.separator;
                }

                bfChinese = BaseFont.createFont(prefixFont + "simsun.ttc,0",BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
                total.setFontAndSize(bfChinese, 9);
            } catch (DocumentException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
            total.setTextMatrix(0, 0);
            // 设置总页数的值到模板上,并应用到每个界面
            total.showText(String.valueOf(writer.getPageNumber() - 1));
            total.endText();
        }
    }

    //页眉事件
    private static class Header extends PdfPageEventHelper {
        public static PdfPTable header;

        public Header(PdfPTable header) {
            Header.header = header;
        }

        @Override
        public void onEndPage(PdfWriter writer, Document document) {
            //把页眉表格定位
            header.writeSelectedRows(0, -1, 36, 806, writer.getDirectContent());
        }

        /**
         * 设置页眉
         * @param writer
         * @param req
         * @throws MalformedURLException
         * @throws IOException
         * @throws DocumentException
         */
        public void setTableHeader(PdfWriter writer) throws MalformedURLException, IOException, DocumentException {
            String imageAddress = "E://TESTPDF/";
            PdfPTable table = new PdfPTable(1);
            table.setTotalWidth(555);
            PdfPCell cell = new PdfPCell();
            cell.setBorder(0);
            Image image01;
            image01 = Image.getInstance(imageAddress + "testhead.png"); //图片自己传
            //image01.scaleAbsolute(355f, 10f);
            image01.setWidthPercentage(80);
            cell.setPaddingLeft(30f);
            cell.setPaddingTop(-20f);
            cell.addElement(image01);
            table.addCell(cell);
            Header event = new Header(table);
            writer.setPageEvent(event);
        }
    }

    //页脚事件
    private static class Footer extends PdfPageEventHelper {
        public static PdfPTable footer;

        @SuppressWarnings("static-access")
        public Footer(PdfPTable footer) {
            this.footer = footer;
        }

        @Override
        public void onEndPage(PdfWriter writer, Document document) {
            //把页脚表格定位
            footer.writeSelectedRows(0, -1, 38, 50, writer.getDirectContent());
        }

        /**
         * 页脚是图片
         * @param writer
         * @throws MalformedURLException
         * @throws IOException
         * @throws DocumentException
         */
        public void setTableFooter(PdfWriter writer) throws MalformedURLException, IOException, DocumentException {
            String imageAddress = "E://TESTPDF/";
            PdfPTable table = new PdfPTable(1);
            table.setTotalWidth(523);
            PdfPCell cell = new PdfPCell();
            cell.setBorder(1);
            Image image01;
            image01 = Image.getInstance(imageAddress + "testfooter.png"); //图片自己传
            image01.scaleAbsoluteWidth(523);
            image01.scaleAbsoluteHeight(30f);
            image01.setWidthPercentage(100);
            cell.addElement(image01);
            table.addCell(cell);
            Footer event = new Footer(table);
            writer.setPageEvent(event);
        }

        /**
         * 页脚是文字
         * @param writer
         * @param songti09
         */
        public void setTableFooter(PdfWriter writer, Font songti09) {
            PdfPTable table = new PdfPTable(1);
            table.setTotalWidth(520f);
            PdfPCell cell = new PdfPCell();
            cell.setBorder(1);
            String string = "地址:  XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX         网址:  www.xxxxxxx.com       咨询热线:  400x-xxx-xxx";
            Paragraph p = new Paragraph(string, songti09);
            cell.setPaddingLeft(10f);
            cell.setPaddingTop(-2f);
            cell.addElement(p);
            table.addCell(cell);
            Footer event = new Footer(table);
            writer.setPageEvent(event);
        }
    }

    public static void main(String[] args) throws Exception {
        Document document = new Document(PageSize.A4, 48, 48, 60, 65);
        // add index page.
        String path = "test.pdf";
        String dir = "E://TEST";
        File file = new File(dir);
        if (!file.exists()) {
            file.mkdir();
        }
        path = dir + File.separator + path;
        FileOutputStream os = new FileOutputStream(path);
        PdfWriter writer = PdfWriter.getInstance(document, os);

        // 设置页面布局
        writer.setViewerPreferences(PdfWriter.PageLayoutOneColumn);
        // 为这篇文档设置页面事件(X/Y)
        writer.setPageEvent(new PageXofYTest());

        String prefixFont = "";
        String oss = System.getProperties().getProperty("os.name");
        if(oss.startsWith("win") || oss.startsWith("Win")){
            prefixFont = "C:\\Windows\\Fonts" + File.separator;
        }else {
            prefixFont = "/usr/share/fonts/chinese" + File.separator;
        }
        BaseFont baseFont1 = BaseFont.createFont(prefixFont + "simsun.ttc,0", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
        Font songti09 = new Font(baseFont1, 9f); //宋体 小五

        document.open();

        //document.newPage();
        PdfPTable pdfPTable = new PdfPTable(1);
        // 为报告添加页眉,事件的发生是在生成报告之后,写入到硬盘之前
        //Header headerTable = new Header(pdfPTable);
        //headerTable.setTableHeader(writer);
        //Footer footerTable = new Footer(pdfPTable);
        //footerTable.setTableFooter(writer, songti09);
        document.add(pdfPTable);

        for (int i = 0; i < 80; i++) {
            document.add(new Paragraph("the first page"));
        }

        //document.newPage();
        document.add(new Paragraph("the second page"));

        document.close();
        os.close();
    }
}

原文地址:https://www.cnblogs.com/lyb0103/p/10218039.html

时间: 2024-10-03 14:01:38

itext生成pdf(附带页眉,页脚,页码)的相关文章

itext 生成pdf文件添加页眉页脚

原文来自:https://www.cnblogs.com/joann/p/5511905.html 我只是记录所有jar版本,由于版本冲突及不兼容很让人头疼的,一共需要5个jar, 其中itextpdf是itext的升级版本,并且itextpdf-5.5.jar以上版本算总页数不需要-1,之前版本必须-1: jfinal.jar只能用2.0版本,用3.0的会报版本过高:希望能帮到有需要的人 itextpdf-5.5.13.jar 下载地址:http://central.maven.org/mav

c# iText 生成PDF 有文字,图片,表格,文字样式,对齐方式,页眉页脚,等等等,

#region 下载说明书PDF protected void lbtnDownPDF_Click(object sender, EventArgs e) { int pid = ConvertHelper.GetInteger(Request["PID"]); pds = p.GetModel(pid); #region 第一种方法 DataTable datatable = new DataTable(dt.ToString()); try { string Url1 = &quo

【Itext】7步制作Itext5页眉页脚pdf实现第几页共几页

itext5页眉页脚工具类,实现page x of y 完美兼容各种格式大小文档A4/B5/B3,兼容各种文档格式自动计算页脚XY轴坐标 鉴于没人做的这么细致,自己就写了一个itext5页眉页脚工具类,实现第几页/共几页,方便各位刚进入itext的童鞋调用.2013年9月16日 14:51:01 背景:网上流传的都是一些简单的demo,直接扔个A4文档就说实现了,其实很坑的,换个A4横版打印,那些代码就不行了,所以自己搞了这个出来. 如果页面看着排版不好,请移步我的百度空间 :http://hi

iText + Freemarker实现pdf的导出,支持中文、css以及图片,页眉页脚,页眉添加图片

本文为了记录自己的实现过程,具体的实现步骤是参考博文 https://www.cnblogs.com/youzhibing/p/7692366.html 来实现的,只是在他的基础上添加了页眉页脚及页眉图片 原来是决定采用wkhtmlToPdf将html页面转换为pdf,而且html样式保存的还挺好,但是最后尝试下来发现,他转换不了我们框架中的html页面,将框架中的html页面地址进行转换总是会转换成首页的图片,多次查询无果,最终放弃了,改换成itext工具. 由于我们的需求中要求有页眉和页脚,

PDF页眉页脚删除用什么方法

PDF页眉页脚删除用什么方法.相信每一个小伙伴都在网络上下载过PDF文件,当我们打开PDF文件后,发现文件里有着我们不需要的页眉与页脚,我们应该如何将其删除掉呢?如果屏幕前的你不清楚的话,那就和小编一起学习学习吧. 操作软件:迅捷PDF编辑器 工具下载地址:https://www.xunjiepdf.com/editor 1.首先我们需要下载一款能够编辑PDF文件的工具来使用,这里小编使用的是迅捷PDF编辑器. 2.利用迅捷PDF编辑器将我们需要的PDF文件打开,打开文件后我们可以看到页面中的页

如何使用PDF编辑工具添加PDF页眉页脚

不管是在学习中还是在工作中,都会使用到PDF文件,在很多的时候,大家都会使用到PDF文件,对于PDF文件的修改,则是需要使用到PDF编辑软件的,那么,如何使用PDF编辑工具添加PDF页眉页脚呢,是不是有很多的小伙伴都想知道应该怎么做呢,那就可以看看下面的文章,说不定就知道了哦. 1.打开运行迅捷PDF编辑器,在编辑器中打开需要修改的PDF文件. 2.打开文件后,选择编辑器中菜单栏里的文档,然后选择文档中的页眉页脚,在页眉页脚工具中有添加,全部删除以及管理,点击添加. 3.点击添加后,在添加的页面

PDF文件怎么添加页眉页脚,有什么简单的方法吗?

PDF文件怎么添加页眉页脚呢?我们现在对PDF文件也算是比较熟悉了,但是对于PDF文件怎么编辑还不是那么了解,其实我们想要给PDF文件添加页眉页脚也需要使用到迅捷PDF编辑器,下面小编就为大家操作一下PDF编辑器给PDF文件添加页眉页脚的操作步骤, 操作软件:迅捷PDF编辑器 1:我们将PDF编辑器安装到自己的电脑中,双击将PDF编辑器打开,然后将需要编辑的PDF文件添加到软件中来. 2:在软件的顶部找到文档,点击文档可以找到页眉页脚,点击页眉页脚就可以找到添加了. 3:点击添加就会出现一个弹窗

如何给PDF文件添加页眉页脚?你知道哪种方法简单吗?

如何给PDF文件添加页眉页脚呢?我们在使用PDF文件的时候,想要给PDF文件添加页眉页脚,但是不知道怎么操作,其实想要给PDF文件添加页眉页脚还是比较简单的,下面小编就为大家操作一下PDF编辑器给PDF文件添加页眉页脚的方法. 操作软件:迅捷PDF编辑器 具体操作方法: 1:首先将迅捷PDF编辑器安装到电脑中,双击打开PDF编辑器,将PDF文件添加到软件中. 2:在软件顶部找到文档,点击文档找到页眉页脚,将鼠标移动到页眉页脚的位置,在右侧就可以找到添加. 3:点击添加在软件中就会出现一个弹窗,在

PDF如何添加页眉页脚?PDF添加页眉页脚的小技巧

PDF文件如何添加页眉页脚呢?很多实用PDF文件的人都知道PDF文件无法直接进行编辑,将要直接给PDF添加页眉页脚也是比较难得,想要给PDF添加页眉页脚就可以使用专业的PDF编辑器来进行操作.下面就为大家分享一下PDF添加页眉页脚的操作方法. 1:首先将迅捷PDF编辑器安装到自己电脑中,打开PDF编辑器将PDF文件添加到软件中. 2:在软件顶部找到文档,点击文档在下面可以找到页眉页脚,将鼠标移动到页眉页脚的位置,在右侧可以找到添加. 3:点击添加,在软件中会出现一个选择框,在选择框中可以直接填写

[BILL WEI] stimulsoft 分组页眉页脚的使用

我们在通过stimulsoft设计报表的时候,有的时候,需要做出如下图报表样式 这个时候,因为箱号是分开扩展的,我们就需要用到分组页眉了,如下图demo跟实例所示: [BILL WEI] stimulsoft 分组页眉页脚的使用,布布扣,bubuko.com