.NET中Html转Image方案,使用WkHtmlToImage实现Html转图片

简介本文介绍在.NET中使用开源代码wkhtmltopdf中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的生成。

  • wkhtmltopdf

  • 首先给项目安装Nuget包,在Nuget管理程序搜索 WkHtmlToX.NET 并安装,当前版本8.0.0

    wkhtmltox.png

  • 按照项目类型添加对应的转换代码

    对于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();
        }
    
  • 运行项目,完成图片转换, 效果如下

    wkhtmltoimage.jpg

本站发布的文章受知识共享协议保护,转载、收录请标明出处。

评论


昵称:   邮箱:

效果不错啊

转jpg的体积比png小

Top
An error has occurred. This application may no longer respond until reloaded.Reload 🗙