2010-06-02 85 views
2

我们使用客户端应用程序从在线应用程序打印出成绩单。如何在不使用WebBrowser控件的情况下打印网页

这已经完美地工作,直到系统升级到IE 8,我现在收到此错误(拒绝访问):http://img707.imageshack.us/img707/5259/62270489.png
显然,这是一个已知的问题,并不能得到解决。

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

感谢,

马丁Wiboe

+0

这是一个古老的问题,但不管怎样:你打印多个文档只有一个浏览器实例吗? – 2010-12-22 08:01:18

回答

0

这“可能”的工作:如果您使用的办公自动化和HTML是基本够用,你可以做一个请求,HTML和通过Word中打印?

另一种思路值得探讨:

转换HTML内容为PDF格式,保存/打印这一点。

+0

好主意,但Office不一定安装在机器上。 – 2010-06-02 12:39:42

+0

是的,这个解决方案有一些已知的要求... – 2010-06-02 13:49:53

+0

PDF转换似乎是我唯一的选择。我正在考虑使用wkhtmltopdf - 任何想法? – 2010-06-04 13:19:05

0

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

一些参考:

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

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

+0

尝试Gecko后,它似乎没有打印方法:(我可能会试着去PDF方式代替。 – 2010-06-04 13:18:15

2

一个可能的解决方案,以一个老问题:

当打印从WebBrowser.WebBrowser控制多个文档,只有1个实例,这可能会导致拒绝访问错误。

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

WebBrowser browser = (WebBrowser)sender; 

访问被拒绝的错误可能发生在webbrowser实例处置时仍然有一些打开的打开资源。

问候, M.

+0

听起来像一个似是而非的解释!为了确保我正确理解你:我应该创建一个新的WebBrowser实例用于打印每个文档,并在其中加载文档。可以从单个事件处理程序完成打印,其中WebBrowser的引用位于'sender'变量中? – 2010-12-28 11:50:14

+0

您完全正确(我没有登录本网站一段时间,对于迟到的回复抱歉)。 – 2011-01-26 13:35:32

0

我遇到了麻烦,从Skybound的GeckoFx印刷 - 没有web浏览器 - 但由于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 
0

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

相关问题