Use freemarker+html2image para convertir html en imágenes

Prefacio: después de la palabra generada por freemarker en el artículo anterior, debido a que generamos un documento de palabra falso, la capa inferior sigue siendo xml y las aplicaciones como WeChat no pueden reconocerla (no hay mejor tecnología para resolver este problema). Entonces, hay un nuevo requisito para generar una imagen a partir del contenido de la palabra. Esto se puede ver en el lado de la aplicación.

Paquete de guía

<!-- html生成图片-->
		<dependency>
			<groupId>com.github.xuwei-k</groupId>
			<artifactId>html2image</artifactId>
			<version>0.1.0</version>
		</dependency>

Genere una plantilla ftl html, al igual que usar freemarker para generar word. Luego reemplace el contenido de la plantilla, estos ya no se escriben. Puedes referirte a freemarker para generar un documento de word,
aquí el sufijo de la imagen que convertí es png, porque el jpg sale con un color de fondo. No investigar por falta de tiempo

Después de reemplazar la plantilla, use html2image para convertir html en una imagen

Métodos relacionados con html2image:
loadUrl(url): carga HTML desde un objeto URL o cadena de URL. (cargar html desde url)
loadHtml(html): carga código fuente HTML. (cargar html local)
saveAsImage(archivo): guarda HTML cargado como imagen. (guarda html como imagen)
saveAsHtmlWithMap(archivo, imageUrl): crea un archivo HTML que contiene un mapa de imagen del lado del clientegenerated from HTML’s links. (创建一个HTML文件包含客户端image-map)
getLinks() - List all links in the HTML document and their corresponding href, target, title, position and dimension. (列出所有在HTML文档的链接和相应href、目标、头衔、位置和尺寸)
getBufferedImage() - Get AWT buffered image of the HTML. (获得awt,html缓冲后的图片)
getLinksMapMarkup(mapName) - Get HTML snippet of the client-side image-map
generated from the links. (HTML代码段里获得的客户端image-map <地图>产生的链接)
get/setOrientation(orientation) - Get/Set document orientation (left-to-right or right-to-left). (get/set文本定位)
get/setSize(dimension) - Get/Set size of the generated image. (设置生成图片大小)

utilidades personalizadas

Proyecto jar de FreemarkerUtils

import freemarker.template.Template;
import freemarker.template.TemplateException;
import freemarker.template.TemplateExceptionHandler;
import gui.ava.html.image.generator.HtmlImageGenerator;
import freemarker.template.Configuration;

import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.util.Map;

public class FreemarkerUtils {
    
    

    private static String getTemplate(String template, Map<String, Object> map, String filePath, String fileName) throws IOException, TemplateException {
    
    
        @SuppressWarnings("deprecation")
        Configuration cfg = new Configuration();
//        String templatePath = FreemarkerUtils.class.getResource("/").getPath() + "/ftl"; windows 上
//        cfg.setDirectoryForTemplateLoading(new File(templatePath));
        cfg.setClassForTemplateLoading(FreemarkerUtils.class, "/ftl/");
        cfg.setDefaultEncoding("UTF-8");
        cfg.setTemplateExceptionHandler(TemplateExceptionHandler.RETHROW_HANDLER);
        cfg.setLogTemplateExceptions(false);
        Template temp = cfg.getTemplate(template);
        StringWriter stringWriter = new StringWriter();
        temp.process(map, stringWriter);
        stringWriter.flush();
        stringWriter.close();
        return stringWriter.getBuffer().toString();
    }

    public static void turnImage(String template, Map<String, Object> map, String filePath, String fileName, HttpServletResponse response) throws Exception {
    
    
        String html = getTemplate(template, map, filePath, fileName);
        HtmlImageGenerator imageGenerator = new HtmlImageGenerator();
        try {
    
    
            imageGenerator.loadHtml(html);
            Thread.sleep(500);//加入睡眠时间给充分的转化图片时间
            imageGenerator.getBufferedImage();
            Thread.sleep(500);
            imageGenerator.saveAsImage(filePath + File.separator + fileName);
        } catch (Exception e) {
    
    
            e.printStackTrace();
            throw new RuntimeException("将HTML文件转换成图片异常");
        }
    }

}

Proyecto de guerra FreemarkerUtils

