1500字范文,内容丰富有趣,写作好帮手!
1500字范文 > itex将html转成pdf加水印 Springboot 中集成itextpdf HTML转PDF并添加水印(支持中文)

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

时间:2018-07-07 03:18:54

相关推荐

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后, 正文会不显示中文内容。

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

/ieeso/article/details/8190

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。