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.测试结果如下

在这里插入图片描述

目录
相关文章
|
Java Maven Android开发
微服务——SpringBoot使用归纳——Spring Boot开发环境搭建和项目启动
本文介绍了Spring Boot开发环境的搭建和项目启动流程。主要内容包括:jdk的配置(IDEA、STS/eclipse设置方法)、Spring Boot工程的构建方式(IDEA快速构建、官方构建工具start.spring.io使用)、maven配置(本地maven路径与阿里云镜像设置)以及编码配置(IDEA和eclipse中的编码设置)。通过这些步骤,帮助开发者顺利完成Spring Boot项目的初始化和运行准备。
1169 0
微服务——SpringBoot使用归纳——Spring Boot开发环境搭建和项目启动
|
前端开发 安全 Java
Spring Boot 便利店销售系统项目分包设计解析
本文深入解析了基于Spring Boot的便利店销售系统分包设计,通过清晰的分层架构(表现层、业务逻辑层、数据访问层等)和模块化设计,提升了代码的可维护性、复用性和扩展性。具体分包结构包括`controller`、`service`、`repository`、`entity`、`dto`、`config`和`util`等模块,职责分明,便于团队协作与功能迭代。该设计为复杂企业级应用开发提供了实践参考。
455 0
|
Java 测试技术 微服务
微服务——SpringBoot使用归纳——Spring Boot中的项目属性配置——少量配置信息的情形
本课主要讲解Spring Boot项目中的属性配置方法。在实际开发中,测试与生产环境的配置往往不同,因此不应将配置信息硬编码在代码中,而应使用配置文件管理,如`application.yml`。例如,在微服务架构下,可通过配置文件设置调用其他服务的地址(如订单服务端口8002),并利用`@Value`注解在代码中读取这些配置值。这种方式使项目更灵活,便于后续修改和维护。
323 0
|
Java 微服务 Spring
微服务——SpringBoot使用归纳——Spring Boot使用slf4j进行日志记录——使用Logger在项目中打印日志
本文介绍了如何在项目中使用Logger打印日志。通过SLF4J和Logback,可设置不同日志级别(如DEBUG、INFO、WARN、ERROR)并支持占位符输出动态信息。示例代码展示了日志在控制器中的应用,说明了日志配置对问题排查的重要性。附课程源码下载链接供实践参考。
1377 0
|
9月前
|
JSON 分布式计算 大数据
springboot项目集成大数据第三方dolphinscheduler调度器
springboot项目集成大数据第三方dolphinscheduler调度器
602 3
|
9月前
|
Java 关系型数据库 数据库连接
Spring Boot项目集成MyBatis Plus操作PostgreSQL全解析
集成 Spring Boot、PostgreSQL 和 MyBatis Plus 的步骤与 MyBatis 类似,只不过在 MyBatis Plus 中提供了更多的便利功能,如自动生成 SQL、分页查询、Wrapper 查询等。
940 2
|
9月前
|
Java 关系型数据库 MySQL
springboot项目集成dolphinscheduler调度器 实现datax数据同步任务
springboot项目集成dolphinscheduler调度器 实现datax数据同步任务
915 2
|
9月前
|
分布式计算 Java 大数据
springboot项目集成dolphinscheduler调度器 可拖拽spark任务管理
springboot项目集成dolphinscheduler调度器 可拖拽spark任务管理
499 2
|
9月前
|
Java 测试技术 Spring
简单学Spring Boot | 博客项目的测试
本内容介绍了基于Spring Boot的博客项目测试实践,重点在于通过测试驱动开发(TDD)优化服务层代码,提升代码质量和功能可靠性。案例详细展示了如何为PostService类编写测试用例、运行测试并根据反馈优化功能代码,包括两次优化过程。通过TDD流程,确保每项功能经过严格验证,增强代码可维护性与系统稳定性。
357 0
下一篇
开通oss服务