print net c# windows-services printing

net - printdocument c#



Imprima un documento html desde el servicio de Windows sin imprimir el cuadro de diálogo (5)

Estoy usando un servicio de Windows y quiero imprimir una página .html cuando comience el servicio. Estoy usando este código y está imprimiendo bien. Pero aparece un cuadro de diálogo de impresión, ¿cómo puedo imprimir sin el cuadro de diálogo Imprimir?

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

¿Hay alguna otra forma de imprimir esto sin mostrar el cuadro de diálogo de impresión?

Actualización: en respuesta a esto :

Pero ya he usado esta clase, pero cuando llamo al

axW.ExecWB(SHDocVw.OLECMDID.OLECMDID_PRINT,SHDocVw.OLECMDEXECOPT.OLECMDEXECOPT_PROMPTUSER , ref em, ref em);

Mi programa se bloquea aquí cuando estoy usando el servicio de ventanas, pero funciona bien desde la aplicación de Windows.


Desde este sitio http://www.ussbd.com/printhtm.html

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

Ahora agrega el código en su proyecto para imprimir la página html desde su texto fuente:

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

Si desea imprimir sin el cuadro de diálogo Imprimir, utilice la siguiente línea:

hpObj.PrintHtml(txtString.Text, false);


Puede usar la clase PrintDocument en el espacio de nombres System.Drawing.Printing para tener más control sobre la impresión, consulte aquí para obtener más información.

Por ejemplo, puede hacer lo siguiente:

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

Luego se genera una función para cada página que se imprimirá y se le asigna un área de Gráficos para dibujar a

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

Esto requiere que maneje el dibujo real del texto / imagen en la página, consulte aquí para obtener más información.


Primero, aquí está el código:

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. Puede acceder al espacio de nombres SHDocVw agregando una referencia a ''Microsoft Internet Controls'', que se encuentra en la pestaña COM del cuadro de diálogo Agregar referencia.
  2. Se puede encontrar más información sobre el objeto InternetExplorer en MSDN .
  3. El método Navigate () cargará el archivo HTML. Los otros parámetros le permiten especificar parámetros opcionales, como indicadores y encabezados.
  4. No podemos imprimir hasta que el documento esté cargado. Aquí, ingreso un ciclo esperando hasta que se llame al evento DocumentComplete, sobre el cual se establece un indicador que nos notifica que la navegación se ha completado. Tenga en cuenta que se llama a DocumentComplete cada vez que finaliza la navegación, en caso de éxito o fracaso.
  5. Una vez que se establece el indicador documentLoaded, se consulta el estado de impresión a través de QueryStatusWB () hasta que se habilite la impresión.
  6. La impresión se inicia con la llamada ExecWB (). Se OLECMDID_PRINT comando OLECMDID_PRINT junto con la opción OLECMDEXECOPT_DONTPROMPTUSER para imprimir automáticamente sin interacción del usuario. Una nota importante es que esto se imprimirá en la impresora predeterminada. Para especificar una impresora, deberá configurar la impresora predeterminada (en el código, puede llamar a SetDefaultPrinter () ). Los dos parámetros finales permiten parámetros de entrada y salida opcionales.
  7. No queremos salir hasta que la impresión esté completa, por lo que una vez más se ingresa un ciclo. Después de que se desencadena el evento PrintTemplateTeardown, se establece el indicador documentPrinted. Los objetos pueden ser limpiados.

Aquí hay otra forma de imprimir sin un cuadro de diálogo de impresión. Usted crea un objeto PrintDialog, lo inicializa y luego llama al método Print ().

La función siguiente se utiliza para imprimir una pequeña etiqueta de código de barras de 2 "x0.75". Tendrá que encontrar la manera de obtener un objeto de Document desde el archivo 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"); } }


OLECMDEXECOPT_PROMPTUSER parece forzar un aviso al usuario para seleccionar la impresora y todo lo relacionado, lo cual estoy bastante seguro de que no está permitido desde un servicio. ¿Alguien puede verificar esto?