Java 通过url获取网页内容、生成文件、生成图片(html2image方式)
前提(只适用于普通的纯html截图,css、js会遗漏丢失)
在使用html2image将html转为图片的时候会出现css样式丢失的问题
1.须将所有的css代码以内联样式写到每个标签上
2.不要使用太新的css语法
3.不要使用js进行页面渲染
如果上述几条都试过了,还不行就设置程序等待一段时间
Thread.sleep(6000);
所需依赖
<dependency>
<groupId>gui.ava</groupId>
<artifactId>html2image</artifactId>
<version>2.0.1</version>
</dependency>
linux系统截图出现中文乱码的解决方法
要找到一个更准确的方法来找到Linux系统中的中文字体,可以遵循以下步骤:
1.先判断Linux系统中是否安装了中文字体
fc-list
是Fontconfig软件包提供的一个工具,用于列出系统中所有已安装的字体。
要找到中文字体,可以使用该命令结合:lang=zh
选项来列出所有支持中文的字体。这个选项会基于字体的语言标签来筛选字体。
fc-list :lang=zh
2.检查字体文件
如果fc-list :lang=zh
没有返回你期望的结果,或者你想要更直接地查看字体文件,可以手动检查字体目录
(如/usr/share/fonts
、/usr/local/share/fonts
、~/.fonts
、~/.local/share/fonts
等)。
3.如果没有,则需要安装中文字体
yum install -y fontconfig
yum install -y cjkuni-ukai-fonts cjkuni-uming-fonts
4.如果还是不行,再继续 配置字体
sudo vim /etc/fonts/fonts.conf
在 <dir>
标签内添加中文字体路径:
<dir>/usr/share/fonts/cjkuni-ukai/</dir>
<dir>/usr/share/fonts/cjkuni-uming/</dir>
保存并退出。
1.本地文件转换为图片
//将本地的文本读取到String中
String html = FileUtil.readString("D:\\test\\1\\20211009103530.html", StandardCharsets.UTF_8);
//创建html2Image对象
Html2Image html2Image = Html2Image.fromHtml(html);
//生成image渲染器
ImageRenderer imageRenderer = html2Image.getImageRenderer()
.setImageType("png")
.setWidth(3000)
.setHeight(2100);
//生成图片
imageRenderer.saveImage("D:\\test\\hello-png-5.png");
2.远程网址文件转换为图片
/**
* 直接将访问网址转成图片保存本地
*
* @param hzdtpwzPath 文件夹位置
* @param ycurl 访问的地址
* @throws Exception
* @return 图片完整位置
*/
public String wstest(String hzdtpwzPath, String ycurl) throws Exception {
String html = "";
URL url = new URL(ycurl);
InputStream in = url.openStream();
InputStreamReader isr = new InputStreamReader(in);
BufferedReader bufr = new BufferedReader(isr);
String str;
while ((str = bufr.readLine()) != null) {
html += str;
}
bufr.close();
isr.close();
in.close();
System.out.println("===========");
System.out.println(html);
//创建html2Image对象
Html2Image html2Image = Html2Image.fromHtml(html);
//生成image渲染器
ImageRenderer imageRenderer = html2Image.getImageRenderer()
.setImageType("png")
.setWidth(3000)
.setHeight(2100);
//图片的名称及后缀
String tpwz = hzdtpwzPath + ".png";
//生成图片
imageRenderer.saveImage(tpwz);
return tpwz;
}
如果需要带cookie,以下方式可以实现
/**
* 直接将访问网址转成图片保存本地 (带cookie)
*
* @param hzdtpwzPath 文件夹位置
* @param ycurl 访问的地址
* @throws Exception
* @return 图片完整位置
*/
public String wstest(String hzdtpwzPath, String ycurl) throws Exception {
URL url = new URL(ycurl);
//加cooker
URLConnection conn = url.openConnection();
conn.setRequestProperty("cookie", "token=" + nhhzdtoken);
conn.setDoOutput(true);
InputStream inS = conn.getInputStream();
InputStreamReader inR = new InputStreamReader(inS);
BufferedReader br = new BufferedReader(inR);
StringBuilder sb = new StringBuilder();
String line = null;
while ((line = br.readLine()) != null) {
sb.append(line);
}
br.close();
inR.close();
inS.close();
//将本地的文本读取到String中
//String html = FileUtil.readString("C:\\Users\\HONOR\\Desktop\\受理回执单.html", StandardCharsets.UTF_8);
String html = sb.toString();
//创建html2Image对象
Html2Image html2Image = Html2Image.fromHtml(html);
//Html2Image html2Image = Html2Image.fromURI(new URI(ycurl));
//生成image渲染器
ImageRenderer imageRenderer = html2Image.getImageRenderer()
.setImageType("png")
.setWidth(3000)
.setHeight(2100);
//图片的名称
String tpwz = hzdtpwzPath + ".png";
//生成图片
imageRenderer.saveImage(tpwz);
return tpwz;
}
3.远程网址文件下载本地且转换为图片
/**
* 将访问的地址生成html文件且存本地
*
* @param hzdtpwzPath 文件夹位置
* @param ycurl 访问的地址
* @return 具体的html文件位置
* @throws IOException
*/
public String saveHtml(String hzdtpwzPath, String ycurl) throws IOException {
String htmlFilepath = hzdtpwzPath + ".html";
System.out.println("html文件位置:" + htmlFilepath);
File dest = new File(htmlFilepath);
InputStream is;//接收字节输入流
FileOutputStream fos = new FileOutputStream(dest);//字节输出流
URL wangyi = new URL(ycurl);
is = wangyi.openStream();
BufferedInputStream bis = new BufferedInputStream(is);//为字节输入流加缓冲
BufferedOutputStream bos = new BufferedOutputStream(fos);//为字节输出流加缓冲
int length;
byte[] bytes = new byte[1024 * 20];
while ((length = bis.read(bytes, 0, bytes.length)) != -1) {
fos.write(bytes, 0, length);
}
bos.close();
fos.close();
bis.close();
is.close();
return htmlFilepath;
}
/**
* 将访问网址转成本地html文件再转为图片保存本地
*
* @param hzdtpwzPath 文件夹位置
* @param ycurl 远程地址
* @throws Exception
*/
public String wstest2(String hzdtpwzPath, String ycurl) throws Exception {
String s = saveHtml(hzdtpwzPath, ycurl);
//将本地的文本读取到String中
String html = FileUtil.readString(s, StandardCharsets.UTF_8);
//创建html2Image对象
Html2Image html2Image = Html2Image.fromHtml(html);
//生成image渲染器
ImageRenderer imageRenderer = html2Image.getImageRenderer()
.setImageType("png")
.setWidth(3000)
.setHeight(2100);
//图片的名称及后缀
String tpwz = hzdtpwzPath + ".png";
//生成图片
imageRenderer.saveImage(tpwz);
return tpwz;
}
4
参考文章
【1】java转化html标签 java将html页面转化为图片
https://blog.51cto.com/u_13360/6326010
【2】Java——获取网页内容并在本地生成HTML文件
https://blog.51cto.com/u_12660945/5163153
【3】Java访问网络url,获取网页的html代码
https://www.cnblogs.com/weilunhui/p/3854249.html
【4】限制前提
https://blog.csdn.net/qq_43376347/article/details/127784268
【5】【centos7系统】html2image 转图片中文乱码
https://blog.csdn.net/chechenshi/article/details/138973731
【6】在 CentOS 7 上安装中文字体
https://blog.csdn.net/sunny_day_day/article/details/132829720
【7】HtmlImageGenerator字体乱码问题解决、html2image放linux上乱码问题解决
https://www.cnblogs.com/tlll/p/7853106.html