Vb.net WebBrowser,处理pdf加载完成

Vb.net WebBrowser,处理pdf加载完成,vb.net,webbrowser-control,Vb.net,Webbrowser Control,我想知道是否有人知道一种让.pdf文件在加载时触发readystate的简单方法。我正在建立一个程序来打开url并截图,然后将它们放入excel web浏览器将正确加载html文档,但在加载.pdf文件时,浏览器会在未准备好页面的情况下卡在中。浏览器控件正确呈现.pdf Private Sub btngo_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btngo.Click Dim fi

我想知道是否有人知道一种让.pdf文件在加载时触发readystate的简单方法。我正在建立一个程序来打开url并截图,然后将它们放入excel

web浏览器将正确加载html文档,但在加载
.pdf
文件时,浏览器会在未准备好页面的情况下卡在
中。浏览器控件正确呈现
.pdf

Private Sub btngo_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btngo.Click
    Dim file As String
    Dim Obj As New Object
    Dim result As String
    Dim sheet As String = "sheet1"
    Dim xlApp As New Excel.Application

    If lblpath.Text <> "" Then
        file = lblpath.Text
        Dim xlWorkBook = xlApp.Workbooks.Open(file)
        Dim xlWorkSheet = xlWorkBook.Worksheets(sheet)
        Dim range = xlWorkSheet.UsedRange

        ProgressBar1.Value = 0

        For rCnt = 4 To range.Rows.Count
            'url cell
            Obj = CType(range.Cells(rCnt, 2), Excel.Range)
            ' Obj.value now contains the value in the cell.. 
            Try
                ' Creates an HttpWebRequest with the specified URL. 
                Dim myHttpWebRequest As HttpWebRequest = CType(WebRequest.Create(Obj.value), HttpWebRequest)
                ' Sends the request and waits for a response. 
                Dim myHttpWebResponse As HttpWebResponse = CType(myHttpWebRequest.GetResponse(), HttpWebResponse)
                If myHttpWebResponse.StatusCode = HttpStatusCode.OK Then
                    result = myHttpWebResponse.StatusCode
                    WebBrowser1.ScrollBarsEnabled = False
                    WebBrowser1.Navigate(myHttpWebRequest.RequestUri)

                    WaitForPageLoad()

                    CaptureWebBrowser(WebBrowser1)
                End If
                ' Release the resources of the response.
                myHttpWebResponse.Close()

            Catch ex As WebException
                result = (ex.Message)
            Catch ex As Exception
                result = (ex.Message)
            End Try


            RichTextBox1.AppendText(result & "    " & Obj.value & vbNewLine)

            If radpre.Checked = True Then
                range.Cells(rCnt, 3).value = result
            ElseIf radcob.Checked = True Then
                range.Cells(rCnt, 4).value = result
            ElseIf radpost.Checked = True Then
                range.Cells(rCnt, 5).value = result

            End If


            ProgressBar1.Value = rCnt / range.Rows.Count * 100
        Next

        With xlApp
            .DisplayAlerts = False
            xlWorkBook.SaveAs(lblpath.Text.ToString)
            .DisplayAlerts = True
        End With

        xlWorkBook.Close()
        xlApp.Quit()

        'reclaim memory
        Marshal.ReleaseComObject(xlApp)
        xlApp = Nothing
    End If
End Sub

Private Function CaptureWebBrowser(ByVal wb As WebBrowser) As Image
    Try
        Dim hBitmap As Bitmap = New Bitmap(wb.Width, wb.Height)
        wb.DrawToBitmap(hBitmap, wb.Bounds)
        Dim img As Image = hBitmap
        Return img
    Catch ex As Exception
        MessageBox.Show(ex.Message)
    End Try
    Return Nothing
End Function


Private Sub WaitForPageLoad()
    AddHandler WebBrowser1.DocumentCompleted, New WebBrowserDocumentCompletedEventHandler(AddressOf PageWaiter)
    While Not pageready
        Application.DoEvents()
    End While
    pageready = False
End Sub

Private Sub PageWaiter(ByVal sender As Object, ByVal e As WebBrowserDocumentCompletedEventArgs)
    If WebBrowser1.ReadyState = WebBrowserReadyState.Complete Then
        pageready = True
        RemoveHandler WebBrowser1.DocumentCompleted, New WebBrowserDocumentCompletedEventHandler(AddressOf PageWaiter)
    End If
End Sub

不幸的是,您将无法使用
webBrowser.DrawToBitmap
获取PDF视图的快照。在撰写本文时,Adobe Acrobat Reader ActiveX控件不支持在自定义设备上下文上呈现,因此此方法无法工作,也无法通过WebBrowser直接在Reader ActiveX对象上发送
WM_PRINT
或调用
IViewObject::Draw
(我试过了,并且)。正确的解决方案是使用第三方PDF呈现组件

另一方面,您应该避免使用如下代码模式:

While Not pageready
    Application.DoEvents()
End While

这是一个紧密的循环,徒劳地消耗CPU周期。至少,在循环中加入一些
Thread.Sleep(200)
,但总的来说,你也应该避免。

据我所知,浏览器没有呈现.pdf、Adobe(或任何你拥有的pdf查看器)。文档完成触发时是否可以检查web浏览器控件的URL?我明天必须检查调试。它确实呈现了正确的页数。据我所知,浏览器控件使用已安装的IE,IE反过来调用已安装的Adobe。有没有一种更简单的方法来调用url和屏幕截图?您是想将pdf打印为屏幕截图,还是绕过它,通过处理readystate complete继续?我总是看到这种响应,但还没有找到一个好的解决方案来解决等待页面就绪而不冻结UI的问题(仅仅因为WBC说“就绪”)这并不意味着页面真的“准备好了”,我经常在加载DB数据的过程中得到这一点。@ JasonBayldon,这里要处理“准备就绪”而不依赖于<代码> RealyStAt/Obj>。同样可以在VB.NET中完成。然而,这适用于导航到HTML页面,而不是PDF。关于PDF,我将使用AdobeReaderActiveX,而不使用
WebBrowser
层。感谢您的反馈。由于这是一个快速脏扔掉的程序,我把代码留给我编辑的程序。下次我会记住代码模式的用法。
While Not pageready
    Application.DoEvents()
End While