如何在不使用WebBrowser控件的情况下打印网页

时间:2010-06-02 12:04:15

标签: html winforms browser printing

我们正在使用客户端应用程序从在线应用程序打印成绩单。

在系统升级到IE 8之前,这一直在完美运行。我现在收到此错误(拒绝访问):http://img707.imageshack.us/img707/5259/62270489.png
显然,这是一个已知问题,无法解决。

如何在不使用IE WebBrowser控件的情况下从WinForms应用程序打印HTML?

谢谢,

Martin Wiboe

5 个答案:

答案 0 :(得分:2)

旧问题的可能解决方案:

从WebBrowser.WebBrowser控件打印多个文档时,只有一个实例,这可能导致访问被拒绝错误。

为每个文档使用新变量进行打印,不要全局使用。在诸如WebBrowserDocumentCompletedEventHandler之类的事件处理程序中,将sender参数强制转换为webbrowser对象。

WebBrowser browser = (WebBrowser)sender;

当处理了仍然具有一些打开资源的webbrowser实例时,可能会发生访问被拒绝错误。

此致 微米。

答案 1 :(得分:0)

这“可能”有效:如果您使用的是Office Automation并且html足够基础,您可以通过Word发出html请求并打印吗?

另一个值得探索的想法:

将Html内容转换为PDF并保存/打印。

答案 2 :(得分:0)

嗯有趣的错误,我以前见过这个,我建议你使用Gecko

一些参考文献:

  

Embedding Gecko(Mozilla rendering engine) in a .Net application

     

GeckoFX   是一个Windows窗体控件   写在干净,评论C#   嵌入Mozilla Gecko浏览器   在任何Windows窗体中控制   应用。它还包含一个简单的   提供访问权限的类模型   HTML和CSS DOM。

答案 3 :(得分:0)

我无法从Skybound的GeckoFx打印 - 而不是WebBrowser - 但是由于Michel van Engelens answer这个问题帮助了我,我想我可以在这里添加我的解决方案。它也可能适用于WebBrowser。

最重要的部分是将Print调用与DocumentCompleted事件分开 - 我只是在这里使用计时器。

Private Sub btnPrint_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnPrint.Click
    Try
        Dim wb As New Skybound.Gecko.GeckoWebBrowser
        AddHandler wb.DocumentCompleted, AddressOf PrintWebBrowser_DocumentCompleted
        AddHandler wb.HandleCreated, AddressOf PrintWebBrowser_HandleCreated
        wb.CreateControl()
    Catch ex As Exception
        MsgBox(String.Format("Error trying to create GeckoWebBrowser: {0}", ex.Message))
    End Try
End Sub

Private Sub PrintWebBrowser_HandleCreated(ByVal sender As Object, ByVal e As System.EventArgs)
    Dim wb = DirectCast(sender, Skybound.Gecko.GeckoWebBrowser)
    wb.Navigate(GeckoWebBrowser1.Url.AbsoluteUri)
End Sub

Private Sub PrintWebBrowser_DocumentCompleted(ByVal sender As Object, ByVal e As System.EventArgs)
    Dim wb = DirectCast(sender, Skybound.Gecko.GeckoWebBrowser)
    If wb.Url IsNot Nothing AndAlso wb.Url.AbsoluteUri = "about:blank" Then Exit Sub

    Dim tmr As New Timer
    tmr.Interval = 200
    AddHandler tmr.Tick, AddressOf TimerTick
    tmr.Tag = wb
    tmr.Start()
End Sub

Private Sub TimerTick(ByVal sender As Object, ByVal e As EventArgs)
    Dim tmr As Timer = DirectCast(sender, Timer)
    tmr.Stop()

    Dim wb As Skybound.Gecko.GeckoWebBrowser = Nothing
    Try
        wb = DirectCast(tmr.Tag, Skybound.Gecko.GeckoWebBrowser)
        wb.Window.Print()
    Catch comEx As Runtime.InteropServices.COMException
        Dim hresult As Integer = Runtime.InteropServices.Marshal.GetHRForException(comEx)
        If hresult = &H80004004 Then //' EX_ABORT
            MsgBox("Print cancelled")
        Else
            MsgBox(String.Format("Print failed: {0}", comEx.Message))
        End If
    Catch ex As Exception
        MsgBox(String.Format("Print failed: {0}", ex.Message))
    Finally
        If wb IsNot Nothing Then wb.Dispose()
    End Try
End Sub

答案 4 :(得分:0)

我即将探索使用富文本编辑器进行转换,然后打印RTE内容的可能性。如果我成功,我会告诉你的。