Thymeleaf 模板生成html
- 引入 Thymeleaf 相关依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>ognl</groupId>
<artifactId>ognl</artifactId>
<version>3.2</version>
</dependency>
- 准备模板html
<!DOCTYPE html>
<html lang="zh" xmlns:th="http://www.thymeleaf.org">
<html lang="en">
<head>
<meta charset="UTF-8"/>
<title>Title</title>
<style>
* {
margin: 0;
padding: 0;
box-sizing: border-box
}
body {
font-family: SimSun;
}
h1.title.header {
padding: 30px;
text-align: center;
background-color: #4581ff;
color: #fff;
}
.main .code-container {
width: 33%;
text-align: center;
float: left;
}
.main .code-container .title{
height: 40px;
margin-top: 20px;
margin-bottom: 10px;
font-size: 20px;
}
.main .code-container img{
width: 180px;
}
</style>
</head>
<body>
<div>
<h1 class="header title" th:text="${title}"></h1>
<div class="main">
<div class="code-container" th:each="item : ${images}">
<div class="title" th:text="${item.title}">第一单元</div>
<img th:src="${item.address}">
</div>
</div>
</div>
</body>
</html>
- 基于模板生成html
ClassLoaderTemplateResolver resolver = new ClassLoaderTemplateResolver();
resolver.setPrefix("templates/");
resolver.setSuffix(".html");
TemplateEngine engine = new TemplateEngine();
engine.setTemplateResolver(resolver);
Context context = new Context();
context.setVariable("title", "测试");
context.setVariable("images", list);
// 生成文件到指定路径
engine.process("模板名称", context, new PrintWriter(htmlPath));
// 生成字符串内容
String html = engine.process("模板名称", context);
当然也可以通过注入bean的方式注入 模板引擎
@Bean("myTemplateEngine")
public TemplateEngine templateEngine(){
ClassLoaderTemplateResolver resolver = new ClassLoaderTemplateResolver();
resolver.setPrefix("templates/");
resolver.setSuffix(".html");
TemplateEngine engine = new TemplateEngine();
engine.setTemplateResolver(resolver);
return engine;
}
Html 转 Pdf
- 引入 itextpdf 相关依赖
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>font-asian</artifactId>
<version>7.1.13</version>
</dependency>
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>html2pdf</artifactId>
<version>4.0.5</version>
</dependency>
- Html 转 Pdf
// 将html 内容字符串 转换为 Pdf
OutputStream outputStream = new FileOutputStream(outPath);
PdfWriter pdfWriter = new PdfWriter(outputStream);
PdfDocument pdfDocument = new PdfDocument(pdfWriter);
//设置为A4大小
pdfDocument.setDefaultPageSize(PageSize.A4);
HtmlConverter.convertToPdf(html, pdfDocument, initProperties())
private static ConverterProperties initProperties() throws IOException {
ConverterProperties properties = new ConverterProperties();
FontProvider fontProvider = new FontProvider();
PdfFont font = PdfFontFactory.createFont("STSongStd-Light", "UniGB-UCS2-H");
fontProvider.addFont(font.getFontProgram(),"UniGB-UCS2-H");
properties.setFontProvider(fontProvider);
// 设置资源可访问地址,这点极为重要,springboot 下hmtl访问图片时,
// 指定此路径后可以直接访问该路径下的图片文件
properties.setBaseUri("path");
return properties;
}
存在的坑
- 导不出图片时需设置baseUri
- 若html 存在某些特殊字符转pdf 会报错
- 转pdf时,html 的一些css样式并不支持