本文为了记录自己的实现过程,具体的实现步骤是参考博文 https://www.cnblogs.com/youzhibing/p/7692366.html 来实现的,只是在他的基础上添加了页眉页脚及页眉图片

  原来是决定采用wkhtmlToPdf将html页面转换为pdf,而且html样式保存的还挺好,但是最后尝试下来发现,他转换不了我们框架中的html页面,将框架中的html页面地址进行转换总是会转换成首页的图片,多次查询无果,最终放弃了,改换成itext工具。

  由于我们的需求中要求有页眉和页脚,并且页眉中需要有logo图片,所以在网上也是找了很多博客,尝试了网上的很多种方法都不能使用,不知道是我这边的问题还是博主们都没有进行测试就把文章发出来了,最后实在找不到能用的信息我就开始了自己的探索,最终经过我自己的探索,实现了页眉中添加图片的功能,特此记录一下。

大致实现步骤都是基于文初的那边文章,只是添加了一个Build类继承他的PdfPageEventHelper,具体代码如下:

package com.tzCloud.core.utils;

import com.itextpdf.text.Chunk;
import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Element;
import com.itextpdf.text.Font;
import com.itextpdf.text.Image;
import com.itextpdf.text.PageSize;
import com.itextpdf.text.Phrase;
import com.itextpdf.text.Rectangle;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.ColumnText;
import com.itextpdf.text.pdf.PdfContentByte;
import com.itextpdf.text.pdf.PdfPageEventHelper;
import com.itextpdf.text.pdf.PdfTemplate;
import com.itextpdf.text.pdf.PdfWriter; import java.io.IOException; /**
* PDF导出页眉、页脚、水印等处理类
* 设置页面附加属性
*
* @author LiuYu
* @date 2019/11/5 16:45
*/
public class PDFBuilder extends PdfPageEventHelper { /**
* 页眉
*/
public String header = "itext测试页眉"; /**
* 文档字体大小,页脚页眉最好和文本大小一致
*/
public int presentFontSize = 12; /**
* 文档页面大小,最好前面传入,否则默认为A4纸张
*/
public Rectangle pageSize = PageSize.A4; /**
* 模板
*/
public PdfTemplate total; /**
* 基础字体对象
*/
public BaseFont bf = null; /**
* 利用基础字体生成的字体对象,一般用于生成中文文字
*/
public Font fontDetail = null; public void setHeader(String header) {
this.header = header;
} public void setPresentFontSize(int presentFontSize) {
this.presentFontSize = presentFontSize;
} /**
*
* TODO 文档打开时创建模板
*
* @see PdfPageEventHelper#onOpenDocument(PdfWriter,
* Document)
*/
@Override
public void onOpenDocument(PdfWriter writer, Document document) {
// 共 页 的矩形的长宽高
total = writer.getDirectContent().createTemplate(50, 50);
} /**
*
* TODO 关闭每页的时候,写入页眉,写入'第几页共'这几个字。
*
* @see PdfPageEventHelper#onEndPage(PdfWriter,
* Document)
*/
@Override
public void onEndPage(PdfWriter writer, Document document) {
this.addPage(writer, document);
//this.addWatermark(writer);
} //加分页
public void addPage(PdfWriter writer, Document document){ // 首页不添加页眉和页脚
if(writer.getPageNumber() == 1){
// 用于添加首页的封面背景图,这里首页添加了两张背景图,一个从左上角一个从左下角,具体位置可修改下面的位置信息
try {
// PDF 首页顶部背景图
Image image = Image.getInstance("https://******");
// 设置图片的位置 图片位置左边是左下角为0,0
image.setAbsolutePosition(0, 441);
// 设置图片的大小
image.scaleAbsolute(570, 400); // PDF 首页底部背景图
Image instance = Image.getInstance("https://*****");
instance.setAbsolutePosition(0, 0);
instance.scaleAbsolute(595, 260); document.add(image);
document.add(instance);
} catch (IOException | DocumentException e) {
e.printStackTrace();
} return;
} //设置分页页眉页脚字体
Image image = null;
try {
// 页眉logo图片实例
image = Image.getInstance("https://******");
if (bf == null) {
bf = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", false);
}
if (fontDetail == null) {
// 数据体字体
fontDetail = new Font(bf, presentFontSize, Font.NORMAL);
}
} catch (DocumentException | IOException e) {
e.printStackTrace();
} PdfContentByte directContent = writer.getDirectContent(); //1、生成右侧页眉
// document.right(-20) 方法设置页眉的左右间距
// document.top(+20) 方法设置页眉的上下间距
ColumnText.showTextAligned(directContent,
Element.ALIGN_RIGHT, new Phrase("联系电话:400-000-0000", fontDetail),
document.right(), document.top(), 0); // !!!! 最重要的是这个, 如果页眉需要设置图片的话,需要在Phrase对象中添加一个Chunk对象,在Chunk对象中添加图片信息即可
Phrase p1 = new Phrase("", fontDetail);
p1.add(new Chunk(image, 0, -30));
// 1、写入左侧页眉
ColumnText.showTextAligned(directContent,
Element.ALIGN_LEFT, p1,
document.left(), document.top(-20), 0); // 2、生成右侧页脚
ColumnText.showTextAligned(directContent,
Element.ALIGN_RIGHT, new Phrase(String.valueOf(document.getPageNumber() - 1), fontDetail),
document.right(), document.bottom(-20), 0); // 2、生成左侧页脚
ColumnText.showTextAligned(directContent,
Element.ALIGN_LEFT, new Phrase("******有限公司", fontDetail),
document.left(), document.bottom(-20), 0); } /**
* 加水印
*/
public void addWatermark(PdfWriter writer){
// 水印图片
Image image;
try {
image = Image.getInstance("./web/images/001.jpg");
PdfContentByte content = writer.getDirectContentUnder();
content.beginText();
// 开始写入水印
for(int k=0;k<5;k++){
for (int j = 0; j <4; j++) {
image.setAbsolutePosition(150*j,170*k);
content.addImage(image);
}
}
content.endText();
} catch (IOException | DocumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} /**
*
* TODO 关闭文档时,替换模板,完成整个页眉页脚组件
*
* @see PdfPageEventHelper#onCloseDocument(PdfWriter,
* Document)
*/
@Override
public void onCloseDocument(PdfWriter writer, Document document) {
// 7.最后一步了,就是关闭文档的时候,将模板替换成实际的 Y 值,至此,page x of y 制作完毕,完美兼容各种文档size。
total.beginText();
// 生成的模版的字体、颜色
total.setFontAndSize(bf, presentFontSize);
//页脚内容拼接 如 第1页/共2页
String foot2 = " " + (writer.getPageNumber()) + " 页";
// 模版显示的内容
total.showText(foot2);
total.endText();
total.closePath();
}
}

具体的对PDF每页的操作都可以在这个类中进行实现,通过document的getPageNumber方法可以判断当前在PDF的第几页,然后就可以进行具体的操作了, 就例如上面的代码在首页可以添加背景图等操作。

