2009-04-03 13 views
13

Finalmente descubrí how to print transformed XML sin preguntar al usuario o mostrar una ventana de IE, pero ahora necesito especificar un número de copias y posiblemente otras configuraciones de impresora.¿Cómo cambio programáticamente la configuración de la impresora con el control WebBrowser?

¿Hay alguna forma de cambiar programáticamente la configuración de la impresora en un control WebBrowser?

El código en cuestión:

private static void PrintReport(string reportFilename) 
{ 
    WebBrowser browser = new WebBrowser(); 

    browser.DocumentCompleted += browser_DocumentCompleted; 

    browser.Navigate(reportFilename); 
} 

private static void browser_DocumentCompleted 
    (object sender, WebBrowserDocumentCompletedEventArgs e) 
{ 
    WebBrowser browser = sender as WebBrowser; 

    if (null == browser) 
    { 
     return; 
    } 

    browser.Print(); 

    browser.Dispose(); 
} 

Respuesta

12

El único método que he tenido éxito con es modificar el registro sobre la marcha (y cambiar de nuevo para no afectar a cualquier otra cosa).

Puede encontrar la configuración que necesita en "Software \ Microsoft \ Internet Explorer \ PageSetup" en CurrentUser.

Para cambiar la impresora, puede utilizar esto:

using System.Management 

public static bool SetDefaultPrinter(string defaultPrinter) 
{ 
    using (ManagementObjectSearcher objectSearcher = new ManagementObjectSearcher("SELECT * FROM Win32_Printer")) 
    { 
     using (ManagementObjectCollection objectCollection = objectSearcher.Get()) 
     { 
      foreach (ManagementObject mo in objectCollection) 
      { 
       if (string.Compare(mo["Name"].ToString(), defaultPrinter, true) == 0) 
       { 
        mo.InvokeMethod("SetDefaultPrinter", null, null); 
        return true; 
       } 
      } 
     } 
    } 
    return false; 
} 


En cuanto al número de copias, siempre se puede poner el WebBrowser.Print en un bucle while.

+0

Cualquier problema con este enfoque si los usuarios están bloqueados hacia abajo no-Administradores? ¿Qué claves de registro necesito establecer? –

+0

Siempre que el usuario pueda cambiar la configuración en el cuadro de diálogo Configurar página, puede editar la configuración del registro sobre la marcha. Buscaré las claves y las pondré en mi respuesta. –

+0

¿Hay alguna manera de cambiar el nombre de la impresora o el número de copias a través de ese método? Eso es lo que realmente necesito hacer, pero las claves de registro solo tienen encabezado, pie de página y márgenes. Si no, voy a seguir adelante y aceptar su respuesta y obligar a los usuarios a simplemente elegir su maldita impresora y número de copias. –

2

necesita cambiar la configuración del registro a través del código para cambiar la configuración de Internet Explorer o el control del navegador web. revise el enlace a continuación, describe cómo hacerlo, también si hay más opciones que necesita alterar usando el registro, luego use regedit.exe para encontrar qué otras claves tiene Internet Explorer.

http://support.microsoft.com/kb/236777

ps: debe tener en cuenta que cualquier cambio que realice a través de su código de configuración del registro de explorador de Internet persistirán en su cuenta de sistema/usuario.

+0

Esa página de MSDN es atroz. No muestra los valores reales para esas claves de registro. También lo que allí se afirma evidentemente no es del todo cierto. Hay una manera de hacerlo (algo) sin cambiarlo en la escala global: https://support.microsoft.com/en-us/kb/267240 – c00000fd

0

Esto funcionó bien para mí, sin embargo estoy en .NET 3,5

this.webBrowser1.ShowPrintDialog(); 
+2

Eso funcionará, también, pero para lo que necesitaba Hace 3 años, tenía que ser completamente programático, sin interacción del usuario. La parte graciosa fue cuando pasé meses escribiendo todo el código para hacer la impresión del informe, y luego los superiores decidieron que la impresión no debería permitirse, solo ver. –

2
  string strKey = "Software\\Microsoft\\Internet Explorer\\PageSetup"; 
     bool bolWritable = true; 

     RegistryKey oKey = Registry.CurrentUser.OpenSubKey(strKey, bolWritable); 
     Console.Write(strKey); 

     if (stringToPrint.Contains("Nalog%20za%20sluzbeno%20putovanje_files")) 
     { 
      oKey.SetValue("margin_bottom", 15); 
      oKey.SetValue("margin_top", 0.19); 
     } 
     else 
     { 
      //Return onld walue 
      oKey.SetValue("margin_bottom", 0.75); 
      oKey.SetValue("margin_top", 0.75); 
     } 
+0

¿Puede mostrar cómo modificar el número de copias para imprimir (según los requisitos del OP)? –

Cuestiones relacionadas