将内联HTML呈现为VB.Net中的图像

时间:2014-12-17 20:36:34

标签: html vb.net image converter content-type

基本上我有一个看起来像这样的字符串:

<p>HELLO <span style='color:red'>WORLD</span></p>

如何将HTML的字符串转换为图像? (位图,PNG等)

有没有人知道任何可以执行此操作的VB.NET工具?由于这是一个字符串,因此它无法从DOM读取,因为它在技术上不属于DOM。

我的总体目的是创建一个ASPX页面,该页面将从数据库中读取包含一些HTML的字段,将该HTML转换为图像,并通过将ContentType欺骗为“image / png”来在页面上蒸出该图像,从而创建一个我可以在RDLC文件中使用的动态图像。

我们将HTML作为图像显示在RDLC文件中的原因仅仅是因为我们的所有报告都使用不支持解释HTML的ReportViewer 9.0版。基于HTML创建动态图像允许我们显示我们想要直接在报表中显示的“格式”,这是我们无法做到的,而不是具有这种灵活性。

4 个答案:

答案 0 :(得分:0)

您可以使用WebBrowser控件在屏幕上呈现html,然后将屏幕位图复制到上传图像文件。

WebBrowser1.DocumentText = "<p>HELLO <span style='color:red'>WORLD</span></p>"

答案 1 :(得分:0)

此代码ALMOST有效。您需要单击该按钮两次,它才能在第二次单击时正常工作。抓取您需要解决的渲染页面存在时间问题。此外,表格必须在前面,因为它是一个屏幕抓取,所以只抓住屏幕的可见部分。

Option Strict On

Imports System.Drawing

Public Class Form1
  Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Dim strHTML As String = "<p>HELLO <span style='color:red'>WORLD</span></p>"
    WebBrowser1.DocumentText = strHTML
    Dim bmp As Bitmap = GetControlImage(WebBrowser1)
    Dim strFilename As String = "C:\Junk\Junk.png"
    bmp.Save(strFilename, System.Drawing.Imaging.ImageFormat.Png)
  End Sub

  Private Declare Function BitBlt _
    Lib "gdi32.dll" ( _
    ByVal hdcDest As IntPtr, _
    ByVal x As Int32, _
    ByVal y As Int32, _
    ByVal Width As Int32, _
    ByVal Height As Int32, _
    ByVal hdcSrc As IntPtr, _
    ByVal xSrc As Int32, _
    ByVal ySrc As Int32, _
    ByVal dwRop As Int32 _
    ) As Boolean
  Private Const SRCCOPY As Integer = &HCC0020

  Function GetControlImage(ctl As Control) As Bitmap
    Dim grpInput As Graphics = ctl.CreateGraphics
    ' Create a compatible bitmap and get its Graphics object
    Dim bmpOutput As New Bitmap(ctl.ClientRectangle.Width, ctl.ClientRectangle.Height, grpInput) 'formImage = New Bitmap(frmForm.ClientRectangle.Width, frmForm.ClientRectangle.Height, formGraphics)
    Dim grpOutput As Graphics = Graphics.FromImage(bmpOutput)

    ' Get the target and source device context handles (hDC)
    Dim sourceDC As IntPtr = grpInput.GetHdc
    Dim targetDC As IntPtr = grpOutput.GetHdc

    ' Copy the control's client area
    BitBlt(targetDC, 0, 0, ctl.ClientRectangle.Width, ctl.ClientRectangle.Height, sourceDC, ctl.ClientRectangle.X, ctl.ClientRectangle.Y, SRCCOPY)

    ' Release DCs and dispose objects
    grpInput.ReleaseHdc(sourceDC)
    grpInput.Dispose()
    grpOutput.ReleaseHdc(targetDC)
    grpOutput.Dispose()
    Return bmpOutput
  End Function

End Class

答案 2 :(得分:0)

wkhtmltopdf还有一个你可以使用的wkhtmltoimage.exe,试试http://wkhtmltopdf.org/

答案 3 :(得分:0)

在指令“Application.DoEvents”之前添加“Dim bmp As Bitmap = GetControlImage(WebBrowser1)”似乎解决了必须按两次按钮的问题。