簡體   English   中英

將內聯HTML渲染為VB.Net中的圖像

[英]Render inline HTML to an Image in VB.Net

基本上我有一個看起來像這樣的字符串:

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

我將如何將HTML 字符串轉換為圖像? (位圖,PNG等)

有誰知道會執行此操作的任何VB.NET工具嗎? 由於這是一個字符串,因此從技術上講它不是DOM的一部分,因此無法從DOM讀取。

我的總體目的是創建一個ASPX頁面,該頁面將從數據庫中讀取包含一些HTML的字段,將該HTML轉換為圖像,然后通過將ContentType欺騙為“ image / png”將該頁面上的圖像汽化,從而創建一個我可以在RDLC文件中使用的動態圖像。

我們將RDLC文件中的圖像顯示為HTML的原因僅僅是因為我們所有的報告都使用ReportViewer版本9.0,該版本不支持解釋的HTML。 基於HTML創建動態圖像使我們能夠直接在報表中顯示要顯示的“格式”,否則我們將無法做到這一點,而且無論如何也沒有這種靈活性。

您可以使用WebBrowser控件在屏幕上呈現html,然后將屏幕位圖復制到圖像文件中。

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

此代碼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

wkhtmltopdf也有一個wkhtmltoimage.exe可供您使用,請嘗試http://wkhtmltopdf.org/

在指令“ Dim bmp As Bitmap = GetControlImage(WebBrowser1) ”之前緊接添加“ Application.DoEvents ”似乎解決了必須按兩次按鈕的問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM