使用5.0.0版本的cssbox将html文件转为图片文件,并解决字体显示问题
使用5.0.0版本的cssbox将html文件转为图片文件,并解决字体显示问题
- 1. 引入依赖
- 2. 编写Util类
- 3. 调用Util
- 4. 存在的问题
- 5. 解决字体不兼容问题
- 6. 官方文档
在我的另一篇博客 使用cssbox将html文件转为图片文件中,大家可能对于cssbox渲染出来的图片的效果并不是特别满意,那么如何提升渲染效果呢?使用5.0.0版本的cssbox试试吧!
1. 引入依赖
<dependency><groupId>net.sf.cssbox</groupId><artifactId>cssbox</artifactId><version>5.0.0</version>
</dependency>
2. 编写Util类
public class Html2ImageUtil {public static void transferHtml2Image(String htmlFilePath, String imageFilePath, Integer width, Integer height) {ImageRenderer render = new ImageRenderer();render.setWindowSize(new Dimension(width, height), false);String url = new File(htmlFilePath).toURI().toString();try {FileOutputStream out = new FileOutputStream(imageFilePath);render.renderURL(url, out, ImageRenderer.Type.PNG);} catch (Exception e) {e.printStackTrace();}}
}
3. 调用Util
Html2ImageUtil.transferHtml2Image("result.html", "result.png", WIDTH_IMAGE, HEIGHT_IMAGE);
然后就可在项目根目录下找到生成的名为"result.png"
的图片文件啦。
4. 存在的问题
通过这种方式渲染出来的图片可能存在字体的问题,比如无法正常展示汉字,或展示为异形字,如何解决这一问题呢?请往下面看~
5. 解决字体不兼容问题
在目前的操作中,我们直接使用了封装好的ImageRenderer
类,该类有一些属性没有对外提供接口,因此我们需要自己实现这个类,并改变一些属性;
- 将
Html2ImageUtil
类的代码改为:public class Html2ImageUtil {public static void transferHtml2Image(String htmlFilePath, String imageFilePath, Integer width, Integer height) {ImageRendererUtil render = new ImageRendererUtil();render.setWindowSize(new Dimension(width, height), false);String url = new File(htmlFilePath).toURI().toString();try {FileOutputStream out = new FileOutputStream(imageFilePath);render.renderURL(url, out);} catch (Exception e) {e.printStackTrace();}} }
- 自己实现
ImageRendererUtil
这个类,直接将封装好的ImageRenderer
类代码复制过来即可;然后添加contentCanvas.setUseKerning(false);
这句代码即可;public class ImageRendererUtil {private String mediaType = "screen";private Dimension windowSize;private boolean cropWindow;private boolean loadImages = true;private boolean loadBackgroundImages = true;private static final Integer DEFAULT_WIDTH = 1200;private static final Integer DEFAULT_HEIGHT = 600;private static final String FTP = "ftp:";private static final String HTTP = "http:";private static final String HTTPS = "https:";public ImageRendererUtil() {windowSize = new Dimension(DEFAULT_WIDTH, DEFAULT_HEIGHT);}public void setMediaType(String media) {mediaType = new String(media);}public void setWindowSize(Dimension size, boolean crop) {windowSize = new Dimension(size);cropWindow = crop;}public void setLoadImages(boolean content, boolean background) {loadImages = content;loadBackgroundImages = background;}/*** Renders the URL and prints the result to the specified output stream in the specified* format.* @param urlstring the source URL* @param out output stream* @return true in case of success, false otherwise* @throws SAXException*/public boolean renderURL(String urlstring, OutputStream out) throws IOException, SAXException {if (!urlstring.startsWith(HTTP) && !urlstring.startsWith(HTTPS) && !urlstring.startsWith(FTP)&& !urlstring.startsWith("file:")) {urlstring = "http://" + urlstring;}//Open the network connectionDocumentSource docSource = new DefaultDocumentSource(urlstring);//Parse the input documentDOMSource parser = new DefaultDOMSource(docSource);Document doc = parser.parse();//create the media specificationMediaSpec media = new MediaSpec(mediaType);media.setDimensions(windowSize.width, windowSize.height);media.setDeviceDimensions(windowSize.width, windowSize.height);//Create the CSS analyzerDOMAnalyzer da = new DOMAnalyzer(doc, docSource.getURL());da.setMediaSpec(media);da.attributesToStyles();da.addStyleSheet(null, CSSNorm.stdStyleSheet(), DOMAnalyzer.Origin.AGENT);da.addStyleSheet(null, CSSNorm.userStyleSheet(), DOMAnalyzer.Origin.AGENT);da.addStyleSheet(null, CSSNorm.formsStyleSheet(), DOMAnalyzer.Origin.AGENT);da.getStyleSheets();GraphicsEngine contentCanvas = new GraphicsEngine(da.getRoot(), da, docSource.getURL());contentCanvas.setAutoMediaUpdate(false);contentCanvas.getConfig().setClipViewport(cropWindow);contentCanvas.getConfig().setLoadImages(loadImages);contentCanvas.getConfig().setLoadBackgroundImages(loadBackgroundImages);contentCanvas.setUseKerning(false);contentCanvas.createLayout(windowSize);ImageIO.write(contentCanvas.getImage(), "png", out);docSource.close();return true;}/*** Sets some common fonts as the defaults for generic font families.*/protected void defineLogicalFonts(BrowserConfig config) {config.setLogicalFont(BrowserConfig.SERIF, Arrays.asList("Times", "Times New Roman"));config.setLogicalFont(BrowserConfig.SANS_SERIF, Arrays.asList("Arial", "Helvetica"));config.setLogicalFont(BrowserConfig.MONOSPACE, Arrays.asList("Courier New", "Courier"));}}
这时,字体就恢复正常啦!
6. 官方文档
有兴趣进一步了解cssbox的小伙伴,可以移步cssbox官方文档~
使用5.0.0版本的cssbox将html文件转为图片文件,并解决字体显示问题相关推荐
- 使用pdfbox2.0.15版本,将pdf文件转为图片时,中文显示乱码
一.问题 在项目中使用pdfbox2.0.15版本,将pdf文件转成图片,在windows本地转换正常,发布到linux服务器,转换后图片中的中文出现部分乱码,显示都是方块□□□. 二.分析 1.日志 ...
- Extjs 3.0.0 问题总结
1:在使用eclipse +spket 开发extjs3.0.0的版本时 发现extjs包中没有jsb文件,找了很久也没有找到,官方说是 要用jsb2文件了 是使用json格式了 ,而且要用JSB ...
- Midas GTS NX 的中性FPN文件转为 FLAC3D5.0的模型 c++源码 (FPN to FLAC3D)
FPN文件转为 FLAC3D5.0的模型 1.使用方法 新增:依据Midas中的网格组,将FLAC3D的模型进行分组的程序,无需再填写属性,数据导出之前一定要执行步骤(1), (链接:https ...
- ubuntu18.04.1内核升级至5.0.0-25版本
ubuntu18.04操作系统版本先已支持在线的内核版本升级,到目前为止18.04发布版已经拥有三个小版本了1,2,3. 其中18.04.01和18.04.03版本,安装好之后默认的是4.15内核版本 ...
- 在首次发布三周之后,MLflow迎来了0.2版本
在今年的Spark+AI峰会上,MLflow团队推出了MLflow,一个开源的用于简化机器学习生命周期的平台.从首次发布到现在的三周时间里,已经有很多数据科学家和工程师对使用MLflow和为MLflo ...
- Spring Boot 3.0.0 发布第一个里程碑版本M1,你的 Java 升到 17 了吗?
欢迎关注方志朋的博客,回复"666"获面试宝典 文章来源:程序猿DD 2022年1月20日,Spring官方发布了Spring Boot 3.0.0的第一个里程碑版本M ...
- 分离硬件和代码、稳定 API,PyTorch Lightning 1.0.0 版本正式发布
机器之心报道 机器之心编辑部 还记得那个看起来像 Keras 的轻量版 PyTorch 框架 Lightning 吗?它终于出了 1.0.0 版本,并增添了很多新功能,在度量.优化.日志记录.数据流. ...
- k8s概念入门之kube-proxy-针对早期(0.4)版本阅读
k8s的kube-proxy分析 Kube-proxy主要是伴随着kubtlet进程一起部署在每个node节点中,proxy的功能主要就是为了完成在k8s集群中实现集群内部的通信,也可完成集群外的数据 ...
- 三代纠错软件LoRDEC安装和使用(0.6版本)
(1)下载 可以从官网直接下载最新版本: https://gite.lirmm.fr/lordec/lordec-releases/wikis/home#lordec ,需要安装一些配套的资源,下载. ...
最新文章
- centos 7 安装GTK+-2.0
- Python 标准库 —— zipfile(读取 zip 文件)
- Java基础篇:泛型与类型擦除
- 前端学习(3105):react-hello-jsx语法规则
- Pentaho Data Integration - Kettle 入门指南
- linux基础命令(总结)
- 为什么你的数据库经常会被破防呢?原因原来是这——Sql注入问题(源码+文字深度解析)
- retroarch游戏模拟器使用
- Coded UI- Run Coded UI in WinForm
- php怎么定义字符串变量的值,php字符串变量怎么替换
- 新造车杀入15万,燃油车慌了?
- word+Endnote参考文献对齐设置设置流程
- ubuntu如何安装Mac OS X主题
- java核心技术卷一_java核心技术卷一
- 带联网功能的RFID宿舍门禁(四)-NodeMCU网站与RC522共同控制舵机转动
- 亚马逊查询关键词排名的工具_拼多多关键词排名查询工具怎么查关键词的?
- OpenGL 基本介绍
- 3---条形图(matplotlib)
- zemax---GEO Radius and RMS Radius
- PowerShell对象的批处理方法
热门文章
- Python发送邮件提醒
- 含文档+PPT+源码等]精品基于java开发的航空订票系统SSM[包运行成功]计算机毕设Java项目源码
- 【PPT模板】动态时间轴(含资源下载)
- java文件名特殊符号_linux命令行下文件名中包含特殊符号如何的处理方法
- 神相的‘敏捷项目管理’图
- 热水智能控制系统有什么优点?
- 五年百亿新目标,新华三打造智能终端业务新版图
- 俞敏洪:我让女儿主动学习的秘密
- context_gcc.s:110: Error: thumb conditional instruction should be in IT block `vstmdbeq r1!,{d8-d15}
- 《职来职往》中值得人们深思的话