Bootstrap Blazor中使用PuppeteerSharp对HTML截图

server/2024/12/23 2:31:56/
htmledit_views">

PuppeteerSharp是一个基于.NET的库,提供了对Puppeteer的C#支持,用于自动化,可用于测试、截图、爬虫等任务。

官网:Puppeteer Sharp(感觉文章中有些代码段没有更新,直接用会有报错)。

本篇文章是对HTML截图的实现,无需在页面或容器中展示html中的实际内容。请前往NuGet中自行下载PuppeteerSharp库(本次演示用的是20.0.5版本),并在代码中引用。

//razor中使用
@using PuppeteerSharp
@using PuppeteerSharp.Media

//cs中使用
using PuppeteerSharp;
using PuppeteerSharp.Media;

 注意PuppeteerSharp库20.0.5版本的依赖性:

        1、razor添加一个截图按钮

<Button OnClick="OnClickToTakeAnScreenshot">截图</Button>

如果需要加载展示html的内容,可以使用iframe:

<iframe id="iframeHtml" src="./files/xxx.html" style="width:100%;height:100%;"></iframe>

        2、注入IWebHostEnvironment和DownloadService

//用于找WebRootPath
[Inject]
[NotNull]
private IWebHostEnvironment _env { get; set; }//用于下载截取后的图片
[Inject]
[NotNull]
private DownloadService _downloadService { get; set; }

         3、生成HTML文件路径和截图后图片存放路径

//files在wwwroot目录下面
string htmlPath = Path.Combine(_env.WebRootPath, "files/xxx.html");
string imagePath = Path.Combine(_env.WebRootPath, "files/screenshot.png");

        4、下载和管理浏览器的可执行文件

var browserFetcher = new BrowserFetcher();
await browserFetcher.DownloadAsync();

DownloadAsync方法默认下载Chrome浏览器的可执行文件,并且会校验目标文件是否存在,如果存在则不会重新下载,下载并解压成功后,会自动创建两个目录:

 

由于存在网络问题,下载失败后,可以多尝试几次。

        5、创建无头浏览器和page实例

var browser = await Puppeteer.LaunchAsync(new LaunchOptions
{Headless = true //无头浏览器配置
});
var page = await browser.NewPageAsync();

        6、读取和加载HTML文件

await page.GoToAsync(htmlPath);//等待几秒,确保html中的内容加载完毕
Thread.Sleep(3000);

await等待GoToAsync方法只是让html文件读取完,但是里面的数据填充、渲染等还另外需要时间,最好等待几秒(根据html文件大小自行计算),让里面的内容加载完成,再进行后面的操作,否则截的图会有内容缺失。

        7、开启视窗模式(如有需要,可自行添加和修改)

await page.SetViewportAsync(new ViewPortOptions
{Width = 1000,Height = 800
});

需要设置视窗的宽度和高度,相当于限定了加载html的父容器尺寸,转为特定宽高。如果没有这段代码,默认是全屏。

        8、截取特定的区域(如有需要,可自行添加和修改)

// 定义要截取的区域
var clip = new Clip
{X = 150,      // 截图区域的左上角 X 坐标Y = 150,      // 截图区域的左上角 Y 坐标Width = 500,  // 截图区域的宽度Height = 350  // 截图区域的高度
};

        9、截取并保存

await page.ScreenshotAsync(imagePath, new ScreenshotOptions
{Clip = clip
});

        10、下载截取的图片

await using var stream = File.OpenRead(imagePath);DownloadOption downloadOption = new DownloadOption();
downloadOption.FileName = Path.GetFileName(imagePath);
downloadOption.FileStream = stream;
await _downloadService.DownloadFromStreamAsync(downloadOption);

截图按钮OnClickToTakeAnScreenshot的完整方法代码如下:

