【问题标题】:Render inline HTML to an Image in VB.Net将内联 HTML 渲染到 VB.Net 中的图像
【发布时间】:2015-02-16 12:31:39
【问题描述】:

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

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

我将如何将这个 string 的 HTML 转换为图像? (位图、PNG 等)

有没有人知道任何可以做到这一点的 VB.NET 工具?由于这是一个字符串,因此它无法从 DOM 中读取,因为它在技术上不是 DOM 的一部分。

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

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

【问题讨论】:

  • 您的意思是不编写自己的 HTML 解析器?您是否考虑过自动化浏览器并截取屏幕截图?
  • 很有趣,很遗憾我还没有接触过 WebBrowser 类,您能否再扩展一下! :)

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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      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
      

      【讨论】:

      • 感谢您的回复,遗憾的是我需要包含对 System.Windows.Forms.DataVisualization 的引用,据我所知,.Net 2.0 似乎不支持该引用
      • 我刚刚检查过,它应该适用于 .NET 2.0 我在 VS2012 中创建了一个新的 .NET 2.0 Windows 窗体应用程序,在窗体中添加了一个 webbrowser 控件和一个按钮控件,然后剪切粘贴上面的代码。单击按钮两次正确生成图像文件。
      【解决方案4】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-08-16
        • 1970-01-01
        • 2012-05-30
        • 1970-01-01
        • 2011-03-10
        相关资源
        最近更新 更多