原创  关于freemark 字符超长 ,渲染换行,完美方案

分类:java 2021-03-09T20:56:45    93人阅读   

官方介绍:

FreeMarker 是一款 模板引擎: 即一种基于模板和要改变的数据, 并用来生成输出文本(HTML网页,电子邮件,配置文件,源代码等)的通用工具。 它不是面向最终用户的,而是一个Java类库,是一款程序员可以嵌入他们所开发产品的组件。


背景:

    使用spring-boot-starter-freemarker + core-renderer 将生成的html转成图片碰到一个问题,当文字超长时 不会换行,导致其他内容超出图片。所以怎么实现换行呢?


思路一:

    后端代码按照字符长度截断添加"<br/>"放到字符中然后页面显示字符,

    注意点:需要设置br border-width:0px


思路二:

<#list 0..(str?length)!0 as i> 
 ${str?substring(0,i)}  
<#if i gt 24>  
<div style='border-width:0px'> 
 ${str?substring(0,i)}  
</div> 
 </#if>
</#list>


思路三:

<#if item.create_org_name?length gt 18>   
${item.content}
<#else> 
     ${item.content?substring(18,item.create_org_name?length)}
</#if>


思路四,实现freemark 渲染方法:

package com.mall.service;

import freemarker.template.SimpleScalar;
import freemarker.template.TemplateMethodModelEx;
import freemarker.template.TemplateModel;
import lombok.extern.slf4j.Slf4j;

import java.util.List;

@Slf4j
public class LineFeedMethod implements TemplateMethodModelEx {


    public static final int MAX_LENGTH = 8;

    public TemplateModel exec(List args) {
        Object data = args.get(0);
        String val = "";
        int txtLength = MAX_LENGTH;
        if (args.size() > 2) {
            txtLength = Integer.parseInt(args.get(1).toString());
        }
        if (null != data) {

            StringBuilder sb = new StringBuilder();
            val = data.toString();
            int len = val.length();
            int pages = (int) Math.ceil((double) len / txtLength);
            for (int i = 0; i < pages; i++) {
                sb.append("
"); int end = (i + 1) * txtLength; sb.append(val.substring(i * txtLength, end > len ? len : end)); sb.append("
"); } val = sb.toString(); } return new SimpleScalar(val); } }

通过data将方法传递给页面


data.put("lineFeed",new LineFeedMethod());

页面使用


{$lineFeed(item.remark)}