Vb.net WebBrowser,处理pdf加载完成
我想知道是否有人知道一种让.pdf文件在加载时触发readystate的简单方法。我正在建立一个程序来打开url并截图,然后将它们放入excel web浏览器将正确加载html文档,但在加载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
文件时,浏览器会在未准备好页面的情况下卡在中。浏览器控件正确呈现.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