通过CssBox将HTML页面生成图片
前面有使用过Robot技术生成页面的快照,但是这个是一种应急的方法,只能抓取屏幕显示的内容,对于当前未显示的
页面内容则是抓取不到了,文章链接。
以此今天介绍一种可以依据URL获取到整个页面的进行一个长截图的纯Java的方法。
CSSBox,不是CSS Box
层叠样式【盒子模型】,而是一个采用纯Java开发的(X)HTML/CSS渲染引擎,是一个网络客户端组件。它能够提供关于已渲染页面内容和布局的完整详细信息。CSSBox还能够展示渲染过的文档。可以实现将HTML生成图片。
具体操作:
1、导入需要的依赖:
maven仓库管理的方式:
<dependency>
<groupId>net.sf.cssbox</groupId>
<artifactId>cssbox</artifactId>
<version>4.14</version>
</dependency>
依赖的jar包:
2、集成的Java代码:
import java.awt.Dimension;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import org.fit.cssbox.demo.ImageRenderer;
import org.xml.sax.SAXException;
public class CSSBoxToHtmlImge {
public static void main(String[] args) throws IOException, SAXException {
ImageRenderer render = new ImageRenderer();
String url = "目标URL";
//存放的路径,File.separator:表示文件分割符
FileOutputStream out = new FileOutputStream(new File("G:"+ File.separator+"cssbox.png"));
render.setWindowSize(new Dimension(1900, 1000), false);
render.renderURL(url, out, ImageRenderer.Type.PNG);
out.close();
System.out.println("OK");
}
}
注意事项:
1、通过查看源码发现其生成图片只能是“.png
”和“.svg
”格式;
2、不支持引用的外部js、css;其次,自定义设置的宽度有时候不起作用,代码内部有一个默认的宽度是2400,暂时没找到解决方法
3、中文乱码问题:集成到系统部署到Linux环境后会存在中文字符编译异常,都显示成“□”;
解决方法是修改源码数据:找到文件“VisualContext.java” 所属:package org.fit.cssbox.layout,
其构造函数中对font进行了初始化化:
将该段修改为:font = new Font(“宋体”, Font.PLAIN, (int) CSSUnits.medium_font); 即可
如果是想找到Font.SERIF
的话,位置在jdk下的Java/beans/Font,定义的是一个常量。