Freemarker踩坑合集(总篇)

最近在工作中使用了freemarker来进行pdf模板导出,看似一帆风顺的在本地完美运行后,部署到生产环境上却出现了许多问题,先是找不到模板之后又是中文字符无法显示。历尽万难之后终于成功导出,下面就来对这次freemaker的使用中遇到的一些问题来进行一次总结。

1.idea可以导出,但打成jar包部署后却提示找不到模板


这段话的大体意思是“找不到模板:因为无法找到配置的资源路径,所以自动去系统的根目录'/root'下寻找。”而我的模板在"/resources/templates"下,我添加日志发现创建configuration时传入的地址为null,此时我的地址获取方式为:

        ClassLoader classLoader = this.getClass().getClassLoader();
        URL resource = classLoader.getResource("templates");
        /*通过uri获取路径*/
        String templateDirectory = resource.toURI().getPath();
        /*通过url获取路径*/
        //String templateDirectory = resource.getPath();

 通过uri获得的路径为null,传入configuration为的路径为空自然无法获取到资源。经过查询资料原于是我改成用下面的url直接获取,成功获取了文件路径,但依然报错。原来之所以传入地址为空,是因为uri的getPath()获得的地址不符合规范,因此自动返回了空值。

其根本原因在于JAR包内的资源无法通过地址直接导出,只能通过文件流获取。只需要将configuration获取模板的方式改一下就好了:

//旧方法获取模板
String templateDirectory="aaa/bb/cc/";
Configuration configuration = new Configuration(Configuration.DEFAULT_INCOMPATIBLE_IMPROVEMENTS);
configuration.setDirectoryForTemplateLoading(new File(templateDirectory));
Template template = configuration.getTemplate(templateName,"UTF-8");
//新方法获取模板(可读取jar包中的资源)
Configuration ftlConifg = new Configuration(Configuration.VERSION_2_3_29);
ftlConifg.setClassForTemplateLoading(PdfUtil.class, "/templates");
Template template = ftlConifg.getTemplate(templateName, StandardCharsets.UTF_8.toString());

2.导出中文为乱码问题

这个问题是因为在Linux服务器上没有中文字体,在Linux上安装字体后根据地址进行导入就可以了。

            ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
            ConverterProperties converterProperties = new ConverterProperties();
            converterProperties.setCharset("UTF-8");
            FontProvider fontProvider = new FontProvider();
            //添加系统字体
            fontProvider.addSystemFonts();
            //根据地址添加导入字体
            FontProgram fontProgram1 = FontProgramFactory.createFont("/usr/share/fonts/chinese/MSYH.TTC,0");
            FontProgram fontProgram2 = FontProgramFactory.createFont("/usr/share/fonts/chinese/MSYHBD.TTC,0");
            FontProgram fontProgram3 = FontProgramFactory.createFont("/usr/share/fonts/chinese/MSYHL.TTC,0");
            fontProvider.addFont(fontProgram1);
            fontProvider.addFont(fontProgram2);
            fontProvider.addFont(fontProgram3);
            converterProperties.setFontProvider(fontProvider);
            HtmlConverter.convertToPdf(content,outputStream,converterProperties);

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
FreeMarker是一个用于生成HTML Web页面的模板引擎。它被设计用于将视图从业务逻辑中分离,通过模板来生成页面并展示数据。虽然FreeMarker具有一些编程能力,但通常由Java程序准备要显示的数据,然后由FreeMarker生成页面。它不是一个Web应用框架,而是适合作为Web应用框架的一个组件。FreeMarker与容器无关,可以应用于非Web应用程序环境。它更适合作为Model2框架(如Struts)的视图组件,也可以在模板中使用JSP标记库。FreeMarker具有强大的模板语言,支持常用的指令、循环结构、变量定义和复杂表达式等。它还提供了通用数据模型,可以方便地处理各种数据。\[2\] 在使用FreeMarker时,可以在webapp目录下创建template文件夹,并在其中创建模板文件。模板文件使用HTML标签和FreeMarker注释语法来定义页面结构和逻辑。可以通过${}语法来引用数据并在页面中展示。\[3\] 要启动使用FreeMarker的项目,需要在项目的依赖中添加FreeMarker的相关配置。可以在pom.xml文件中添加如下依赖配置: ```xml <dependency> <groupId>org.FreeMarker</groupId> <artifactId>FreeMarker</artifactId> <version>2.3.29</version> </dependency> ``` 这样就可以在项目中使用FreeMarker来生成页面了。\[1\] #### 引用[.reference_title] - *1* [FreeMarker简介及使用示例](https://blog.csdn.net/qq_39326472/article/details/131264082)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [FreeMarker详细介绍](https://blog.csdn.net/weixin_44454512/article/details/109877418)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值