Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 不使用打印对话框从Windows服务打印html文档_C#_Windows Services_Printing - Fatal编程技术网

C# 不使用打印对话框从Windows服务打印html文档

C# 不使用打印对话框从Windows服务打印html文档,c#,windows-services,printing,C#,Windows Services,Printing,我正在使用windows服务,我想在服务启动时打印一个.html页面。我正在使用这个代码,它打印得很好。但是出现了打印对话框,没有打印对话框怎么打印 public void printdoc(string document) { Process printjob = new Process(); printjob.StartInfo.FileName = document; printjob.StartInfo.UseShellExecute = true; p

我正在使用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();
}
有没有其他方法可以在不显示“打印”对话框的情况下打印此文件


更新:响应:

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

axW.ExecWB(SHDocVw.OLECMDID.OLECMDID_PRINT,SHDocVw.OLECMDEXECOPT.OLECMDEXECOPT_PROMPTUSER , ref em, ref em);
当我使用windows服务时,我的程序在这里被阻塞,但它在windows应用程序中运行良好。

来自此网站

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

HtmlPrinter.HtmlPrinter hpObj=new HtmlPrinter.HtmlPrinter();
hpObj.PrintHtml(txtString.Text, true);
如果要在不使用“打印”对话框的情况下打印,请使用以下行:

hpObj.PrintHtml(txtString.Text, false); 

OLECMDEXECOPT\u PROMPTUSER
似乎会强制提示用户选择打印机和所有相关内容,我很确定这是服务不允许的。有人能验证一下吗?

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

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

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");
    }
}
public void PrintToPrinter(字符串printerName)
{
PrintDialog pd=新建PrintDialog();

pd.Document=userControl11.PrintDoc;//您可以在System.Drawing.Printing命名空间中使用PrintDocument类来对打印进行更多控制,有关更多信息,请参阅

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

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);
}

这确实需要您将文本/图像上的实际图形处理到页面,请参阅以了解更多信息。

首先,以下是代码:

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();
    }
  }
}
  • 您可以通过添加对“添加引用”对话框的COM选项卡上的“Microsoft Internet控件”的引用来访问SHDocVw命名空间
  • 有关InternetExplorer对象的更多信息,请访问
  • Navigate()方法将加载HTML文件。其他参数允许您指定可选参数,例如标志和标题
  • 在加载文档之前,我们无法打印。在这里,我进入了一个循环,等待调用DocumentComplete事件,在此事件上设置了一个标志,通知我们导航已完成。请注意,每当导航完成时,都会调用DocumentComplete—成功时或失败时
  • 设置documentLoaded标志后,将通过QueryStatusWB()查询打印状态,直到启用打印
  • 打印是通过ExecWB()调用开始的。指定了
    OLECMDID\u PRINT
    命令以及
    OLECMDEXECOPT\u DONTPRINTUSER
    选项,以便在无需用户交互的情况下自动打印。重要的一点是,这将打印到默认打印机。要指定打印机,必须设置默认打印机(在代码中,您可以调用)。最后两个参数允许可选的输入和输出参数
  • 我们不希望在打印完成之前退出,因此再次进入循环。在触发PrintTemplateTeardown事件后,设置documentPrinted标志。然后可以清理对象

  • 我不确定这是否有效。当您单击“直接打印URL”时,示例应用程序(也在Code Project上发布)会弹出打印机对话框,如果是“打印到文件”打印机(如Microsoft XPS Document Writer),则会弹出“将文件另存为”对话框。如果是“从浏览器打印URL”,则只会弹出MXDW的“另存文件为对话框”。是否有方法修改此对话框以横向打印?在Windows 8.1上使用它,IE11会出现以下错误:调用的对象已与其客户端断开连接。(HRESULT的异常:0x80010108(RPC_E_断开))@seaDrive,你通过代码得到改变方向属性的答案了吗?请与我们分享答案
    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();
        }
      }
    }