利用freemarker+html2image将html转化为图片

news/2024/5/19 21:13:03/

前言:接上篇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将html转化为图片

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 generated from HTML’s links. (创建一个HTML文件包含客户端image-map)
getLinks() - List all links in the HTML document and their corresponding href, target, title, position and dimension. (列出所有在HTML文档的链接和相应href、目标、头衔、位置和尺寸)
getBufferedImage() - Get AWT buffered image of the HTML. (获得awt,html缓冲后的图片)
getLinksMapMarkup(mapName) - Get HTML snippet of the client-side image-map
generated from the links. (HTML代码段里获得的客户端image-map <地图>产生的链接)
get/setOrientation(orientation) - Get/Set document orientation (left-to-right or right-to-left). (get/set文本定位)
get/setSize(dimension) - Get/Set size of the generated image. (设置生成图片大小)

自定义utils

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没有该字体,服务器放上该字体后即可
写的有点乱,就是记录下自己遇到的。


http://www.ppmy.cn/news/717926.html

相关文章

ppt调整版式尺寸大小为16:9,调整图片尺寸为16:9

ppt调整版式尺寸大小为16:9,调整图片尺寸为16:9

总结如下&#xff1a; 1、调整版式为16:9&#xff1a; 2、图片调整尺寸为16:9&#xff0c;这样就可以覆盖为ppt背景。
阅读更多...
将H5页面转化为图片

将H5页面转化为图片

使用html2canvas插件&#xff0c;详情&#xff1a;http://html2canvas.hertzen.com/ 实例代码&#xff1a; html <div id"capture" style"padding: 10px; background: #f5da55"><h4 style"color: #000; ">Hello world!</h4> &…
阅读更多...
图片怎么转化为pdf格式?

图片怎么转化为pdf格式?

图片现在已经成为大多数朋友经常接触使用的文件格式&#xff0c;就像我们每个人手机里都存有大量的照片&#xff0c;所以说图片是大家日常接触使用最多的文件格式。但是大量的图片在使用储存的时候&#xff0c;确实很麻烦&#xff0c;无论我们上传到网络云盘&#xff0c;还是储…
阅读更多...
如何将jpg等格式的图片转化为yuv

如何将jpg等格式的图片转化为yuv

1. 下载ffmpeg&#xff0c;转码图片和视频的利器啊&#xff01;官方免费下载地址&#xff1a; Releases BtbN/FFmpeg-Builds GitHub 2. 无需安装&#xff0c;解压缩之后即可使用。这时需要使用windows的cmd运行命令行来进行转码: 先定位到bin文件夹下面&#xff1a; cd C:…
阅读更多...
数据处理及评分成果

数据处理及评分成果

文章目录 test.py界面展示 pf.pyfpga.py test.py import subprocess import os from PySide2.QtWidgets import QApplication, QMainWindow, QPushButton, QPlainTextEdit, QWidget, QLabel import mysql.connector from PySide2.QtGui import QPixmap, QPalette, QColorconn …
阅读更多...
C语言学习准备-编辑器选择

C语言学习准备-编辑器选择

今天继续给大家更新C语言经典案例 今天的案例会比昨天稍微有一些难度&#xff0c;但是同时还是非常经典的案例 本来是想给大家继续更新C语言经典案例&#xff0c;但是有朋友反应C语言编辑器的选择&#xff0c;刚好我自己也是想更换一下C语言的编辑器&#xff0c;跟大家分享一下…
阅读更多...
php 小程序生成海报,微信小程序生成海报

php 小程序生成海报,微信小程序生成海报

vivo x9 微信版本7.0.4 系统版本2.6.2 var memberTopicCount this.data.memberTopicCount;//动态数 var memberFollowCount this.data.memberFollowCount;//关注数 var memberBeFollowedCount this.data.memberBeFollowedCount;//粉丝数 var memberNickName this.data.m…
阅读更多...
android 相机自动识别,Android: Camera相机开发详解(下) —— 实现人脸检测功能

android 相机自动识别,Android: Camera相机开发详解(下) —— 实现人脸检测功能

android.jpg 前言 如果有小伙伴对于Camera相关的知识还不太了解的话,建议先去看这篇文章《Android: Camera相机开发详解(上) —— 知识储备》 本篇文章是在上篇文章的基础之上,在预览的时候加入人脸检测功能,并自定义一个view显示在预览画面上 实现思路 在相机开始预览后,调…
阅读更多...
全屏视频项目

全屏视频项目

移动端全屏视频 尺寸选择(竖屏) 建议选择7501334&#xff0c; 或者6401136&#xff08;根据设计稿宽度选择&#xff09;&#xff0c;视频尺寸比例根据iphone678屏幕比例 最好使用7501334&#xff0c; 或者6401136&#xff08;但仍不完美&#xff0c;iphoneX等机型会出现上下…
阅读更多...
iphone11屏比例_5英寸到6英寸 你以为手机屏幕变大很多?其实是比例变了

iphone11屏比例_5英寸到6英寸 你以为手机屏幕变大很多?其实是比例变了

最近受疫情影响&#xff0c;手机的发布会都转战线上。黄金三月&#xff0c;在本月有不少手机正式发布&#xff0c;一度成为科技迷的狂欢。而在本月发布的手机中&#xff0c;屏幕尺寸大多都在6英寸以上&#xff0c;让不明所以的吃瓜群众感叹&#xff1a;怎么又是大屏手机&#x…
阅读更多...
Android之Camera1实现相机开发

