本文为了记录自己的实现过程,具体的实现步骤是参考博文 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. 以Mnist为例从头开始自己建立数据集,搭建resnet34,识别Mnist

    写在前面: 本人小白研一,刚开始学习深度学习,将自己的第一个实验过程总结下来,看了很多的大牛的博客,在下面的程序中也参考了很多大牛的博客.在刚开始入门的学习的时候,直接编写程序下载数据集,但是后来觉得 ...

  2. Redis的使用--基本数据类型的操作命令和应用场景

    echo编辑整理,欢迎转载,转载请声明文章来源.欢迎添加echo微信(微信号:t2421499075)交流学习. 百战不败,依不自称常胜,百败不颓,依能奋力前行.--这才是真正的堪称强大!!! Red ...

  3. Python进阶函数

    一.函数的动态参数 之前我们说过了传参, 如果我们需要给一个函数传参, 而参数又是不确定的. 或者我给一个函数传很多参数, 我的形参就要写很多, 很麻烦, 怎么办呢. 我们可以考虑使用动态参数. 动态 ...

  4. emacs考场短配置

    (set-background-color "gray15") (set-foreground-color "gray") ;;设置颜色 (global-set ...

  5. NOIP模拟 4

    T1没开longlong T2忘了有向... T3是个好题,可以说将复杂度从N^2优化到NlogN是一个质的飞跃 考虑分治(要想出log可不就要分治么!(segtree也行 但我不会) 对于一个分治区 ...

  6. NOIP模拟 5

    考试的时候相当浮躁,而且脑子并不工作 T1看了几眼,觉得没思路,先skip T2一打眼,满足条件的最大值,二分!(然后就死了,根本没想有没有单调性) T3找了半天规律,一开始自己手模的K3都过不了样例 ...

  7. Asp.Net终于可以在龙芯服务器上运行啦:Jexus成功完成对国产系列CPU的适配

    为了确保我国信息化建设“安全可靠”,使用国产关键系统.关键应用.关键软硬件替代国外信息技术产品,已经在党政部门.国营企事业单位得到了进一步落实.过去运行于 Windows 服务器的 Web 应用程序, ...

  8. 易初大数据 2019年11月8日 linux 王庆超

    ◆linux系统的特点: (1)完全免费. (2)高效.安全.稳定. (3)支持多种硬件平台. (4)友好的用户界面. (5)强大的网络功能. (6)支持多任务.多用户. ◆linux体系: 1.li ...

  9. Java面向对象程序设计第15章5

    5. 利用URLConnetction对象编写程序返回某网站的首页,并将首页的内容存放到文件当中. import java.net.*; import java.io.*; public class ...

  10. 大数据HDFS相关的一些运维题

    1.在 HDFS 文件系统的根目录下创建递归目录“1daoyun/file”,将附件中的BigDataSkills.txt 文件,上传到 1daoyun/file 目录中,使用相关命令查看文件系统中 ...