关于ftl模板转换成pdf文件的相关代码

公司最近要求写一个邮件发送功能,要将凭据以附件的形式发送给客户的邮箱。因为页面使用的是Freemarker模板,而且不同业务的凭据内容不同,不能去一个个的画pdf页面,所以将ftl模板转换成pdf文件这个想法比较合理。在网上找了很多的资料,下面整理的是一套可用的代码ftl-->html-->pdf,分享出来。不过在公司中并没有使用这些代码,因为公司的ftl模板内容比较复杂,在ftl-->html的过程中一直报错,解决办法在下面介绍。

首先是pom文件,即依赖的准备,因为使用的是Freemarker模板,所以一定要有freemarker相关依赖,另外两个依赖是用来进行html-->pdf转换的,版本号一定不要搞错,否则可能会报错。


    org.springframework.boot
    spring-boot-starter-freemarker



    com.itextpdf
    itextpdf
    5.4.2



    org.xhtmlrenderer
    core-renderer
    R8

接下来是代码部分,代码在我自己的电脑上是成功运行的。

import freemarker.template.Configuration;
import freemarker.template.DefaultObjectWrapper;
import freemarker.template.Template;
import org.springframework.ui.Model;

import java.io.*;

//ftl模板转换成html文件的工具类
public class DocUtils {

    public static void crateHTML(Model data,String templatePath,String templateName,String targetHtmlPath){
        Configuration freemarkerCfg = new Configuration();
        //加载模版
        Writer out = null;
        try {
            //设置要解析的模板所在的目录,并加载模板文件
            freemarkerCfg.setDirectoryForTemplateLoading(new File(templatePath));
            //设置包装器,并将对象包装为数据模型
            freemarkerCfg.setObjectWrapper(new DefaultObjectWrapper());
            //指定模版路径
            Template template = freemarkerCfg.getTemplate(templateName,"UTF-8");
            template.setEncoding("UTF-8");
            //静态页面路径
            FileOutputStream fos = new FileOutputStream(targetHtmlPath);
            out = new OutputStreamWriter(fos,"UTF-8");
            //合并数据模型与模板
            template.process(data, out);
        } catch (Exception e) {
            e.printStackTrace();
        }finally{
            try {
                out.flush();
                out.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }


}

由html转换成pdf的代码

import com.lowagie.text.DocumentException;
import org.xhtmlrenderer.pdf.ITextRenderer;

import java.io.*;
import java.net.MalformedURLException;

//html-->pdf工具类
public class ITextRendererTest {
    public boolean generatePdf(String inputFile, String outputFile)  {

        String url = "";
        OutputStream os=null;
        try {
            url = new File(inputFile).toURI().toURL().toString();
            os = new FileOutputStream(outputFile);
            ITextRenderer renderer = new ITextRenderer();

            renderer.setDocument(url);//url
            renderer.layout();
            renderer.createPDF(os);
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (DocumentException e) {
            e.printStackTrace();
        } finally {
            try {
                os.close();
            } catch (IOException e) {
                e.printStackTrace();
            }

        }
        return true;
    }
}

在公司中ftl-->html转换失败,不识别一些变量与路径,因此并没有使用这一套代码。在公司中是这样解决的:公司源代码中写一个类MyFreeMarkerView继承FreeMarkerView,并重写其中的方法,在其渲染并填充页面前去执行我们自己的ftl-->html代码与html-->pdf代码,然后调用邮箱的工具类完成邮件的发送。因工作的一切内容都在虚拟机中完成,因此在无法展现代码,就只写一下解决办法。

你可能感兴趣的:(FreeMarker模板,文件操作)