0
点赞
收藏
分享

微信扫一扫

springboot集成freemarker模版引擎实现打印

在一些特定场景中,需要在项目中集成freemarker模版引擎实现打印功能,接下来就介绍一下具体的实现步骤。

首先,要明确该需求是否是前后端分离的需求,有些需求仅靠后端就可以实现,所以就没有那么复杂,这里介绍的是需要后端输出html文件字符串,需要前段展示出具体模版的数据的。

具体的实现思路:前端同学调用后端的生成html文件字符串的接口,参数需要传递具体的页面参数与模版文件名称,这样的做法是只需要一个接口就能适配各种业务场景。

首先,需要绘制模版,这需要前端同学帮忙绘制,得到一个html文件,然后我们把该文件重命名为.ftl结尾的文件,放置项目中的/resource/templates文件夹下,类似于:

接下来,就是创建接口接受前端同学传递的参数:

@ApiOperation("获取输出")
    @RequestMapping(value = "/")
    @ApiResponse(code = 200,message = "success",response = String.class)
    @ResponseBody
    public String create(@RequestBody Map<String, Object> map) throws IOException {
        String demoCml = demoTemplateService.getDemoCml(map);
        System.out.println(demoCml);
        return demoCml;
    }

这里用Map接收参数也是为了能够实现统一接口,这样就不用去做场景适配了,前端只要传递与页面保持一样的参数,就可以了。

下面就是进行文件名的适配,与freemarker的参数组装:

@Override
    public String getDemoCml(Map<String, Object> map) throws IOException {
        Configuration configuration = new Configuration(Configuration.VERSION_2_3_21);
        configuration.setClassForTemplateLoading(this.getClass(), "/templates");
        configuration.setDefaultEncoding("UTF-8");
        String fileName = map.get("templateName")+".ftl";
        System.out.println(fileName);
        Template template = configuration.getTemplate(fileName);
        return WFModelHandler.builder().template(template).build().getContent(map);
    }
@Builder
public class WFModelHandler {
    private Template template;
    public String getContent(Object model){
        try {
            return FreeMarkerTemplateUtils.processTemplateIntoString(template,model);
        } catch (Exception e) {
            throw new BusinessException("模板配置为空");
        }
    }
}

下来就可以用postman进行接口调用了,具体方法这里就不演示了,附上我这边测试的结果:

<!doctype html><html lang=\"en\"><head><meta charset=\"utf-8\"><title>科技管理系统</title><style> .mui-title {text-align: center;}  table {border-collapse: collapse;}  th, td {height: 50px;width: 160px;border: 1px solid black;padding: 0;text-align: center;}  ul li {list-style: none;height: 50px;}  ul li div {width: 300px;float: left;}</style></head><body><header class=\"mui-bar mui-bar-nav\"><h1 class=\"mui-title\">-</h1></header><h3>科技管理系统</h3><ul><li><div>单据编号:-</div><div class=\"lie2\">单据名称:-</div></li><li><div>请假人:-</div><div class=\"lie2\">请假类型:-</div></li><li><div>请假时间:-</div><div class=\"lie2\">请假天数:-</div></li><li><div>部门:质量管理部</div><div class=\"lie2\">申请日期:-</div></li></ul><h4>处理记录:</h4><table><thead><tr><th>序号</th><th>处理人</th><th>处理节点</th><th>处理时间</th><th>处理结果</th><th>处理意见</th><th>流程实例id</th></tr></thead><tbody></tbody></table></body></html>

注:这里说明一下,在ftl文件中,我们需要格式化成一行,这样返回的html文件字符串就没有多余的空格,前端同学再处理的时候也就不需要做特别的处理。

idea中快捷键:ctrl+shift+j(格式化为一行)  ctrl+alt+l(格式化为标准格式)
 

举报

相关推荐

0 条评论