将ASP.NET MVC ViewResult HTML呈现为没有第三方组件的图像

时间:2011-12-21 18:23:39

标签: c# asp.net-mvc image html-to-pdf html-to-jpeg

有没有办法将ViewResult或PartialViewResult渲染为图像?

我试图将ViewResult作为字符串,我得到了一个包含html的字符串,但我需要将该html渲染为图像。如果可能 - 使用样式和图像。

我有一个想法是在服务器上为这个html获取一些浏览器输出并将结果捕获到图像,但是如何在实践中完成我目前还不知道。 如果您有任何想法,请帮助。

请不要建议任何第三方组件。只需告诉标准.NET类是否无法做到这一点。

谢谢

2 个答案:

答案 0 :(得分:8)

请参阅How to render an image using the WebBrowser control

public class HtmlToBitmapConverter 
{ 
    private const int SleepTimeMiliseconds = 5000; 

    public Bitmap Render(string html, Size size) 
    { 
        var browser = CreateBrowser(size); 

        browser.Navigate("about:blank"); 
        browser.Document.Write(html); 

        return GetBitmapFromControl(browser, size); 
    } 

    public Bitmap Render(Uri uri, Size size) 
    { 
        var browser = CreateBrowser(size); 

        NavigateAndWaitForLoad(browser, uri, 0); 

        return GetBitmapFromControl(browser, size); 
    } 

    public void NavigateAndWaitForLoad(WebBrowser browser, Uri uri, int waitTime) 
    { 
        browser.Navigate(uri); 
        var count = 0; 

        while (browser.ReadyState != WebBrowserReadyState.Complete) 
        { 
            Thread.Sleep(SleepTimeMiliseconds); 

            Application.DoEvents(); 
            count++; 

            if (count > waitTime / SleepTimeMiliseconds) 
            { 
                break; 
            } 
        } 
    } 

    private WebBrowser CreateBrowser(Size size) 
    { 
        return 
            new WebBrowser 
            { 
                ScrollBarsEnabled = false, 
                ScriptErrorsSuppressed = true, 
                Size = size 
            }; 
    } 

    private Bitmap GetBitmapFromControl(WebBrowser browser, Size size) 
    { 
        var bitmap = new Bitmap(size.Width, size.Height); 

        NativeMethods.GetImage(browser.Document.DomDocument, bitmap, Color.White); 
        return bitmap; 
    } 
}

然后就像

一样简单
var image = new HtmlToBitmapConverter()
                .Render(new Uri(urlTextBox.Text), pictureBox.Size);

答案 1 :(得分:0)

对不起我之前的建议。真的,这不对。现在我明白你想要什么。但是如果你不喜欢使用第三方解决方案的想法,唯一的办法就是编写自己的解析器,这不是一件容易的事。或者您可以尝试使用WebBrowser类及其方法DrawToBitmap如何在此处描述http://englestone.blogspot.com/2009/06/generate-screenshot-previews-with-c.html