springboot项目--freemarker使用ftl模板文件动态生成图片

简介: springboot项目--freemarker使用ftl模板文件动态生成图片

@[TOC]

1.需要的maven依赖

<!-- freemarker -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-freemarker</artifactId>
        </dependency>

        <!-- htmlString生成图片 -->
        <dependency>
            <groupId>org.xhtmlrenderer</groupId>
            <artifactId>core-renderer</artifactId>
            <version>R8</version>
        </dependency>

2.需要的模板文件(例子)

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta http-equiv="Content-Type" content="text/html" charset="UTF-8"></meta>
    <title>测试</title>
    <style>
    </style>
</head>
<body>
<div >
    <div style="font-size: 100px;margin: 0;text-align: center">
        ${name!''}
    </div>
    <div style="text-align: center">
        <img src="${picture}" alt=""></img>
    </div>
</div>
</body>
</html>

存放位置:
在这里插入图片描述

3.新建FreeMarkerUtils

import freemarker.cache.ClassTemplateLoader;
import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;
import freemarker.template.TemplateExceptionHandler;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.w3c.dom.Document;
import org.xhtmlrenderer.swing.Java2DRenderer;
import org.xml.sax.SAXException;

import javax.imageio.ImageIO;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import java.awt.image.BufferedImage;
import java.io.*;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.Map;

public class FreeMarkerUtils {
   
   

    public static final Logger logger = LoggerFactory.getLogger(FreeMarkerUtils.class);

    /**
     * FreemarkerUtils加载index.ftl模板,渲染数据
     * @param template
     * @param map
     * @return
     * @throws IOException
     * @throws TemplateException
     */
    public static String getTemplate(String template, Map<String, Object> map) {
   
   
        //创建freeMarker配置对象
        Configuration cfg = new Configuration(Configuration.DEFAULT_INCOMPATIBLE_IMPROVEMENTS);
        //设置读取模板的基础路径
        cfg.setTemplateLoader(new ClassTemplateLoader(
        FreeMarkerUtils.class.getClass().getClassLoader(), "/templates"));
        //设置编码格式
        cfg.setDefaultEncoding(StandardCharsets.UTF_8.toString());
        //设置模板异常处理
        cfg.setTemplateExceptionHandler(TemplateExceptionHandler.RETHROW_HANDLER);
        //选择日志处理
        cfg.setLogTemplateExceptions(true);
        Template temp = null;
        String result = "";
        try {
   
   
            //获取模板问价
            temp = cfg.getTemplate(template, StandardCharsets.UTF_8.toString());
            StringWriter stringWriter = new StringWriter();
            //替换占位符
            temp.process(map, stringWriter);
            stringWriter.flush();
            stringWriter.close();
            //获取ftl内容字符串
            result = stringWriter.getBuffer().toString();
        } catch (IOException e) {
   
   
            e.printStackTrace();
        } catch (TemplateException e) {
   
   
            logger.info("模板读取异常" + e.getBlamedExpressionString());
            e.printStackTrace();
        }
        return result;
    }

    /**
     * 生成Image
     * @param template 模板地址
     * @param map 替换对象
     * @param width 图片宽度
     * @param height 图片高度
     * @throws Exception
     */
    public static void turnImage(String template, Map<String, Object> map,Integer width,Integer height,String format,String outImagePath) {
   
   
        //获取freeMarker替换占位符后的字符串
        String html = FreeMarkerUtils.getTemplate(template, map);
        //将字符串转为bytes
        byte[] bytes = html.getBytes(StandardCharsets.UTF_8);
        //将byte[]转换为流
        ByteArrayInputStream bin = new ByteArrayInputStream(bytes);
        //实例化文档工厂
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        try {
   
   
            //利用文档工厂实例化文档
            DocumentBuilder builder = factory.newDocumentBuilder();
            //解析流
            Document document = builder.parse(bin);
            //设置渲染图片的像素(宽和高)
            Java2DRenderer renderer = new Java2DRenderer(document, width, height);
            //获取渲染后的BufferedImage
            BufferedImage img = renderer.getImage();
            //在生成图片
            ImageIO.write(img,format,new File(outImagePath));
            //关闭流
            bin.close();
        } catch (ParserConfigurationException e) {
   
   
            logger.info("解析流出现异常!" + e.getStackTrace());
            e.printStackTrace();
        } catch (IOException e) {
   
   
            e.printStackTrace();
        } catch (SAXException e) {
   
   
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
   
   
        Map<String, Object> map = new HashMap<>();
        map.put("name", "迪迦");
        map.put("picture", "file:///E://picture//23.jpg");
        turnImage("index.ftl", map,1000,1600,"jpg","E:\\picture\\迪迦.jpg");
    }

}

4.测试结果如下

在这里插入图片描述

目录
相关文章
|
1月前
|
Java 容器
SpringBoot读取resources下的文件以及resources的资源路径
SpringBoot读取resources下的文件以及resources的资源路径
32 0
|
3月前
|
JavaScript 前端开发 Java
springboot整合minio+vue实现大文件分片上传,断点续传(复制可用,包含minio工具类)
springboot整合minio+vue实现大文件分片上传,断点续传(复制可用,包含minio工具类)
469 0
|
4天前
|
Java Maven
基于archeType模板创建Springboot脚手架
基于archeType模板创建Springboot脚手架
12 0
|
5天前
|
Java 数据安全/隐私保护 开发者
【SpringBoot】讲清楚日志文件&&lombok
【SpringBoot】讲清楚日志文件&&lombok
16 5
|
14天前
|
JSON 前端开发 JavaScript
Vue+Axios+SpringBoot后端同时接收文件和json作为请求参数
Vue+Axios+SpringBoot后端同时接收文件和json作为请求参数
25 0
|
21天前
|
前端开发 Java 开发工具
【SpringBoot】文件分片上传、合并
【SpringBoot】文件分片上传、合并
|
22天前
|
XML 前端开发 Java
Springboot整合freemarker
Springboot整合freemarker
|
1月前
|
Java
SpringBoot配置图片访问404SpringBoot配置图片访问路径springboot如何访问图片
SpringBoot配置图片访问404SpringBoot配置图片访问路径springboot如何访问图片
7 0
|
2月前
|
SQL Java 数据库连接
springboot解析txt文件顺便加到数据库中(nohup文件)
springboot解析txt文件顺便加到数据库中(nohup文件)
113 1
|
2月前
|
存储 JavaScript 前端开发
Spring Boot + Vue: 实现文件导入导出功能
本文介绍了使用Spring Boot和Vue实现文件导入导出的步骤。在后端,Spring Boot通过`MultipartFile`接收上传文件,保存至服务器,并使用`ResponseEntity`提供文件下载。前端部分,Vue项目借助`axios`发送HTTP请求,实现文件选择、上传及下载功能。这种前后端分离的实现方式提高了应用的可维护性和可扩展性。
43 2