前言:接上篇freemarker生成word后,因为我们生成的是假word文档,底层还是xml,微信等app识别不了(目前还没有较好的技术解决这个问题)。所以产生了新的需求,把word的内容生成张图片。这样就可以在app端查看。
<!-- html生成图片--><dependency><groupId>com.github.xuwei-k</groupId><artifactId>html2image</artifactId><version>0.1.0</version></dependency>
生成一个ftl的html模板,就像利用freemarker生成word一样。然后替换模板的内容,这些就不在写了。可参考freemarker生成word文档
这里我转化的图片后缀用的是png,因为jpg下出来带背景颜色。由于时间原因没在研究
html2image相关方法:
loadUrl(url) - Loads HTML from URL object or URL string. (从url载入html)
loadHtml(html) - Loads HTML source. (载入本地html)
saveAsImage(file) - Save loaded HTML as image. (以图片形式保存html)
saveAsHtmlWithMap(file, imageUrl) - Creates an HTML file containing client-side image-map
FreemarkerUtils jar 项目
import freemarker.template.Template;
import freemarker.template.TemplateException;
import freemarker.template.TemplateExceptionHandler;
import gui.ava.html.image.generator.HtmlImageGenerator;
import freemarker.template.Configuration;import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.util.Map;public class FreemarkerUtils {private static String getTemplate(String template, Map<String, Object> map, String filePath, String fileName) throws IOException, TemplateException {@SuppressWarnings("deprecation")Configuration cfg = new Configuration();
// String templatePath = FreemarkerUtils.class.getResource("/").getPath() + "/ftl"; windows 上
// cfg.setDirectoryForTemplateLoading(new File(templatePath));cfg.setClassForTemplateLoading(FreemarkerUtils.class, "/ftl/");cfg.setDefaultEncoding("UTF-8");cfg.setTemplateExceptionHandler(TemplateExceptionHandler.RETHROW_HANDLER);cfg.setLogTemplateExceptions(false);Template temp = cfg.getTemplate(template);StringWriter stringWriter = new StringWriter();temp.process(map, stringWriter);stringWriter.flush();stringWriter.close();return stringWriter.getBuffer().toString();}public static void turnImage(String template, Map<String, Object> map, String filePath, String fileName, HttpServletResponse response) throws Exception {String html = getTemplate(template, map, filePath, fileName);HtmlImageGenerator imageGenerator = new HtmlImageGenerator();try {imageGenerator.loadHtml(html);Thread.sleep(500);//加入睡眠时间给充分的转化图片时间imageGenerator.getBufferedImage();Thread.sleep(500);imageGenerator.saveAsImage(filePath + File.separator + fileName);} catch (Exception e) {e.printStackTrace();throw new RuntimeException("将HTML文件转换成图片异常");}}}
FreemarkerUtils war 项目
import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;
import freemarker.template.TemplateExceptionHandler;
import gui.ava.html.image.generator.HtmlImageGenerator;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
import java.io.StringWriter;
import java.util.Map;public class FreemarkerUtils {private static String getTemplate(HttpServletRequest request, String template, Map<String, Object> map, String filePath, String fileName) throws IOException, TemplateException {@SuppressWarnings("deprecation")Configuration cfg = new Configuration();
// String templatePath = FreemarkerUtils.class.getResource("/").getPath() + "/ftl";
// cfg.setDirectoryForTemplateLoading(new File(templatePath));cfg.setServletContextForTemplateLoading(request.getServletContext(), "/ftl");cfg.setDefaultEncoding("UTF-8");cfg.setTemplateExceptionHandler(TemplateExceptionHandler.RETHROW_HANDLER);cfg.setLogTemplateExceptions(false);Template temp = cfg.getTemplate(template);StringWriter stringWriter = new StringWriter();temp.process(map, stringWriter);stringWriter.flush();stringWriter.close();return stringWriter.getBuffer().toString();}public static void turnImage(HttpServletRequest request, String template, Map<String, Object> map, String filePath, String fileName, HttpServletResponse response) throws Exception {String html = getTemplate(request, template, map, filePath, fileName);HtmlImageGenerator imageGenerator = new HtmlImageGenerator();try {imageGenerator.loadHtml(html);Thread.sleep(500);imageGenerator.getBufferedImage();Thread.sleep(500);imageGenerator.saveAsImage(filePath + File.separator + fileName);} catch (Exception e) {e.printStackTrace();throw new RuntimeException("将HTML文件转换成图片异常");}}
实际应用
前后分离项目返回base64字符串,前端处理
转base64用的包org.apache.commons.codec.binary;
String fileName = fileName + customerInfoId + ".png";File file = null;try {FreemarkerUtils.turnImage("drawImgTemplate.ftl", map, filePath, fileName, response);// 通过文件路径获得File对象(假如此路径中有一个download.pdf文件)file = new File(filePath + File.separator + fileName);return file2Base64(file);} catch (Exception e) {logger.error("图纸下载图片失败", e);} finally {if (file != null) {file.delete();}}
private String file2Base64(File file) {if (file == null) {return null;}String base64 = null;FileInputStream fin = null;try {fin = new FileInputStream(file);byte[] buff = new byte[fin.available()];fin.read(buff);base64 = Base64.encodeBase64String(buff);} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} finally {if (fin != null) {try {fin.close();} catch (IOException e) {e.printStackTrace();}}}return base64;}
war项目:
String fileName = fileName + customer.getId() + ".png";try {FreemarkerUtils.turnImage(request, "drawImgTemplate.ftl", map, filePath, fileName, response);DownloadUtils.fileDownload(response, filePath, fileName);} catch (Exception e) {logger.error("图纸下载图片失败", e);} finally {File file = new File(filePath + fileName);if (file != null) {file.delete();}}
这里都别忘了删除存在我们项目下的图片
如果放在liunx上,中文字体乱码,因为linux没有该字体,服务器放上该字体后即可
写的有点乱,就是记录下自己遇到的。
哆哆女性网商丘到淮安火车深圳seo培训深圳seo培训王牌逗王牌百度云四站合一网站制作餐饮行业装修四书五经楚辞起名字杭州网站建设前三www.100bbb.com聂字艺术签名滑姓起名大全临安19楼论坛王思聪乔任梁建设定制型网站声乐培训班起名大全钱姓起名大全大全纹身算命网站周公免费解梦大全网站推广与建设院长李晨阳网站建设周易和塔罗牌易烊千玺周冬雨恋情无锡网站seo公司农夫电影网站真的山海经凉山seo优化电子科技公司 起名字网站制作开发价格戏梦巴黎解析起名用的好字都有什么淀粉肠小王子日销售额涨超10倍罗斯否认插足凯特王妃婚姻不负春光新的一天从800个哈欠开始有个姐真把千机伞做出来了国产伟哥去年销售近13亿充个话费竟沦为间接洗钱工具重庆警方辟谣“男子杀人焚尸”男子给前妻转账 现任妻子起诉要回春分繁花正当时呼北高速交通事故已致14人死亡杨洋拄拐现身医院月嫂回应掌掴婴儿是在赶虫子男孩疑遭霸凌 家长讨说法被踢出群因自嘲式简历走红的教授更新简介网友建议重庆地铁不准乘客携带菜筐清明节放假3天调休1天郑州一火锅店爆改成麻辣烫店19岁小伙救下5人后溺亡 多方发声两大学生合买彩票中奖一人不认账张家界的山上“长”满了韩国人?单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#青海通报栏杆断裂小学生跌落住进ICU代拍被何赛飞拿着魔杖追着打315晚会后胖东来又人满为患了当地回应沈阳致3死车祸车主疑毒驾武汉大学樱花即将进入盛花期张立群任西安交通大学校长为江西彩礼“减负”的“试婚人”网友洛杉矶偶遇贾玲倪萍分享减重40斤方法男孩8年未见母亲被告知被遗忘小米汽车超级工厂正式揭幕周杰伦一审败诉网易特朗普谈“凯特王妃P图照”考生莫言也上北大硕士复试名单了妈妈回应孩子在校撞护栏坠楼恒大被罚41.75亿到底怎么缴男子持台球杆殴打2名女店员被抓校方回应护栏损坏小学生课间坠楼外国人感慨凌晨的中国很安全火箭最近9战8胜1负王树国3次鞠躬告别西交大师生房客欠租失踪 房东直发愁萧美琴窜访捷克 外交部回应山西省委原副书记商黎光被逮捕阿根廷将发行1万与2万面值的纸币英国王室又一合照被质疑P图男子被猫抓伤后确诊“猫抓病”