Come stampare una pagina html senza far apparire la finestra di selezione della stampante?
La soluzione che ho adottato comporta l'inclusione dell'activeX di Internet Explorer nel codice (Componente COM Microsoft Web Browser). Altre soluzioni fanno sempre apparire quella dannata printer dialog.
Siccome l'html viene generato dinamicamente navigo sull'about:blank:
Object n = System.Reflection.Missing.Value;
axWebBrowser1.Navigate("about:blank", ref n, ref n, ref n, ref n);
Sull'evento NavigateComplete2 vado ad iniettare l'html dentro l'oggetto:
private void axWebBrowser1_NavigateComplete2(object sender
, AxSHDocVw.DWebBrowserEvents2_NavigateComplete2Event e)
{
object[] psa = {this.Html}; // Variabile Stringa che contiene l'html
mshtml.IHTMLDocument2 hDoc2 = (mshtml.IHTMLDocument2)axWebBrowser1.Document;
hDoc2.clear(); // Pulisco la pagina
hDoc2.write(psa); // Scrivo il contenuto
hDoc2.close(); // Chiudo la pagina
}
A questo punto chiamo il seguente metodo per stampare la pagina senza richiesta di selezione da parte dell'utente (stampante di default). Il terzo parametro della ExecWB serve per far si che il thread resti in attesa fino a completamento della stampa, in questo modo siamo certi che all'uscita da questo metodo l'oggetto è eliminabile senza problemi perchè ha completato il suo lavoro:
public void Print()
{
Object o = System.Reflection.Missing.Value;
short flag = 0x02;
object printWait = (object)flag;
int stat = 0;
int enabled = 0;
enabled = ((int)SHDocVw.OLECMDF.OLECMDF_ENABLED
+ (int)SHDocVw.OLECMDF.OLECMDF_SUPPORTED);
// Attendo che il servizio richiesto sia disponibile
do
{
Application.DoEvents();
stat = (int)axWebBrowser1.QueryStatusWB(SHDocVw.OLECMDID.OLECMDID_PRINT);
} while(stat != enabled);
axWebBrowser1.ExecWB(SHDocVw.OLECMDID.OLECMDID_PRINT
, SHDocVw.OLECMDEXECOPT.OLECMDEXECOPT_DONTPROMPTUSER
, ref printWait
, ref o);
}
that's all folks
powered by IMHO 1.2 with Emoticon Formatter