其他分享
首页 > 其他分享> > Freemarker模板静态化

Freemarker模板静态化

作者:互联网

需求:

使用Freemarker模板静态化技术根据word模板生成word文档

开发步骤:

代码:

Freemarker工具类

/**
 * Freemarker工具类
 */
public class FreemarkerUtil {
    /**
     * 生成word文件
     *
     * @param dataMap      word中需要展示的动态数据,用map集合来保存
     * @param templatePath word模板路径
     * @param templateName word模板名称,例如:model.ftl
     * @param filePath     文件生成的目标路径,例如:E:\\freemarker
     * @param fileName     生成的文件名称,例如:Test.doc
     */
    public static void createWord(Map dataMap, String templatePath, String templateName, String filePath, String fileName) {
        try {
            //创建配置实例
            Configuration configuration = new Configuration(Configuration.VERSION_2_3_31);

            //设置编码
            configuration.setDefaultEncoding("utf-8");

            //ftl模板文件
            configuration.setDirectoryForTemplateLoading(new File(templatePath));
            //获取模板
            Template template = configuration.getTemplate(templateName, String.valueOf(StandardCharsets.UTF_8));

            //输出文件
            File outFile = new File(filePath + File.separator + fileName);

            //如果输出目标文件夹不存在,则创建
            if (!outFile.getParentFile().exists()) {
                outFile.getParentFile().mkdirs();
            }

            //将模板和数据模型合并生成文件
            Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile), StandardCharsets.UTF_8));

            //生成文件
            template.process(dataMap, out);

            //关闭流
            out.flush();
            out.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

图片转base64格式工具类

/**
 * @Author: Lyh
 * @Date: 2022/3/8
 * @Description: 将 本地/网络 图片转为base64格式
 */
public class Base64Helper {
    /**
     * 编码
     *
     * @param byteArray
     * @return
     */
    public static String encode(byte[] byteArray) {
        return new String(new Base64().encode(byteArray));
    }

    /**
     * 解码
     *
     * @param base64EncodedString
     * @return ss
     */
    public static byte[] decode(String base64EncodedString) {
        return new Base64().decode(base64EncodedString);
    }


    /**
     * 本地图片转换成base64字符串
     *
     * @param imgFile 图片对象
     * @return
     */
    public static String imageToBase64ByLocal(File imgFile) {// 将图片文件转化为字节数组字符串,并对其进行Base64编码处理
        InputStream in = null;
        byte[] data = null;

        // 读取图片字节数组
        try {
            in = new FileInputStream(imgFile);

            data = new byte[in.available()];
            in.read(data);
            in.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        // 对字节数组Base64编码
        BASE64Encoder encoder = new BASE64Encoder();
        String base64Str = encoder.encode(data);
        // 替换base64后的字符串中的回车换行 然后返回Base64编码过的字节数组字符串
        return base64Str.replaceAll("(\r\n|\r|\n|\n\r)", "");
    }

    /**
     * 本地图片转换成base64字符串
     *
     * @param imgFilePath 本地图片存放路径
     * @return
     */
    public static String imageToBase64ByLocal(String imgFilePath) {
        return imageToBase64ByLocal(new File(imgFilePath));
    }

    /**
     * 在线图片转换成base64字符串
     *
     * @param imgURL 图片线上路径
     * @return
     */
    public static String imageToBase64ByOnline(String imgURL) {
        ByteArrayOutputStream data = new ByteArrayOutputStream();
        try {
            // 创建URL
            URL url = new URL(imgURL);
            byte[] by = new byte[1024];
            // 创建链接
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            conn.setRequestMethod("GET");
            conn.setConnectTimeout(5000);
            InputStream is = conn.getInputStream();
            // 将内容读取内存中
            int len = -1;
            while ((len = is.read(by)) != -1) {
                data.write(by, 0, len);
            }
            // 关闭流
            is.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        // 对字节数组Base64编码
        BASE64Encoder encoder = new BASE64Encoder();
        return encoder.encode(data.toByteArray());
    }

    /**
     * base64字符串转换成图片
     * 对字节数组字符串进行Base64解码并生成图片
     *
     * @param imgStr      base64字符串
     * @param imgFilePath 图片存放路径
     * @return
     */
    public static boolean base64ToImage(String imgStr, String imgFilePath) {
        // 图像数据为空
        if (StringUtils.isEmpty(imgStr)) {
            return false;
        }

        BASE64Decoder decoder = new BASE64Decoder();
        try {
            // Base64解码
            byte[] b = decoder.decodeBuffer(imgStr.replace("data:image/png;base64,", ""));
            for (int i = 0; i < b.length; ++i) {
                // 调整异常数据
                if (b[i] < 0) {
                    b[i] += 256;
                }
            }

            OutputStream out = new FileOutputStream(imgFilePath);
            out.write(b);
            out.flush();
            out.close();

            return true;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }
}
 

测试:

@Test
void ceShi() throws IOException {
    FreemarkerUtil.createWord(map, templatePath, templateName, filePath, fileName);
}

结语:

到这里关于Freemarker模板静态化的文章就写完了,我个人觉得需要注意的就是文档在另存为的时候不要选错了是2003格式的xml。

标签:xml,return,String,Freemarker,静态,base64,param,new,模板
来源: https://www.cnblogs.com/liyh123456/p/15980814.html