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

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值