Java图片处理:网页转图片
需求来源于前端同事跟我反馈整天调试布局样式很难受,希望能有服务端网页转图片的方法。 记录一下研究过程。
- 可选方案及评价。
- 最终选取的方案
- 代码细节
- 不足之处
可选方案及评价
从以下三个方面考虑:
- 页面效果还原程度
- 是否支持复杂html/js解析
- 中文字体显示效果
JEditorPane
首先找到的方案是使用java内置的Html解释工具javax.swing.JEditorPane。
public void testHtml2Image() throws Exception
{
String html = "<!DOCTYPE html><html><head><meta charset=\"utf-8\"><title>贝叶斯统计推断</title></head><body><article class=\"markdown-body\"><h1id=\"gps\"><a name=\"user-content-gps\"href=\"#gps\"class=\"headeranchor-link\"aria-hidden=\"true\"><spanclass=\"headeranchor\"></span></a>贝叶斯统计推断</h1><p>最大后验概率MAP</p><p>最小均方误差LMS</p><blockquote><p>1.最大后验概率是在观测条件x下,寻求待估量最可能的值作为估计值,即最大后验概率时的值。<br/>2.最小均方误差是在观测条件x下,以待估量的均值作为估计值。<br/></p></blockquote></article>";
JEditorPane editPane = new JEditorPane("text/html", html);
editPane.setEditable(false);
Dimension prefSize = editPane.getPreferredSize();
BufferedImage img = new BufferedImage(prefSize.width,prefSize.height, BufferedImage.TYPE_INT_ARGB);
Graphics graphics = img.getGraphics();
editPane.setSize(prefSize);
editPane.paint(graphics);
graphics.dispose();
ImageIO.write(img, "png", new File("/Users/yourname/Documents/work/temp/20190219.png"));
}
这是最简单的HTML代码了,但显示效果却不太好,如下图所示:
而且多尝试后发现JeditorPane解析稍微复杂一点的js页面就会出错。
html2image
这是百度来的,从maven上可以搜索到,下载之后发现其内部就是调用JEditorPane,只是作了简单的封装,同样不满意。
wkhtmltox
这是在StackOverFlow上搜索Html2Image时看到的一种方案。尝试以后,效果强于JEditorPane,考虑试用。如谷歌首页转化如下:
最终选取方案
wkhtmltox在三个方面均强于JEditorPane。wkhtmltox没有java版本,采用java代码调用linux命令的方式使用该工具包。
wkhtmltox分为wkhtmltoimage 和wkhtmltopdf,经过尝试wkhtmltoimage显示效果不太好,且可调参数较少。而wkhtmltopdf转化效果相当好,因此最终解决方案: