【问题标题】:How to print formatted text from a web server with confirmation of successful printing?如何从 Web 服务器打印格式化文本并确认打印成功?
【发布时间】:2012-03-24 03:31:52
【问题描述】:

我正在尝试构建一个系统,该系统将从网络服务器下载格式化文本,打印格式化文本,确认打印作业成功完成,然后响应网络服务器,让它知道文本已打印。无需用户输入。

我已经成功地使用Web Browser 控件下载 HTML,然后在不需要用户输入的情况下打印它。然而,这在确认打印的能力上是不足的。

看起来在System.Printing 中,您可以访问 PrintServer 和 PrintQueue,并使用它们来启动打印作业并查找打印作业的状态。

我还不能确认打印作业,但我已经能够启动简单的打印。但是,它不携带来自 Web 服务器的任何 HTML 格式。我没有绑定到 HTML,但它必须是一些可以由 Web 服务器生成的格式,以便可以在不需要更新客户端应用程序的情况下对其进行更改。

如何打印来自网络服务器的输出、格式正确并知道打印作业是成功还是失败?

【问题讨论】:

  • 这两个链接(SO)Confirm successful print programmatically in windows(C#.NET)Print Job Status 可能会给你足够的线索。
  • @Attila 感谢您提供的链接,不过如果您查看 System.Printing,它可以让您访问 PrintServer、PrintQueue 和 PrintSystemJobInfo。后者有几个不同的状态属性。所以,我希望这部分有一个完全的 .Net 方法。
  • docs 表示您可以访问 PrintSystemJobInfo.isCompleted,这似乎是您所追求的。 This link 可能会给你更多想法(虽然其中一些在 VB.NET 中,但转换为 C# 应该不会太难)
  • 您提到您已成功使用web browser 控件下载HTML。这是否意味着您愿意使用 Windows 窗体方法?
  • @Reinaldo 我现在愿意接受任何建议。 .Net Web 浏览器对象有一个Print() 方法,可以在没有用户输入的情况下处理打印 HTML。问题在于,除了打印是否成功,甚至打印完成时,没有其他信息。

标签: c# asp.net .net windows


【解决方案1】:

我假设您愿意使用 WebBrowser 控件。这是确认打印的解决方案。基本上你需要处理 PrintTemplateTeardown 事件来等待打印作业完成。

以下是从答案中提取的示例代码:Print html document from Windows Service without print dialog

using System.Reflection;
using System.Threading;
using SHDocVw;

namespace HTMLPrinting
{
  public class HTMLPrinter
  {
    private bool documentLoaded;
    private bool documentPrinted;

    private void ie_DocumentComplete(object pDisp, ref object URL)
    {
      documentLoaded = true;
    }

    private void ie_PrintTemplateTeardown(object pDisp)
    {
      documentPrinted = true;
    }

    public void Print(string htmlFilename)
    {
      documentLoaded = false;
      documentPrinted = false;

      InternetExplorer ie = new InternetExplorerClass();
      ie.DocumentComplete += new DWebBrowserEvents2_DocumentCompleteEventHandler(ie_DocumentComplete);
      ie.PrintTemplateTeardown += new DWebBrowserEvents2_PrintTemplateTeardownEventHandler(ie_PrintTemplateTeardown);

      object missing = Missing.Value;

      ie.Navigate(htmlFilename, ref missing, ref missing, ref missing, ref missing);
      while (!documentLoaded && ie.QueryStatusWB(OLECMDID.OLECMDID_PRINT) != OLECMDF.OLECMDF_ENABLED)
        Thread.Sleep(100);

      ie.ExecWB(OLECMDID.OLECMDID_PRINT, OLECMDEXECOPT.OLECMDEXECOPT_DONTPROMPTUSER, ref missing, ref missing);
      while (!documentPrinted)
        Thread.Sleep(100);

      ie.DocumentComplete -= ie_DocumentComplete;
      ie.PrintTemplateTeardown -= ie_PrintTemplateTeardown;
      ie.Quit();
    }
  }
}

您也可以参考:https://jiangsheng.net/2021/03/24/how-to-determine-when-a-page-is-done-printing-in-webbrowser-control/

希望对你有帮助!

【讨论】:

  • 我收集到 .Net WebBrowser 没有 PrintTemplateTearDown 事件,而 Windows 窗体版本有?
  • 其实上面的例子并没有使用WebBrowser控件。相反,它会创建一个 InternetExplorer 对象的实例来加载和打印文件。如果您不想让 IE 实例不可见,可以使用ie.Visible = false。您可以在此处阅读有关InternetExplorer Object 的更多信息:msdn.microsoft.com/en-us/library/aa752084(v=vs.85).aspx
  • 我正在努力让它工作,我在InternetExplorer ie = new InternetExplorerClass(); 上遇到错误无法嵌入互操作类型“SHDocVw.InternetExplorerClass”。请改用适用的界面。我现在正在寻找答案,但有什么想法吗?
  • blogs.msdn.com/b/mshneer/archive/2009/12/07/… 现在我关闭了“嵌入互操作类型”选项,它没有给我错误。
  • 它正在连接并打印它得到的东西,但不幸的是,它现在无法连接到网站,因为它使用了未经身份验证的证书。所以它正在打印一个安全错误。 就这个问题打开了一个单独的问题:stackoverflow.com/questions/9959421/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-09-05
  • 2021-02-22
  • 2020-08-08
  • 2019-08-25
  • 2018-02-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多