使用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类,该类有一些属性没有对外提供接口,因此我们需要自己实现这个类,并改变一些属性;

  1. 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();}}
    }
    
  2. 自己实现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文件转为图片文件,并解决字体显示问题相关推荐

  1. 使用pdfbox2.0.15版本,将pdf文件转为图片时,中文显示乱码

    一.问题 在项目中使用pdfbox2.0.15版本,将pdf文件转成图片,在windows本地转换正常,发布到linux服务器,转换后图片中的中文出现部分乱码,显示都是方块□□□. 二.分析 1.日志 ...

  2. Extjs 3.0.0 问题总结

    1:在使用eclipse +spket  开发extjs3.0.0的版本时  发现extjs包中没有jsb文件,找了很久也没有找到,官方说是 要用jsb2文件了 是使用json格式了 ,而且要用JSB ...

  3. Midas GTS NX 的中性FPN文件转为 FLAC3D5.0的模型 c++源码 (FPN to FLAC3D)

    FPN文件转为 FLAC3D5.0的模型 1.使用方法    新增:依据Midas中的网格组,将FLAC3D的模型进行分组的程序,无需再填写属性,数据导出之前一定要执行步骤(1), (链接:https ...

  4. ubuntu18.04.1内核升级至5.0.0-25版本

    ubuntu18.04操作系统版本先已支持在线的内核版本升级,到目前为止18.04发布版已经拥有三个小版本了1,2,3. 其中18.04.01和18.04.03版本,安装好之后默认的是4.15内核版本 ...

  5. 在首次发布三周之后,MLflow迎来了0.2版本

    在今年的Spark+AI峰会上,MLflow团队推出了MLflow,一个开源的用于简化机器学习生命周期的平台.从首次发布到现在的三周时间里,已经有很多数据科学家和工程师对使用MLflow和为MLflo ...

  6. Spring Boot 3.0.0 发布第一个里程碑版本M1,你的 Java 升到 17 了吗?

    欢迎关注方志朋的博客,回复"666"获面试宝典 ‍ ‍文章来源:程序猿DD‍ ‍ 2022年1月20日,Spring官方发布了Spring Boot 3.0.0的第一个里程碑版本M ...

  7. 分离硬件和代码、稳定 API,PyTorch Lightning 1.0.0 版本正式发布

    机器之心报道 机器之心编辑部 还记得那个看起来像 Keras 的轻量版 PyTorch 框架 Lightning 吗?它终于出了 1.0.0 版本,并增添了很多新功能,在度量.优化.日志记录.数据流. ...

  8. k8s概念入门之kube-proxy-针对早期(0.4)版本阅读

    k8s的kube-proxy分析 Kube-proxy主要是伴随着kubtlet进程一起部署在每个node节点中,proxy的功能主要就是为了完成在k8s集群中实现集群内部的通信,也可完成集群外的数据 ...

  9. 三代纠错软件LoRDEC安装和使用(0.6版本)

    (1)下载 可以从官网直接下载最新版本: https://gite.lirmm.fr/lordec/lordec-releases/wikis/home#lordec ,需要安装一些配套的资源,下载. ...

最新文章

  1. centos 7 安装GTK+-2.0
  2. Python 标准库 —— zipfile(读取 zip 文件)
  3. Java基础篇:泛型与类型擦除
  4. 前端学习(3105):react-hello-jsx语法规则
  5. Pentaho Data Integration - Kettle 入门指南
  6. linux基础命令(总结)
  7. 为什么你的数据库经常会被破防呢?原因原来是这——Sql注入问题(源码+文字深度解析)
  8. retroarch游戏模拟器使用
  9. Coded UI- Run Coded UI in WinForm
  10. php怎么定义字符串变量的值,php字符串变量怎么替换
  11. 新造车杀入15万,燃油车慌了?
  12. word+Endnote参考文献对齐设置设置流程
  13. ubuntu如何安装Mac OS X主题
  14. java核心技术卷一_java核心技术卷一
  15. 带联网功能的RFID宿舍门禁(四)-NodeMCU网站与RC522共同控制舵机转动
  16. 亚马逊查询关键词排名的工具_拼多多关键词排名查询工具怎么查关键词的?
  17. OpenGL 基本介绍
  18. 3---条形图(matplotlib)
  19. zemax---GEO Radius and RMS Radius
  20. PowerShell对象的批处理方法

热门文章

  1. Python发送邮件提醒
  2. 含文档+PPT+源码等]精品基于java开发的航空订票系统SSM[包运行成功]计算机毕设Java项目源码
  3. 【PPT模板】动态时间轴(含资源下载)
  4. java文件名特殊符号_linux命令行下文件名中包含特殊符号如何的处理方法
  5. 神相的‘敏捷项目管理’图
  6. 热水智能控制系统有什么优点?
  7. 五年百亿新目标,新华三打造智能终端业务新版图
  8. 俞敏洪:我让女儿主动学习的秘密
  9. context_gcc.s:110: Error: thumb conditional instruction should be in IT block `vstmdbeq r1!,{d8-d15}
  10. 《职来职往》中值得人们深思的话