官方介绍:
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)}