2010-06-02 69 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的內容的可能性。如果我有成功,我會告訴你。

相關問題