我们使用客户端应用程序从在线应用程序打印出成绩单。如何在不使用WebBrowser控件的情况下打印网页
这已经完美地工作,直到系统升级到IE 8,我现在收到此错误(拒绝访问):http://img707.imageshack.us/img707/5259/62270489.png
显然,这是一个已知的问题,并不能得到解决。
如何在不使用IE WebBrowser控件的情况下从WinForms应用程序打印HTML?
感谢,
马丁Wiboe
我们使用客户端应用程序从在线应用程序打印出成绩单。如何在不使用WebBrowser控件的情况下打印网页
这已经完美地工作,直到系统升级到IE 8,我现在收到此错误(拒绝访问):http://img707.imageshack.us/img707/5259/62270489.png
显然,这是一个已知的问题,并不能得到解决。
如何在不使用IE WebBrowser控件的情况下从WinForms应用程序打印HTML?
感谢,
马丁Wiboe
这“可能”的工作:如果您使用的办公自动化和HTML是基本够用,你可以做一个请求,HTML和通过Word中打印?
另一种思路值得探讨:
转换HTML内容为PDF格式,保存/打印这一点。
好主意,但Office不一定安装在机器上。 – 2010-06-02 12:39:42
是的,这个解决方案有一些已知的要求... – 2010-06-02 13:49:53
PDF转换似乎是我唯一的选择。我正在考虑使用wkhtmltopdf - 任何想法? – 2010-06-04 13:19:05
嗯有趣的错误,我以前见过这个,我建议你使用Gecko。
一些参考:
Embedding Gecko(Mozilla rendering engine) in a .Net application
GeckoFX 是一个Windows窗体控件写在干净 ,评论C#是 嵌入在任何Windows Mozilla的Gecko的浏览器 控制窗体 应用。它还包含一个简单的 类模型,可以访问HTML和CSS DOM的 。
尝试Gecko后,它似乎没有打印方法:(我可能会试着去PDF方式代替。 – 2010-06-04 13:18:15
一个可能的解决方案,以一个老问题:
当打印从WebBrowser.WebBrowser控制多个文档,只有1个实例,这可能会导致拒绝访问错误。
为每个文档使用一个新变量进行打印,不要全局使用它。在事件处理程序(如WebBrowserDocumentCompletedEventHandler)中,将sender参数强制转换为Webbrowser对象。
WebBrowser browser = (WebBrowser)sender;
访问被拒绝的错误可能发生在webbrowser实例处置时仍然有一些打开的打开资源。
问候, M.
听起来像一个似是而非的解释!为了确保我正确理解你:我应该创建一个新的WebBrowser实例用于打印每个文档,并在其中加载文档。可以从单个事件处理程序完成打印,其中WebBrowser的引用位于'sender'变量中? – 2010-12-28 11:50:14
您完全正确(我没有登录本网站一段时间,对于迟到的回复抱歉)。 – 2011-01-26 13:35:32
我遇到了麻烦,从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
我正在探索使用富文本编辑器转换它,然后打印RTE的内容的可能性。如果我有成功,我会告诉你。
这是一个古老的问题,但不管怎样:你打印多个文档只有一个浏览器实例吗? – 2010-12-22 08:01:18