Itextpdf 5 html生成pdf 页眉页脚

效果图

QQ图片20190117140345.png

继承PdfPageEventHelper重写onEndPage方法

package com.xuqiang.itext.test;

import com.itextpdf.text.*;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.ColumnText;
import com.itextpdf.text.pdf.PdfPageEventHelper;
import com.itextpdf.text.pdf.PdfWriter;

import java.io.IOException;

/**
 * @author xuqiang
 * @date 2019/1/2
 */
public class PDFBuilder extends PdfPageEventHelper {

    private Phrase leftHeader;
    private Phrase rigntHeader;

    static final int marginX = 90;
    static final int marginY = 70;

    private static BaseFont baseFont;
    // 生成下划线空白占位符
    private static String Blank;
    // 页眉字体
    private static Font font;
    // 下划线字体
    private static Phrase blankPhrase;

    PDFBuilder(String[] header) {
        this.leftHeader = new Phrase(header[0], PDFBuilder.font);
        this.rigntHeader = new Phrase(header[1], PDFBuilder.font);
    }

    static {
        try {
            // 中文字体依赖itext得itext-asian包
            baseFont = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
            StringBuilder sb = new StringBuilder();
            for (int i = 0; i < 168; i++) {
                sb.append("\u00a0");
            }
            Blank = sb.toString();
            font = new Font(PDFBuilder.baseFont, 9, Font.UNDEFINED);
            blankPhrase = new Phrase(PDFBuilder.Blank, new Font(PDFBuilder.baseFont, Font.DEFAULTSIZE, Font.UNDERLINE));
        } catch (DocumentException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * @param writer
     * @param document
     */
    @Override
    public void onEndPage(PdfWriter writer, Document document) {
        int yMargin = -20;
        float top = document.top(yMargin);
        // 第一页不生成页眉页脚
        if (document.getPageNumber() == 1) {
            return;
        }
        //生成下划线,使用空格占位
        ColumnText.showTextAligned(writer.getDirectContent(),
                Element.ALIGN_LEFT, PDFBuilder.blankPhrase,
                document.left(-1), top, 0);
        //生成左侧页眉
        ColumnText.showTextAligned(writer.getDirectContent(),
                Element.ALIGN_LEFT, leftHeader,
                document.left(), top, 0);
        //生成右侧页眉
        ColumnText.showTextAligned(writer.getDirectContent(),
                Element.ALIGN_RIGHT, rigntHeader,
                document.right(), top, 0);
        //生成页脚页数
        ColumnText.showTextAligned(writer.getDirectContent(),
                Element.ALIGN_RIGHT, new Phrase(String.valueOf(document.getPageNumber() - 1), PDFBuilder.font),
                document.right(), document.bottom(yMargin), 0);

    }
}

测试类

package com.xuqiang.itext.test;

import com.itextpdf.text.Document;
import com.itextpdf.text.PageSize;
import com.itextpdf.text.pdf.PdfWriter;
import com.itextpdf.tool.xml.XMLWorkerHelper;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.nio.charset.StandardCharsets;

/**
 * @author xuqiang
 * @date 2018/12/29
 */
public class Test {
    public static void main(String[] args) throws Exception {
        // 创建一个文档
        Document document = new Document(PageSize.A4, PDFBuilder.marginX, PDFBuilder.marginX, PDFBuilder.marginY, PDFBuilder.marginY);
        // pdf输出流
        OutputStream outputStream = new FileOutputStream("E:\\Users\\Desktop\\工作\\吊车组杆方案模板\\吊车组杆方案-test.pdf");
        PdfWriter pdfWriter = PdfWriter.getInstance(document, outputStream);
        // 添加页眉页脚
        pdfWriter.setPageEvent(new PDFBuilder(new String[]{"新增糖厂坳配变解决110kV那前站10kV903线糖厂坡配变过载工程", "吊车组立电杆施工方案"}));
        document.open();
//        XMLWorkerHelper.getInstance().parseXHtml(
//                pdfWriter,
//                document,
//                new ByteArrayInputStream(
//                        "<html><style></style><body style=\"font-family: SimSun;\"><h1>第一页1p开始</h1></body></html>"
//                                .getBytes(StandardCharsets.UTF_8)),
//                StandardCharsets.UTF_8);
        // html生成pdf,注意文件要是utf-8编码
        // 不显示中文页面注意添加字体<body style=\"font-family: SimSun;\">
        // 标签格式严格,注意使用在线格式化工具格式化html代码
        XMLWorkerHelper.getInstance().parseXHtml(
                pdfWriter,
                document,
                new FileInputStream("E:\\Users\\Desktop\\工作\\吊车组杆方案模板\\吊车组杆方案.htm"),
                StandardCharsets.UTF_8);
        document.close();
    }
}

依赖

    compile 'com.itextpdf:itextpdf:5.5.13'
    compile 'com.itextpdf.tool:xmlworker:5.5.13'
    compile 'com.itextpdf:itext-asian:5.2.0'

springMVC导出PDF,解决下载文件中文乱码

/**
     * 导出PDF文件
     * @param response
     * @throws Exception
     */
    @RequestMapping("apppdf")
    public void exportPDF(HttpServletResponse response) throws Exception {
        // ftl 路径
        String path = "ftl/pdf/pdfTemplate.ftl";
        // 读取网页
        String html = Tools.readFileAllContent(path);
        // 设置也没数据
        String[] header = new String[]{"新增糖厂坳配变解决110kV那前站10kV903线糖厂坡配变过载工程", "吊车组立电杆施工方案"};
        // 文件名
        String filename = URLEncoder.encode(header[0] + ".pdf", "UTF-8");
        // 文件名写入返回头,解决中文乱码
        response.setHeader("Content-Disposition", "attachment;filename=" + filename + ";filename*=UTF-8''" + filename);
        // 获取输出流
        ServletOutputStream outputStream = response.getOutputStream();
        // 生成pdf并写回
        ExportPDFUtil.exportPDF(outputStream, html, header);
    }

github地址

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,033评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,725评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,473评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,846评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,848评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,691评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,053评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,700评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,856评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,676评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,787评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,430评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,034评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,990评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,218评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,174评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,526评论 2 343

推荐阅读更多精彩内容