Распечатать HTML-документ из службы Windows без диалогового окна печати - PullRequest
14 голосов
/ 07 января 2009

Я использую службу 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.

Ответы [ 5 ]

15 голосов
/ 11 ноября 2009

Во-первых, вот код:

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. Вы можете получить доступ к пространству имен SHDocVw, добавив ссылку на «Microsoft Internet Controls», расположенную на вкладке COM диалогового окна «Добавить ссылку».
  2. Дополнительную информацию об объекте InternetExplorer можно найти на MSDN .
  3. Метод Navigate () загрузит файл HTML. Другие параметры позволяют указывать необязательные параметры, такие как флаги и заголовки.
  4. Мы не можем печатать, пока документ не загружен. Здесь я ввожу цикл, ожидающий, пока не будет вызвано событие DocumentComplete, при котором устанавливается флаг, уведомляющий нас о завершении навигации. Обратите внимание, что DocumentComplete вызывается всякий раз, когда навигация завершена - при успехе или сбой.
  5. После установки флага documentLoaded состояние печати запрашивается через QueryStatusWB () до тех пор, пока печать не будет включена.
  6. Печать начинается с вызова ExecWB (). Указана команда OLECMDID_PRINT вместе с параметром OLECMDEXECOPT_DONTPROMPTUSER для автоматической печати без участия пользователя. Важным примечанием является то, что это будет печатать на принтер по умолчанию. Чтобы указать принтер, вам нужно будет установить принтер по умолчанию (в коде вы можете вызвать SetDefaultPrinter () ). Два последних параметра допускают дополнительные входные и выходные параметры.
  7. Мы не хотим выходить из системы до завершения печати, поэтому снова вводится цикл. После запуска события PrintTemplateTeardown устанавливается флаг documentPrinted. Затем объекты можно очистить.
1 голос
/ 27 августа 2009

Вот еще один способ печати без диалогового окна печати. Вы создаете объект PrintDialog, инициализируете его и затем вызываете метод Print ().

Данная функция используется для печати небольшой этикетки со штрих-кодом размером 2 "x0,75". Вам нужно будет найти способ получить объект Document из 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");
    }
}
1 голос
/ 07 января 2009

С этого сайта 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); 
0 голосов
/ 30 октября 2009

Вы можете использовать класс PrintDocument в пространстве имен System.Drawing.Printing, чтобы дать вам больше контроля над печатью, см. здесь для получения дополнительной информации.

Например, вы можете сделать следующее:

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

Для этого требуется, чтобы вы обрабатывали фактический рисунок на тексте / изображении на странице, для получения дополнительной информации см. здесь .

0 голосов
/ 15 января 2009

OLECMDEXECOPT_PROMPTUSER, кажется, вынуждает пользователя выбрать принтер и все связанные с ним материалы, что, я уверен, запрещено сервисом. Может кто-нибудь это проверить?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...