  至此就可以实现在PDF页眉中添加图片了

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

  1. flying-saucer + iText + Freemarker实现pdf的导出, 支持中文、css以及图片

    前言 项目中有个需求,需要将合同内容导出成pdf.上网查阅到了 iText , iText 是一个生成PDF文档的开源Java库,能够动态的从XML或者数据库生成PDF,同时还可以对文档进行加密,权限 ...

  2. [Web Pdf] flying-saucer + iText + Freemarker生成pdf 跨页问题

    转载于: https://blog.csdn.net/qq_31980421/article/details/79662988 flying-saucer + iText +  Freemarker实 ...

  3. JS导出PDF插件(支持中文、图片使用路径)

    在WEB上想做一个导出PDF的功能,发现jsPDF比较多人推荐,遗憾的是不支持中文,最后找到pdfmake,很好地解决了此问题.它的效果可以先到http://pdfmake.org/playgroun ...

  4. Java iText+FreeMarker生成PDF(HTML转PDF)

    1.背景 在某些业务场景中,需要提供相关的电子凭证,比如网银/支付宝中转账的电子回单,签约的电子合同等.方便用户查看,下载,打印.目前常用的解决方案是,把相关数据信息,生成对应的pdf文件返回给用户. ...

  5. tcpdf导出pdf数据支持中文的解决方案

