c# 从Windows Service打印html文档,无需打印对话框

更新时间:2024-02-09 下载TXT文档 下载Word文档

我正在使用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应用程序中工作正常。

首先,这是代码:

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();
    }
  }
}
  • 您可以通过添加对" Microsoft Internet控件"的引用来访问SHDocVw命名空间,该引用位于"添加引用"对话框的" COM"选项卡上。
  • 可以在MSDN上找到有关InternetExplorer对象的更多信息。
  • Navigate()方法将加载HTML文件。其他参数允许您指定可选参数,例如标志和标头。
  • 加载文档之前,我们无法打印。在这里,我进入一个循环,直到调用DocumentComplete事件为止,在该循环上设置了一个标志,通知我们导航已完成。请注意,无论导航成功还是失败,只要完成导航,就会调用DocumentComplete。
  • 设置documentLoaded标志后,将通过QueryStatusWB()查询打印状态,直到启用打印为止。
  • 通过ExecWB()调用开始打印。指定了OLECMDID_PRINT命令以及选项OLECMDEXECOPT_DONTPROMPTUSER,以自动打印而无需用户交互。重要说明是,这将打印到默认打印机。要指定打印机,您将必须设置默认打印机(在代码中,您可以调用SetDefaultPrinter())。最后两个参数允许使用可选的输入和输出参数。
  • 在打印完成之前,我们不希望退出,因此再次进入循环。触发PrintTemplateTeardown事件后,将设置documentPrinted标志。然后可以清理对象。
    • 有没有办法修改它以横向打印?
    • IE11在Windows 8.1上使用此错误:调用的对象已与其客户端断开连接。 (来自HRESULT的异常:0x80010108(RPC_E_DISCONNECTED))
    • @seaDrive,您是否通过代码获得了更改Orientation属性的答案?请分享给我们答案

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

    以下功能用于打印小的2" x0.75"条形码标签。您需要找出一种从html文件获取Document对象的方法。 短码网=DuanMa.NET

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

    从此站点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);
    • 我不确定这是否有效。当您单击"直接打印URL"时,示例应用程序(也已在Code Project上发布)弹出打印机对话框,如果是"打印到文件"打印机,例如Microsoft XPS Document Writer,则"保存"。文件为"对话框。如果是"从浏览器打印URL",则仅弹出MXDW的"将文件另存为对话框"。

    您可以在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);
    }

    这确实需要您处理页面上文本/图像上的实际图形,有关更多信息,请参见此处。

    OLECMDEXECOPT_PROMPTUSER似乎迫使用户提示选择打印机和所有相关的东西,我敢肯定,服务不允许这样做。有人可以验证吗?

    以上就是短码网小编为大家整理的《c# 从Windows Service打印html文档,无需打印对话框》相关内容,希望大家喜欢。

    本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。

    如若内容造成侵权/违法违规/事实不符,请将联系本站反馈,一经查实,立即处理!

    c# 从Windows Service打印html文档,无需打印对话框》文档下载仅供参考学习,下载后请在24小时内删除。

    转载注明出处:https://www.duanma.net/article/8d5ab95e005.html

    回到顶部