【问题标题】:How to print a web page without using the WebBrowser control如何在不使用 WebBrowser 控件的情况下打印网页
【发布时间】:2010-06-02 12:04:14
【问题描述】:

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

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

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

谢谢,

马丁·维博

【问题讨论】:

  • 这是一个老问题,但是:您是否仅使用 1 个浏览器实例打印多个文档?

标签: html winforms browser printing


【解决方案1】:

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

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

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

WebBrowser browser = (WebBrowser)sender;

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

问候, M.

【讨论】:

  • 听起来像是一个合理的解释!为了确保我正确理解您:我应该为每个要打印的文档创建一个新的 WebBrowser 实例,并将文档加载到其中。打印可以从单个事件处理程序中完成,其中对 WebBrowser 的引用位于“sender”变量中?
  • 你说的完全正确(我有一段时间没有登录这个网站,抱歉回复晚了)。
【解决方案2】:

这个“可能”有效:如果您使用的是办公自动化并且 html 足够基本,您可以请求 html 并通过 word 打印?

另一个值得探索的想法:

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

【讨论】:

  • 好主意,但机器上不一定安装 Office。
  • PDF 转换似乎是我唯一的选择。我正在考虑使用 wkhtmltopdf - 有什么想法吗?
【解决方案3】:

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

一些参考资料:

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

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

【讨论】:

  • 在尝试 Gecko 之后,它似乎没有打印方法 :( 我可能会尝试使用 PDF 方式。
【解决方案4】:

我在从 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

【讨论】:

    【解决方案5】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多