@using PuppeteerSharp
@using PuppeteerSharp.Media<div><Button OnClick="OnClickToTakeAnScreenshot">截图</Button>
</div>@code {[Inject][NotNull]protected IWebHostEnvironment _env { get; set; }[Inject][NotNull]protected DownloadService _downloadService { get; set; }private async Task OnClickToTakeAnScreenshot(){try{string htmlPath = Path.Combine(_env.WebRootPath, "files/xxx.html");string imagePath = Path.Combine(_env.WebRootPath, "files/screenshot.png");var browserFetcher = new BrowserFetcher();await browserFetcher.DownloadAsync();var browser = await Puppeteer.LaunchAsync(new LaunchOptions{Headless = true});var page = await browser.NewPageAsync();await page.GoToAsync(htmlPath);Thread.Sleep(3000);await page.SetViewportAsync(new ViewPortOptions{Width = 1000,Height = 800});// 定义要截取的区域var clip = new Clip{X = 150,      // 截图区域的左上角 X 坐标Y = 150,      // 截图区域的左上角 Y 坐标Width = 500,  // 截图区域的宽度Height = 350  // 截图区域的高度};await page.ScreenshotAsync(imagePath, new ScreenshotOptions{Clip = clip});await using var stream = File.OpenRead(imagePath);DownloadOption downloadOption = new DownloadOption();downloadOption.FileName = Path.GetFileName(imagePath);downloadOption.FileStream = stream;await _downloadService.DownloadFromStreamAsync(downloadOption);_MsgBox.Show("截图成功!", AlertTypes.Success);}catch (Exception ex){_MsgBox.Show(ex.Message, AlertTypes.Error);}}
}


http://www.ppmy.cn/server/152382.html

相关文章

Trimble天宝三维激光扫描仪在建筑工程竣工测量中的应用【沪敖3D】

竣工测量是建筑项目竣工阶段的一个至关重要的环节&#xff0c;它为建筑工程的质量验收和成果核查提供了核心的参考依据。传统的竣工测量方法&#xff0c;如全站仪测量&#xff0c;主要依赖于现场人工操作&#xff0c;存在一些明显的局限性&#xff0c;例如作业时间长、工作量大…

uni-app商品搜索页面

目录 一:功能概述 二:功能实现 一:功能概述 商品搜索页面,可以根据商品品牌,商品分类,商品价格等信息实现商品搜索和列表展示。 二:功能实现 1:商品搜索数据 <view class="search-map padding-main bg-base"> <view class…

uniapp使用腾讯地图接口的时候提示此key每秒请求量已达到上限或者提示此key每日调用量已达到上限问题解决

要在创建的key上添加配额 点击配额之后进入分配页面&#xff0c;分配完之后刷新uniapp就可以调用成功了。

VMware虚拟机Ubuntu 18.04版本 磁盘扩容

一、版本配置 虚拟机版本&#xff1a;VMware WORKSTATION 16 PRO Ubuntu版本&#xff1a;Ubuntu 18.04 二、磁盘大小介绍 目的&#xff1a;磁盘扩容&#xff08;20G----->100G&#xff09;&#xff0c;从20G扩到100G 查看磁盘大小命令&#xff1a;df -h 扩容前的磁盘大小 …

MySQL -- 库的相关操作

目录 查看数据库 创建数据库 直接创建&#xff1a; 加约束条件 if not exists 字符集和校对规则 什么是字符集 什么是校对规则 校对规则的主要功能 校对规则的特性 查看指定的数据库使用的字符集和校对规则&#xff1a; 比较是否区分大小写字母差异 显示创建语句 …

QP:Query类目

Query类目 Query类目指的是根据查询内容将查询词Query归类到某个特定的分类体系中。这个体系通常是多级的&#xff0c;能够将查询词从更广泛的类别逐渐细分到更具体的子类目&#xff0c;这个体系通常在电商搜索和推荐领域中有重要的作用。 Query和Doc一般共用一套类目体系&am…

【每日一题 基础题】[蓝桥杯 2020 省 AB3] 乘法表

[蓝桥杯 2020 省 AB3] 乘法表 乘法表 九九乘法表是学习乘法时必须要掌握的。在不同进制数下&#xff0c;需要不同的乘法表。 例如, 四进制下的乘法表如下所示&#xff1a; 1 * 11 2 * 12 2 * 210 3 * 13 3 * 212 3 * 321 请注意&#xff0c;乘法表中两个数相乘的顺序必须为样例…

Linux系统安全与应用: 筑牢防线,高效运维

在当今数字化时代,Linux系统凭借其卓越的稳定性与强大的性能,广泛应用于各类关键业务场景,从数据中心服务器到云计算平台,从网络设备到嵌入式系统,无处不在。因此,确保Linux系统安全稳定运行,成为重中之重。本文将深入解析Linux系统安全与应用的关键要点,涵盖账户安全,…