2012-03-06 2 views
0

다음 코드에 문제가 있습니다. BrowsePage.Document.Body.ScrollRectangle.Width는 페이지가 이보다 훨씬 더 커도 230을 반환합니다. 따라서 대부분의 페이지가 잘립니다. 예 : BrowsePage.Document.Body.ScrollRectangle.Width를 정수로 바꾼 경우 2000, 전체 이미지가 캡처됩니다. 촬영되고있는 HTML 파일 (C : \ htmlTest.txt) :WebBrowser : BrowsePage.Document.Body.ScrollRectangle.Width

Public Class ImageFromHtml 
    Private PageUrl As String 
    Private ConvertedImage As Bitmap 
    Private BrowsePage As New WebBrowser() 
    Public documentText As String 

    Private m_intHeight As Integer 
    Public Property Height() As Integer 
     Get 
      Return m_intHeight 
     End Get 
     Set(ByVal value As Integer) 
      m_intHeight = value 
     End Set 
    End Property 

    Private m_intWidth As Integer 
    Public Property Width() As Integer 
     Get 
      Return m_intWidth 
     End Get 
     Set(ByVal value As Integer) 
      m_intWidth = value 
     End Set 
    End Property 

    Public Function ConvertPage() As Bitmap 
     'Me.PageUrl = PageUrl 
     Dim thrCurrent As New Thread(New ThreadStart(AddressOf CreateImage)) 
     thrCurrent.SetApartmentState(ApartmentState.STA) 
     thrCurrent.Start() 
     thrCurrent.Join() 
     'CreateImage() 
     Return ConvertedImage 
    End Function 
    Private Sub CreateImage() 

     BrowsePage.ScrollBarsEnabled = False 
     'BrowsePage.Navigate(PageUrl) 
     ' BrowsePage.ScriptErrorsSuppressed = True 
     'BrowsePage.Navigate("about:blank") 
     BrowsePage.DocumentText = documentText 
     BrowsePage.ScrollBarsEnabled = True 
     AddHandler BrowsePage.DocumentCompleted, AddressOf _ 
WebBrowser_DocumentCompleted 
     While BrowsePage.ReadyState <> WebBrowserReadyState.Complete 
      Application.DoEvents() 
     End While 
     BrowsePage.Dispose() 
    End Sub 



    Private Sub WebBrowser_DocumentCompleted(ByVal sender As Object, ByVal e As _ 
    WebBrowserDocumentCompletedEventArgs) 
      'BrowsePage = DirectCast(sender, WebBrowser) 
      BrowsePage = DirectCast(sender, WebBrowser) 
      Height = BrowsePage.Document.Body.ScrollRectangle.Height 
      Width = BrowsePage.Document.Body.ScrollRectangle.Width 
      BrowsePage.ClientSize = New Size(BrowsePage.Document.Body.ScrollRectangle.Width, BrowsePage.Document.Body.ScrollRectangle.Height) 
      BrowsePage.ScrollBarsEnabled = True 
      BrowsePage.ScriptErrorsSuppressed = True 
      'ConvertedImage = New Bitmap(Width, Height) 
      ConvertedImage = New Bitmap(BrowsePage.Document.Body.ScrollRectangle.Width, BrowsePage.Document.Body.ScrollRectangle.Height) 
      BrowsePage.BringToFront() 
      BrowsePage.DrawToBitmap(ConvertedImage, BrowsePage.Bounds) 
      'MsgBox(BrowsePage.Document.Body.ScrollRectangle.Height) 
      'MsgBox(BrowsePage.Document.Body.ScrollRectangle.Width) 
     End Sub 



    End Class 

Public Class Form1 



    Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load 
      Try 
       Dim objImageFromHtml As New ImageFromHtml() 
       'objImageFromHtml.Height = 1000 
       'objImageFromHtml.Width = 1000 
       Dim SR = New StreamReader("c:\htmlTest.txt") 
       objImageFromHtml.documentText = SR.ReadToEnd 
       Dim Test As Bitmap = objImageFromHtml.ConvertPage() 
       Test.Save("c:\Test.jpeg", _ 
       System.Drawing.Imaging.ImageFormat.Jpeg) 
      Catch ex As Exception 

      End Try 
     End Sub 
    End Class 

답변

0

잠재적으로 몇 가지 문제 :

  • 그것은 웹 페이지가되지 않았 음을 가능성이 몇 자바 스크립트 오류를 ​​포함하지 이런 방식으로 DocumentComplete를 사용할 때 전체 레이아웃을 완료하고 렌더링합니다. 특히 동적 콘텐트가있는 경우에는 컨트롤의 측정에 포함되지 않습니다 (JavaScript로 인해 더 많은 콘텐트가로드되거나 표시되는 등) .

  • 호출중인 렌더링 방법은 .NET 4.0, DrawToBitmap에서 지원되지 않습니다. 그래서 당신이 원하는대로 IE의 내용을 렌더링하지 않을 것입니다 (사실, 그냥 큰 흰색 블록을 렌더링하고 실제로 IE9에서는 .NET 3.5sp1 또는 4.0으로 렌더링 할 수 없습니다) .

  • DocumentCompleted 이벤트의 높이 및 너비 세트가 분명하지 않습니다. 크기를 조정하려고하십니까? 내가 BrowsePage 당신이 크기를 조정하려고하는 건 줄래?

+0

답장을 보내 주셔서 감사합니다. 결국 문제를 일으키는 HTML의 DOCTYPE 특성이라는 것을 알게되었습니다. HTML에서 DOCTYPE 특성을 제거하면 문제가 해결되었습니다. 따라서 위에서 제시 한 코드는 문제를 시뮬레이트하기에 충분하지 않았습니다. 어쨌든 고마워. – w0051977

+0

코드가 더 이상 지원되지 않는 내부 메서드를 사용합니다. :) – WiredPrairie