c# - 在没有打印对话框的情况下从 Windows 服务打印 html 文档

标签 c# windows-services printing

我正在使用 Windows 服务,我想在服务启动时打印一个 .html 页面。我正在使用这段代码并且打印效果很好。但是出现了打印对话框,没有打印对话框怎么打印呢?

public void printdoc(string document)
{
    Process printjob = new Process();

    printjob.StartInfo.FileName = document;
    printjob.StartInfo.UseShellExecute = true;
    printjob.StartInfo.Verb = "print";
    printjob.StartInfo.CreateNoWindow = true;
    printjob.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;

    printjob.Start();
}

有没有其他方法可以在不显示打印对话框的情况下打印它。


更新:回应this :

但是我已经使用过这个类但是当我调用

axW.ExecWB(SHDocVw.OLECMDID.OLECMDID_PRINT,SHDocVw.OLECMDEXECOPT.OLECMDEXECOPT_PROMPTUSER , ref em, ref em);

当我从窗口服务使用时,我的程序在此处被阻止,但它在 Windows 应用程序中运行良好。

最佳答案

首先,这是代码:

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();
    }
  }
}
  1. 您可以通过添加对“Microsoft Internet Controls”的引用来访问 SHDocVw 命名空间,该引用位于“添加引用”对话框的 COM 选项卡上。
  2. 有关 InternetExplorer 对象的更多信息,请访问 MSDN。 .
  3. Navigate() 方法将加载 HTML 文件。其他参数允许您指定可选参数,例如标志和 header 。
  4. 在加载文档之前我们无法打印。在这里,我进入了一个循环,等待调用 DocumentComplete 事件,此时会设置一个标志,通知我们导航已完成。请注意,只要导航完成 - 成功失败,就会调用 DocumentComplete。
  5. 设置 documentLoaded 标志后,将通过 QueryStatusWB() 查询打印状态,直到启用打印。
  6. 打印是从 ExecWB() 调用开始的。指定了 OLECMDID_PRINT 命令以及选项 OLECMDEXECOPT_DONTPROMPTUSER 以自动打印而无需用户交互。重要的一点是,这将打印到默认打印机。要指定打印机,您必须设置默认打印机(在代码中,您可以调用 SetDefaultPrinter() )。最后两个参数允许可选的输入和输出参数。
  7. 我们不想在打印完成之前退出,所以再次进入循环。触发 PrintTemplateTeardown 事件后,将设置 documentPrinted 标志。然后可以清理对象。

关于c# - 在没有打印对话框的情况下从 Windows 服务打印 html 文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/419412/

相关文章:

c# - 服务无法启动,但确实启动了?

python - 如何停止作为 Windows 服务运行的 web.py 服务器

java - PrintServiceLookup.lookupDefaultPrintService() 始终返回 null

python - 在字典中打印键值对时,它们是否以任何特定顺序打印? (Python)

c# - 在 Excel 中调用 Cells.End

c# - 重定向到新网站以及查询字符串参数。仅 DNS 名称更改

javascript - event.item.valueField 显示未定义

c# - 301 使用 unicode 字符重定向 - C#

c# - 指定 Windows 服务中 AppDomain 的生命周期

css - 使用 CSS 强制打印分页符