百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术教程 > 正文

java如何网页截屏?selenium来搞定

csdh11 2024-12-26 12:26 2 浏览

背景

需求一直有,今年比较多,如题,工作中遇到网页截图这样的需求,本着效果好,功能全又稳定的意图,去网上搜索相关技术,像HTML2Image、cssbox、selenium等,还有很多其他的技术,这篇文章主要说说我测试使用并能满足需求的cssbox,selenium。

Cssbox

CSSBox是一个用纯Java编写的(X)HTML/CSS渲染引擎。它的主要目的是提供关于呈现的页面内容和布局的完整和进一步可处理的信息。 但是,它也可以用于浏览Java Swing应用程序中呈现的文档。核心CSSBox库还可以用于获得所呈现的文档的位图或矢量(SVG)图像。 使用SwingBox包,CSSBox可以用作Java Swing应用程序中的交互式Web浏览器组件。

官网地址:http://cssbox.sourceforge.net/

使用

1引入maven依赖

<!--网站转换为图片cssbox-->
<dependency>
<groupId>net.sf.cssbox</groupId>
<artifactId>cssbox</artifactId>
<version>5.0.0</version>
</dependency>

2使用

@Test
public void cssboxTest(){
    try {
        ImageRenderer render = new ImageRenderer();
        //网络链接的html
        String url = "https://www.zhangbj.com/p/524.html";
        //文件保存路径
        String path = "C:\\Users\\Administrator\\Desktop"+File.separator+"html.png";
        FileOutputStream out = new FileOutputStream(new File(FilenameUtils.normalize(path)));
        //开始截屏
        render.renderURL(url, out);
    } catch (Exception e) {
    e.printStackTrace();
    }
}

3结果

样式可能出现问题,中文有时候乱码

Selenium

1引入依赖

<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
<version>3.141.59</version>
</dependency>

2相关准备

selenium+chromedriver谷歌驱动+chrome浏览器

1.注意谷歌驱动的版本要和谷歌浏览器的版本一样或者版本最相近

2.注意chromedriver谷歌驱动需要放在jdk安装目录下,具体路径为xxx/bin/chromedriver.exe,在linux和window中操作一样,这样切换系统是就无需改代码。

3.需要安装谷歌浏览器

谷歌驱动下载地址:https://registry.npmmirror.com/binary.html?path=chromedriver/

3使用

