itex将html转成pdf加水印,Springboot 中集成itextpdf HTML转PDF并添加水印(支持中文)

依赖包 pom.xml 配置

5.5.11

5.2.0

com.itextpdf

itextpdf

${itextPdf.version}

com.itextpdf

itext-asian

${itextAsian.version}

com.itextpdf.tool

xmlworker

${itextPdf.version}

代码帮助类主要方法

/**

* 生成PDF文件的主要方法

* @param filePath 生成pdf文件存放的完整绝对路径 example: **/test.pdf

* @param context pdf 正文

* @param watermark pdf 每页的水印, 建议不要过长 8个字符差不多了, 太长需要调节字体大小, 否则无法显示完整

*/

public static void createPDF(String filePath, String content, String waterMark) {

Assert.notNull(filePath, "FilePath can not be null");

Assert.notNull(content, "Content can not be null");

Assert.notNull(waterMark, "WaterMark can not be null");

Document document = new Document(PageSize.A4);

try {

PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(filePath));

writer.setPageEvent(new CustomEvent(waterMark));

document.addTitle("PDF标题");

document.open();

// 额外添加内容的方法 如果只是普通文本转pdf, 用下面注释的代码即可, 注释后面的代码为html to pdf

// BaseFont baseFont = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H",

// BaseFont.EMBEDDED);

// Font font = new Font(baseFont);

// document.add(new Paragraph(content, font));

ByteArrayInputStream in = new ByteArrayInputStream(content.getBytes());

ByteArrayInputStream is = new ByteArrayInputStream("".getBytes());

XMLWorkerHelper.getInstance().parseXHtml(writer, document, in,is,new PdfFont());

} catch (Exception e) {

e.printStackTrace();

} finally {

document.close();

}

}

/**

* 中文字体支持

*/

static class PdfFont extends XMLWorkerFontProvider {

@Override

public Font getFont(String fontname, String encoding, boolean embedded,

float size, int style, BaseColor color) {

String font = fontname;

if (font == null) {

font = "宋体";

}

if (size <= 0) {//size<0 会使内容重叠在一体

size = 10.5f;

}

return super.getFont(font, encoding, embedded, size, style, color);

}

}

/**

* 事件处理类, 用于监听pdf页码增加时, 每页增加水印

*/

static class CustomEvent extends PdfPageEventHelper {

private String waterMark;

public CustomEvent(String waterMark) {

this.waterMark = waterMark;

}

@Override

public void onStartPage(PdfWriter writer, Document document) {

try {

// 加入水印

PdfContentByte waterMar = writer.getDirectContentUnder();

// 开始设置水印

waterMar.beginText();

// 设置水印透明度

PdfGState gs = new PdfGState();

// 设置填充字体不透明度为0.2f

gs.setFillOpacity(0.1f);

// 设置水印字体参数及大小

BaseFont baseFont = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H",

BaseFont.EMBEDDED);

waterMar.setFontAndSize(baseFont,60);

// 设置透明度

waterMar.setGState(gs);

// 设置水印对齐方式 水印内容 X坐标 Y坐标 旋转角度

waterMar.showTextAligned(Element.ALIGN_CENTER, waterMark , 300, 500, 45);

//结束设置

waterMar.endText();

waterMar.stroke();

} catch (Exception e) {

e.printStackTrace();

}

}

}

如此即可正常解析html标签和css样式,生产pdf文件。

需要注意的是, 正常在windows环境, 中文字体齐全, 支持较好, 生产得pdf一般没问题,

但是在Linux环境下, 没有中文字体库, 生产pdf后, 正文会不显示中文内容。

所以需要添加中文字体集, 解决办法参考:

https://blog.csdn.net/ieeso/article/details/81902005

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值