.NET中Html转Image方案,使用WkHtmlToImage实现Html转图片
项目开发中经常有一些动态生成图片的需求,这种需求如果直接绘图,会比较麻烦,而且不好控制,这时候通过HTML制作好模板,然后填充模板中的内容,再生成图片就会很方便。
要实现HTML生成图片有以下几种方案
1. WebBrowser 前端生成
这种方案最简单,开发量也最少,在前端利用浏览器渲染好对应的区域,然后转换为图片,并供用户提供下载能力。适用于大部分简单场景。
2. PuppeteerSharp
开源地址: https://github.com/GoogleChrome/puppeteer
PuppeteerSharp 正是从 Puppeteer 衍生而来。Puppeteer 是由谷歌开源的一个Node项目,它提供了和Chrome DevTools的通信能力,PuppeteerSharp 主要实现原理是集成 Chromium 浏览器,通过对 Chromium 的控制实现渲染和生成图片或者其它高级功能,所以功能非常强大。
由于 PuppeteerSharp 内嵌浏览器,所以依赖项较大,一般在 200M+, 且对运行环境比较敏感。
3. Wkhtmltox
开源地址: https://github.com/wkhtmltopdf/wkhtmltopdf
wkhtmltox是一套开源的html转PDF或Image的方案,它采用C++编写,使用Webkit作为渲染引擎,和 PuppeteerSharp 类似,wkhtmltox 也集成了一个小型浏览器,体积相对较小,30M左右,且 wkhtmltox 是一个单程序集,开箱即用。
本次使用的方案主要是利用 Wkhtmltox 在后端生成图片, 同样支持PDF的生成。
-
首先给项目安装Nuget包,在Nuget管理程序搜索 WkHtmlToX.NET 并安装,当前版本8.0.0
-
按照项目类型添加对应的转换代码
对于Web项目使用依赖注入方式,代码如下
// 注入WkHtmlToX实例 builder.Services.AddSingleton<IPdfConverter, PdfConverter>(); builder.Services.AddSingleton<IWkHtmlToXEngine>(provider => { var wkHtmlToX = new WkHtmlToXConfiguration((int)Environment.OSVersion.Platform, null); var engine = new WkHtmlToXEngine(wkHtmlToX); engine.Initialize(); return engine; }); // 获取实例 private IWkHtmlToXEngine _wkHtmlToXEngine; public TestController(IWkHtmlToXEngine wkHtmlToXEngine) { _wkHtmlToXEngine = wkHtmlToXEngine; } // 实现转换逻辑 var setting = new HtmlToImageDocument { ImageSettings = { In = "模板路径", Format = "png", }, }; using (var stream = new MemoryStream()) { var converter = new ImageConverter(_wkHtmlToXEngine); var converted = await converter.ConvertAsync(setting, _ => stream, CancellationToken.None); stream.Position = 0; var fileBytes = stream.ToArray(); return File(fileBytes, "image/png", "Download"); } }
对于普通程序使用方式(WinForm、WPF、Command Line等),代码如下
var configuration = new WkHtmlToXConfiguration((int)Environment.OSVersion.Platform, null); using (var engine = new WkHtmlToXEngine(configuration)) { engine.Initialize(); var doc = new HtmlToImageDocument { ImageSettings = { In = @"模板路径", Format = "png" } }; using var stream = new MemoryStream(); var converter = new ImageConverter(engine); var converted = await converter.ConvertAsync(doc, _ => stream, CancellationToken.None).ConfigureAwait(false); var stream2 = new FileStream("图片保存路径", FileMode.OpenOrCreate); stream.CopyTo(stream2); stream.Close(); }
-
运行项目,完成图片转换, 效果如下
评论
效果不错啊
转jpg的体积比png小