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 progtwig se bloquea aquí cuando estoy usando el servicio de ventanas, pero funciona bien desde la aplicación de Windows.
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(); } } }
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. 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);
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"); } }
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.
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?