Печать html-документа из Windows Service без диалога печати
Я использую службу 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);
Моя программа получает блок здесь, когда я использую службу окна, но она отлично работает с окнами.
Ответы
Ответ 1
Прежде всего, здесь код:
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();
}
}
}
- Вы можете получить доступ к пространству имен SHDocVw, добавив ссылку на "Microsoft Internet Controls", найденную на вкладке COM диалогового окна "Добавить ссылку".
- Более подробную информацию об объекте InternetExplorer можно найти на MSDN.
- Метод Navigate() загрузит HTML файл. Другие параметры позволяют указать необязательные параметры, такие как флаги и заголовки.
- Мы не можем печатать, пока документ не будет загружен. Здесь я вхожу в цикл, ожидающий, пока не вызывается событие DocumentComplete, на котором установлен флаг, уведомляющий нас о том, что навигация завершена. Обратите внимание, что DocumentComplete вызывается всякий раз, когда навигация заканчивается - при успешном завершении или.
- Как только флаг documentLoaded установлен, состояние печати запрашивается с помощью QueryStatusWB(), пока не будет включена печать.
- Печать начинается с вызова ExecWB(). Команда
OLECMDID_PRINT
указывается вместе с опцией OLECMDEXECOPT_DONTPROMPTUSER
для автоматической печати без участия пользователя. Важно отметить, что это будет печатать на принтере по умолчанию. Чтобы указать принтер, вам придется установить принтер по умолчанию (в коде вы можете вызвать SetDefaultPrinter()). Два последних параметра позволяют выполнять дополнительные входные и выходные параметры.
- Мы не хотим уходить, пока печать не будет завершена, поэтому снова вводится цикл. После запуска события PrintTemplateTeardown установлен флаг DocumentPrinted. Затем объекты можно очистить.
Ответ 2
С этого сайта 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);
Ответ 3
Здесь другой способ печати без диалогового окна печати. Вы создаете объект 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");
}
}
Ответ 4
OLECMDEXECOPT_PROMPTUSER
похоже, побуждает пользователя выбирать принтер и все связанные с ним материалы, которые, я уверен, не разрешены службой. Кто-нибудь может это подтвердить?
Ответ 5
Вы можете использовать класс 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);
}
Это требует, чтобы вы обрабатывали фактический чертеж на тексте/изображении на странице, см. здесь для получения дополнительной информации.