从Windows服务打印html文档,无需打印对话框

时间:2009-01-07 06:41:40

标签: 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应用程序中工作正常。

5 个答案:

答案 0 :(得分:15)

首先,这是代码:

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

答案 1 :(得分:1)

从此网站http://www.ussbd.com/printhtm.html

using HtmlPrinter;
hpObj=new HtmlPrinter.HtmlPrinter();
hpObj.PrintUrlFromMemory(txtUrl.Text);

现在,您可以在项目中添加代码,以便从源文本中打印html页面:

HtmlPrinter.HtmlPrinter hpObj=new HtmlPrinter.HtmlPrinter();
hpObj.PrintHtml(txtString.Text, true);

如果您想在没有打印对话框的情况下进行打印,请使用以下行:

hpObj.PrintHtml(txtString.Text, false); 

答案 2 :(得分:1)

这是另一种没有打印对话框的打印方式。您创建一个PrintDialog对象,初始化它然后调用Print()方法。

以下功能用于打印小的2“x0.75”条形码标签。您需要找到一种从html文件中获取Document对象的方法。

public void PrintToPrinter(string printerName)
{
    PrintDialog pd = new PrintDialog();
    pd.Document = userControl11.PrintDoc; // <--- Update this line with your doc
    pd.PrinterSettings.PrinterName = printerName;
    try
    {
            pd.Document.DocumentName = "My Label";
            pd.Document.DefaultPageSettings.PaperSize = new System.Drawing.Printing.PaperSize("2-.75", 200, 75);
            pd.Document.DefaultPageSettings.Margins = new System.Drawing.Printing.Margins(0, 0, 0, 0);
            //pd.PrinterSettings.Copies = (short)mNumCopies;
            pd.Document.PrinterSettings.Copies = (short) mNumCopies;
            pd.Document.Print();
    }
    catch
    {
        MessageBox.Show("INVALID PRINTER SPECIFIED");
    }
}

答案 3 :(得分:0)

OLECMDEXECOPT_PROMPTUSER似乎强制提示用户选择打印机和所有相关的东西,我很确定不允许从服务中获取。有人可以验证这个吗?

答案 4 :(得分:0)

您可以使用System.Drawing.Printing命名空间中的PrintDocument类来更好地控制打印,有关详细信息,请参阅here

例如,您可以执行以下操作:

using (PrintDocument doc = new PrintDocument())
{
    doc.PrintPage += this.Doc_PrintPage;
    doc.DefaultPageSettings.Landscape = true;
    doc.DocumentName = fileNameOfYourDocument;
    doc.Print();
}

然后为每个要打印的页面引发一个函数,并为您提供一个要绘制到

的图形区域
private void Doc_PrintPage(object sender, PrintPageEventArgs ev)
{
    ....
    ev.Graphics.DrawImage(image, x, y, newWidth, newHeight);
}

这需要您将文本/图像上的实际绘图处理到页面,有关详细信息,请参阅here