import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;
import freemarker.template.TemplateExceptionHandler;
import gui.ava.html.image.generator.HtmlImageGenerator;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
import java.io.StringWriter;
import java.util.Map;

public class FreemarkerUtils {
    
    

    private static String getTemplate(HttpServletRequest request, String template, Map<String, Object> map, String filePath, String fileName) throws IOException, TemplateException {
    
    
        @SuppressWarnings("deprecation")
        Configuration cfg = new Configuration();
//        String templatePath = FreemarkerUtils.class.getResource("/").getPath() + "/ftl";
//        cfg.setDirectoryForTemplateLoading(new File(templatePath));
        cfg.setServletContextForTemplateLoading(request.getServletContext(), "/ftl");
        cfg.setDefaultEncoding("UTF-8");
        cfg.setTemplateExceptionHandler(TemplateExceptionHandler.RETHROW_HANDLER);
        cfg.setLogTemplateExceptions(false);
        Template temp = cfg.getTemplate(template);
        StringWriter stringWriter = new StringWriter();
        temp.process(map, stringWriter);
        stringWriter.flush();
        stringWriter.close();
        return stringWriter.getBuffer().toString();
    }

    public static void turnImage(HttpServletRequest request, String template, Map<String, Object> map, String filePath, String fileName, HttpServletResponse response) throws Exception {
    
    
        String html = getTemplate(request, template, map, filePath, fileName);
        HtmlImageGenerator imageGenerator = new HtmlImageGenerator();
        try {
    
    
            imageGenerator.loadHtml(html);
            Thread.sleep(500);
            imageGenerator.getBufferedImage();
            Thread.sleep(500);
            imageGenerator.saveAsImage(filePath + File.separator + fileName);
        } catch (Exception e) {
    
    
            e.printStackTrace();
            throw new RuntimeException("将HTML文件转换成图片异常");
        }
    }

Aplicación práctica
Al separar el anverso y el reverso del proyecto, se devuelve la cadena base64 y el
paquete de procesamiento de front-end org.apache.commons.codec.binary para convertir a base64;

			String fileName = fileName + customerInfoId + ".png";
            File file = null;
            try {
    
    
                FreemarkerUtils.turnImage("drawImgTemplate.ftl", map, filePath, fileName, response);
                // 通过文件路径获得File对象(假如此路径中有一个download.pdf文件)
                file = new File(filePath + File.separator + fileName);
                return file2Base64(file);
            } catch (Exception e) {
    
    
                logger.error("图纸下载图片失败", e);
            } finally {
    
    
                if (file != null) {
    
    
                    file.delete();
                }
            }
private String file2Base64(File file) {
    
    
        if (file == null) {
    
    
            return null;
        }
        String base64 = null;
        FileInputStream fin = null;
        try {
    
    
            fin = new FileInputStream(file);
            byte[] buff = new byte[fin.available()];
            fin.read(buff);
            base64 = Base64.encodeBase64String(buff);
        } catch (FileNotFoundException e) {
    
    
            e.printStackTrace();
        } catch (IOException e) {
    
    
            e.printStackTrace();
        } finally {
    
    
            if (fin != null) {
    
    
                try {
    
    
                    fin.close();
                } catch (IOException e) {
    
    
                    e.printStackTrace();
                }
            }
        }
        return base64;
    }

proyecto de guerra:

 			String fileName = fileName + customer.getId() + ".png";
                try {
    
    
                    FreemarkerUtils.turnImage(request, "drawImgTemplate.ftl", map, filePath, fileName, response);
                    DownloadUtils.fileDownload(response, filePath, fileName);
                } catch (Exception e) {
    
    
                    logger.error("图纸下载图片失败", e);
                } finally {
    
    
                    File file = new File(filePath + fileName);
                    if (file != null) {
    
    
                        file.delete();
                    }
                }

No olvide eliminar las imágenes que existen en nuestro proyecto.

pregunta

Si se coloca en liunx, las fuentes chinas se distorsionarán, porque linux no tiene esta fuente, y el servidor puede poner esta fuente en él.
La escritura es un poco desordenada, así que solo registro lo que encontré.

Supongo que te gusta

Origin blog.csdn.net/weixin_43832604/article/details/111873383
Recomendado
Clasificación