基于Thymeleaf模板生成html 并转成pdf

762 阅读1分钟

Thymeleaf 模板生成html

  1. 引入 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>
  1. 准备模板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>
  1. 基于模板生成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

  1. 引入 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>
  1. 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;
}

存在的坑

  1. 导不出图片时需设置baseUri
  2. 若html 存在某些特殊字符转pdf 会报错
  3. 转pdf时,html 的一些css样式并不支持