@Slf4j
public class Html2ImageUtil {
/**
* 将HTML转为图片,并保存至指定位置
* @param url 页面地址
* @param targetPath 保存地址(包含图片名,如 /images/test.png)
* @return
*/
public static String htmlToImage(String url, String targetPath) {
  if (StringUtils.isEmpty(url) || StringUtils.isEmpty(targetPath)) {
  throw new RuntimeException("截图失败!缺少必填项");
  }
  // 休眠时长
  Integer sleepTime = 3 * 1000;
  // 无头模式
  System.setProperty("java.awt.headless", "true");
  //获取谷歌配置信息
  ChromeOptions chromeOptions = getChromeOptions();
  // 配置信息中有默认窗口大小,也可以单独设置窗口大小
  chromeOptions.addArguments("--window-size=1920,6000");
  //创建webdriver 谷歌驱动
  WebDriver driver = new ChromeDriver(chromeOptions);
  //也可以通过如下方式设置窗口大小
  // Dimension dimension = new Dimension(1000, 30);
  // driver.manage().window().setSize(dimension);
  try {
    //加载页面
    driver.get(url);
    //等待加载页面
    Thread.sleep(sleepTime);
    //截屏
    File srcFile = ((TakesScreenshot) driver).getScreenshotAs(OutputType.FILE);
    //保存到指定位置
    FileUtils.copyFile(srcFile, new File(FilenameUtils.normalize(targetPath)));
  } catch (InterruptedException | IOException e) {
  e.printStackTrace();
  throw new RuntimeException(e.getMessage());
  } finally {
  driver.quit();
  }
  log.info("截图成功!");
  return targetPath;
}
/**
* 获取chrome配置信息
* 注意 chromedriver谷歌驱动需要放在jdk安装目录下,具体路径为xxx/bin/chromedriver.exe ,在linux和window中操作一样
* @return
*/
public static ChromeOptions getChromeOptions() {
    ChromeOptions options = new ChromeOptions();
    //获取当前操作系统
    String os = System.getProperty("os.name");
    //获取jdk安装目录,需要提前将谷歌驱动放进jdk的bin目录下,在linux和window中操作一样
    String sysPath = System.getProperty("java.home").replace("jre", "bin");
    String chromeDriver = sysPath + File.separator+"chromedriver.exe";
    options.addArguments("disable-infobars");
    //设置为 headless 模式,不需要真实启动浏览器
    options.setHeadless(true);
    //options.addArguments("--headless");
    options.addArguments("--dns-prefetch-disable");
    options.addArguments("--no-referrers");
    options.addArguments("--disable-gpu");
    options.addArguments("--disable-audio");
    options.addArguments("--no-sandbox");
    options.addArguments("--ignore-certificate-errors");
    options.addArguments("--allow-insecure-localhost");
    options.addArguments("--window-size=1920,6000"); // 窗口默认大小
    String userAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36";
    userAgent = "user-agent=" + userAgent;
    options.addArguments(userAgent);
    // 设置chrome二进制文件
    options.setPageLoadStrategy(PageLoadStrategy.EAGER);
    // 设置驱动
    System.setProperty("webdriver.chrome.driver", chromeDriver);
    log.debug("结束获取chrome配置信息");
    return options;
}

测试

public static void main(String[] args) {
		htmlToImage("https://www.cnblogs.com/tester-ggf/p/12602211.html","C:\\Users\\Administrator\\Desktop\\aaa.png");
}

效果十分完美

总结

最完美的方案就是selenium+chromedriver谷歌驱动+chrome浏览器,无需多说,用吧。

您的赞和关注是对我创作的最大肯定谢谢大家!

相关推荐

Web前端最强JavaScript Excel处理插件——exceljs

介绍exceljs是一个读取,操作和编写电子表格数据和样式到XLSX和JSON,从Excel电子表格文件逆向工程设计的项目。之所以称它最强,是因为它的功能强大,简直就是专门为Excel打造的前端处理插...

介绍一款国产开源免费的在线文件文档预览的kkFileView

无论是个人或企业,甚至是政府部门,能够在浏览器中直接打开浏览Office等格式文档,也是一个普遍的需求和应用场景。对于企业来说,在线文件文档预览在OA办公系统、在线学习系统及招聘网站等广泛的应用。对于...

如何批量提取文件名到excel表?推荐6个方法

在当今数字信息时代,文件管理面临的挑战日益凸显,尤其在面对海量文件时,高效提取并分类管理文件名称成为提升工作效率的关键环节。精准获取文件名不仅能够有效避免重复性工作,还能快速整理与分析数据,确保信息的...

Vue 前端开发——导入Excel/Csv vue导入excel到后端

项目开发中遇到导入表格常见的就是excel和csv格式,一般情况下我们会前端首先得到这个表格里面的数据,然后再把数据发送给后端,也有的是直接上传文件传给后台后台自己处理,这样就不好控制上传前预览和处...

wps宏js学习-1 wps宏教程

在JS中,万物皆对象。比如JS中的字符串、数组、函数等都是对象。这些对象都有自己的属性与方法,后面在对应的章节中都有讲解。而在WPS表格,也有很多对象,比如WPS表格程序就是最大的对象,再...

文件预览的终级解决方案-kkFileView

kkFileView是使用springboot打造文件文档在线预览项目解决方案,支持doc、docx、ppt、pptx、xls、xlsx、zip、rar、mp4、mp3以及众多类文本如txt、htm...

开源中的精品,具备丰富Excel处理能力的Javascript库——exceljs

介绍exceljs是一个读取,操作和编写电子表格数据和样式到XLSX和JSON,从Excel电子表格文件逆向工程设计的项目。之所以称它最强,是因为它的功能强大,简直就是专门为Excel打造的前端处理插...

8000字 | 详解 Tkinter 的 GUI 界面制作

...

统一操作系统UOS适配NTKO Office控件:浏览器在线编辑文档

近一段时间以来,统信软件旗下的统一操作系统UOS在软硬件适配方面不断拓展,整个生态日渐完善,可以越来越好满足日常办公需求。现在,NTKOOffice文档控件Linux版也完成了与统一操作系统UOS的...

电脑里文件突然打不开时,试试这个简单方法

有时,有的文件就是怎么都打不开,可能是没有设置文件的默认打开方式哦。右击文件,选择“属性”,点击“打开方式”旁边的“更改”,选择可以打开这个文件的程序。例如,今天我的word文件突然打不开了,电脑里...

从中招到妥协——Locky电脑勒索病毒 中毒记录

作者:jelly仔大家好,我是Jelly仔,这次我要晒的是一种电脑病毒——Locky,这应该算是#全站首晒#吧。一、背景3月1日的晚上,我实习下班回到宿舍,浏览了一会张大妈上的原创,正准备打开E...

JS宏之工作簿的新建与保存 工作表宏的使用方法

我们首先录制一个JS宏来看看工作簿新建和保存的代码是什么样子的吧functionMacro1(){Workbooks.Add(undefined);ActiveWorkbook.Custo...

不用任何 js 库,纯前端导出数据到 Excel / CSV 文件就简单几行代码

最近实现的导出数据为表格的需求,不需要工具库,也不要后端实现,mark一下。js导出excel表格...

JS宏之工作簿的打开与保存 宏的工作薄怎么打开

functiontest1(){varcurrentpath=ActiveWorkbook.Path;for(vari=1;i<=4;i++){letwb=Workb...

使用JavaScript实现前端导入和导出excel文件?(H5编辑器实战)

前言最近笔者终于把H5-Dooring...