Android之Camera1实现相机开发

一、前言 现在很多app都会有拍照功能&#xff0c;一般调用系统进行拍照裁剪就能满足平时的需求&#xff0c;但有些场景或者特殊情况下如&#xff1a;持续不间断拍多张照片或者是进行人脸识别的时候&#xff0c;这时候之间调用系统原生相机拍照时不能满足自己的开发需求&#x…
阅读更多...
图像和流媒体 -- 详解YUV数据格式

图像和流媒体 -- 详解YUV数据格式

如需转载请注明出处&#xff1a;https://blog.csdn.net/qq_29350001/article/details/78283369 我们在讲 FFmpeg 系列的时候&#xff0c;有提到 YUV 的。其中包括YUV播放器、简单的YUV格式介绍。 参看&#xff1a;FFmpeg再学习 -- 视音频基础知识 接下来详细研究一下&#x…
阅读更多...
全面屏成行业标配,vivo副总透露将推完成度更高产品

全面屏成行业标配,vivo副总透露将推完成度更高产品

近日&#xff0c;vivo高级副总裁倪旭东透露&#xff0c;vivo即将推出“完成度”更高的全面屏手机产品。vivo这一举动标志着手机行业全面屏产品和技术的布局又增强劲力量。从vivo以往新品对技术创新和用户体验的把控上来看&#xff0c;vivo的全面屏手机将给用户带来非常大的预期…
阅读更多...
怒怼七夕甜言蜜语,vivo“引发”情侣和单身狗的对战

怒怼七夕甜言蜜语,vivo“引发”情侣和单身狗的对战

还有不到一周的时间&#xff0c;七夕情人节就要到来了&#xff0c;不知道各对情侣们都准备好礼物了呢&#xff1f;七夕是现在年轻人所非常热衷且重视的一个节日&#xff0c;不仅是恋人们的狂欢日&#xff0c;同样也是单身汉们的吐槽大日子&#xff0c;用励志而又霸气的语句来为…
阅读更多...
vivo android8公测,vivo官方宣布Funtouch OS 4.0开始公测

vivo android8公测,vivo官方宣布Funtouch OS 4.0开始公测

4月16日&#xff0c;vivo官方宣布&#xff0c;从4月份开始&#xff0c;Funtouch OS 4.0系统(基于安卓8.0深度定制)将陆续为X20、X20 Plus、X9s、Xplay6、X9、X9s Plus、X9 Plus适配。 首款被适配机型为X20&#xff0c;现在vivo官方已开启vivo X20 Funtouch OS 4.0公测招募&…
阅读更多...
迈瑞BC系列出图汇总

迈瑞BC系列出图汇总

迈瑞的几个仪器出图需要画图&#xff0c;搞的很费劲&#xff0c;没办法&#xff0c;厂商自己不改&#xff0c;明明有图发Base64串的&#xff0c;就非两个图要自己画&#xff0c;画的方法又描述不清。每个LIS厂商都要浪费很多时间&#xff0c;没什么必要浪费在这种没意义的事情上…
阅读更多...
malloc原理

malloc原理

转自&#xff1a;https://www.cnblogs.com/dream397/p/14629276.html 从操作系统角度来看&#xff0c;进程分配内存有两种方式&#xff0c;分别由两个系统调用完成&#xff1a;brk 和 mmap&#xff08;不考虑共享内存&#xff09;。 brk 的实现方式是将 Data Segment 的最高地…
阅读更多...
道琼斯指数调整,美股投资者应注意什么?

道琼斯指数调整,美股投资者应注意什么?

今年因受新冠肺炎疫情影响&#xff0c;科技股和新经济公司业绩大放异彩&#xff0c;这也让道琼斯工业指数、纳斯达克综合指数和标准普尔500指数这三大指数收获不同程度的涨幅。 虽说科技股展现出强劲的增长动能&#xff0c;但道指因科技股的比重不足严重拖累道指表现&#xff…
阅读更多...
5G开始赚钱了——全球5G进展分析

5G开始赚钱了——全球5G进展分析

文章版权所有&#xff0c;未经授权请勿转载或使用 1. 全球5G网络持续普及&#xff0c;终端不断丰富。截止8月已有175家运营商推出5G商用服务&#xff0c;82家开始投资5G SA&#xff0c;发布5G终端超过900款。同时&#xff0c;5G专网势头不减&#xff0c;全球超过370家公司投资5…
阅读更多...
靠云业务独撑收入增长大梁,微软仍然被高估?

靠云业务独撑收入增长大梁,微软仍然被高估?

美东时间7月26日美股盘后&#xff0c;微软公布了2022财年第四季度财报&#xff0c;当季营收519亿美元&#xff0c;同比增长12%&#xff0c;净利润167亿美元&#xff0c;同比增长2%。 值得关注的是&#xff0c;营收和净利润均创近两年以来最低增速。早在6月时&#xff0c;微软就…
阅读更多...
最新文章

哆哆女性网商丘到淮安火车深圳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图男子被猫抓伤后确诊“猫抓病”

哆哆女性网 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化