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 map) throws IOException {
        String demoCml = demoTemplateService.getDemoCml(map);
        System.out.println(demoCml);
        return demoCml;
    }

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

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

@Override
    public String getDemoCml(Map 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进行接口调用了,具体方法这里就不演示了,附上我这边测试的结果:

科技管理系统

-

科技管理系统

  • 单据编号:-
    单据名称:-
  • 请假人:-
    请假类型:-
  • 请假时间:-
    请假天数:-
  • 部门:质量管理部
    申请日期:-

处理记录:

序号处理人处理节点处理时间处理结果处理意见流程实例id

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

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

你可能感兴趣的:(it,java,spring,boot,java,spring,freemarker)