    步骤如下:1.确保你测试tcpdf能正常输出英文内容的pdf2.测试输入中文内容后显示是?的乱码或者空白分析原因,是因为我们输入的中文,tcpdf字体库并不支持,因此乱码或者空白显示 添加一个合适的字 ...

  6. Magento PDF发票,支持中文,以及修改的办法

    Magento PDF发票,支持中文,以及修改的办法.   如果让magento的PDF发票支持中文.Magento生成PDF发票.使用的是zend framework的zend_pdf类. 下面是一 ...

  7. PHP生成PDF完美支持中文,解决TCPDF乱码

    PHP生成PDF完美支持中文,解决TCPDF乱码 2011-09-26 09:04 418人阅读 评论(0) 收藏 举报 phpfontsheaderttfxhtml文档 PHP生成PDF完美支持中文 ...

  8. 使用iTextSharp 解析html生成pdf,xmlworker不支持中文的解决办法

    http://www.micmiu.com/opensource/expdoc/itext-xml-worker-cn/ 参考上面的文章,虽然是java的,但是和.net是对应的. 下载   html ...

  9. [itext]Java生成PDF文件

    一.前言 最近在做也导出试卷的功能,刚开始是导出为doc,可是导出来格式都有变化,最后说直接将word转为pdf,可是各种不稳定,各种报错.最后想到直接将文件写入pdf(参考:http://www.c ...

随机推荐

  1. Java对象的"后事处理"——垃圾回收(二)

    1 先谈Finalize() finalize()能做的所有工作,使用try-finally或者其他方式都可以做得更好.更及时,所以笔者建议大家完全可以忘掉Java语言中有这个方法的存在. ——< ...

  2. [考试反思]1013csp-s模拟测试71:徘徊

    分差好大...但是从排名上看也许还可以接受? 不算太炸 但是这个还是算了吧... 其实状态不是很好. T1不会,打的搜索,想到一个剪枝但是感觉没什么用,所以没打. 考后打上,85了...打上另一个就9 ...

  3. ASP.NET Core 3.0 gRPC 拦截器

    目录 ASP.NET Core 3.0 使用gRPC ASP.NET Core 3.0 gRPC 双向流 ASP.NET Core 3.0 gRPC 拦截器 一. 前言 前面两篇文章给大家介绍了使用g ...

  4. CHRONY 时间服务器

    时间同步服务chrony ntp network time Protocol之前使用的同步协议 chrony ntp协议的实现,兼容网络中的ntp服务(centos7之后就不再使用ntp,转而使用ch ...

  5. [转载]2.6 UiPath循环嵌套的介绍和使用

    一.循环嵌套的介绍 一个循环体内又包含另一个完整的循环结构,就称之为循环嵌套.内嵌的循环中还可以嵌套循环,这就是多层循环,也叫做多重循环. 二.在UiPath中结合使用循环嵌套生成99乘法表 1.打开 ...

  6. linux 自启动 | 三种方式自启动

    linux 实现自启动有多种方式,通过Linux 底层启动原理介绍,便可以理解以下几种方式 这里简单介绍一下这几种方式 一.自定义开机程序   /etc/rc.d/rc.local  1.vim  / ...

  7. 【Elasticsearch 7 探索之路】(二)文档的 CRUD 和批量操作

    上一篇,我们介绍了什么是 Elasticsearch,它能做什么用以及基本概念(索引 Index.文档 Document.类型 Type)理解.这篇主要对 文档的基本 CRUD 和 倒排索引进行讲解. ...

  8. html5基本页面

    html5基本页面 <!DOCTYPE html> <html lang="en"> <head> <meta charset=" ...

  9. spring+struts2引起的错误被记忆问题

    标题表述的比较模糊,详细情况是这样的: 目前开发的一个管理系统,当使用出现异常时会自动跳转到错误页.其处理流程是“发生异常——跳转到错误处理action——错误页”. 但是出现了一个bug,即某个操作 ...

  10. stdClass Object 数据的处理

    stdClass Object 数据的处理 在调用接口的时候往往返回的是 stdClass Object 类型的数据,我们在取数据值的时候就阔以直接使用对象->属性值的方式操作值 $ret = ...