2009-01-07 19 views
14

Estoy usando un servicio de Windows y quiero imprimir una página .html cuando se inicie 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?Imprimir documento html desde el Servicio de Windows sin imprimir el cuadro de diálogo

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

Tiene alguna otra forma de imprimir esto sin mostrar el cuadro de diálogo de impresión.


Actualización: en respuesta a this:

pero ya he utilizado esta clase, pero cuando me llamo la

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

Mi programa de bloque de conseguir aquí cuando estoy usando desde servicio de ventana, pero funciona bien desde la aplicación de Windows.

Respuesta

1

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

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

Ahora se agrega el código en su proyecto para imprimir página HTML de su texto original:

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

Si desea imprimir sin el diálogo de impresión a continuación, utilizar la siguiente línea:

hpObj.PrintHtml(txtString.Text, false); 
+0

No estoy seguro de que esto funcione. La aplicación de muestra (que también se publicó en Code Project) muestra el cuadro de diálogo de la impresora al hacer clic en "Imprimir URL directamente", y en el caso de las impresoras "imprimir en archivo" como el Microsoft XPS Document Writer, el "guardar archivo como "diálogo". En el caso de "Imprimir URL desde el navegador", solo aparece el "archivo guardado como diálogo" para el MXDW. –

0

OLECMDEXECOPT_PROMPTUSER parece forzar un aviso para que el usuario seleccione la impresora y todas las cosas asociadas, lo cual estoy bastante seguro de que no está permitido desde un servicio. ¿Alguien puede verificar esto?

1

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

Usted puede utilizar la clase PrintDocument en el espacio de nombres System.Drawing.Printing para darle más control sobre la impresión, consulte here 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(); 
} 

A continuación, se eleva una función para cada página que se imprimirá y se le da 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 usted maneja el dibujo real en el texto/imagen a la página, vea here para más información.

15

En primer lugar, 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. Se puede acceder al espacio de nombres SHDocVw mediante la adición de una referencia a 'Microsoft Internet Controls', que se encuentra en la ficha COM del cuadro de diálogo Agregar referencia.
  2. Más información sobre el objeto InternetExplorer se puede encontrar 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 se cargue el documento. 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, tras un error o.
  5. Una vez que se establece el indicador documentLoaded, se consulta el estado de impresión mediante QueryStatusWB() hasta que se habilite la impresión.
  6. La impresión se inicia con la llamada ExecWB(). Se especifica el 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 al SetDefaultPrinter()). Los dos parámetros finales permiten parámetros de entrada y salida opcionales.
  7. No queremos salir hasta que se complete la impresión, por lo que una vez más se ingresa un bucle. Después de que se desencadena el evento PrintTemplateTeardown, se establece el indicador documentPrinted. Los objetos pueden ser limpiados.
+1

¿Hay alguna manera de modificar esto para imprimir en orientación horizontal? – SeaDrive

+1

Utilizándolo en Windows 8.1, IE11 obtuvo este error: el objeto invocado se ha desconectado de sus clientes. (Excepción de HRESULT: 0x80010108 (RPC_E_DISCONNECTED)) –

+0

@seaDrive, ¿Recibió la respuesta para cambiar la propiedad de Orientación a través del código? por favor comparte la respuesta – SaddamBinSyed

Cuestiones relacionadas