Stampa il documento html da Windows Service senza finestra di dialogo di stampa

Sto usando un servizio di Windows e voglio stampare una pagina .html all’avvio del servizio. Sto usando questo codice e sta stampando bene. Ma viene una finestra di dialogo di stampa, come posso stampare senza la finestra di dialogo di stampa?

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

C’è un altro modo per stampare questo senza mostrare la finestra di dialogo di stampa.


Aggiornamento: in risposta a questo :

Ma ho già usato questa class, ma quando sto chiamando il

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

Il mio programma si blocca qui quando sto usando dal servizio di Windows, ma sta funzionando bene dall’applicazione Windows.

Prima di tutto, ecco il codice:

 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. È ansible accedere allo spazio dei nomi SHDocVw aggiungendo un riferimento a “Microsoft Internet Controls”, disponibile nella scheda COM della finestra di dialogo Aggiungi riferimento.
  2. Ulteriori informazioni sull’object InternetExplorer sono disponibili su MSDN .
  3. Il metodo Navigate () caricherà il file HTML. Gli altri parametri consentono di specificare parametri opzionali, come flag e intestazioni.
  4. Non possiamo stampare fino a quando il documento non viene caricato. Qui, inserisco un ciclo in attesa che venga chiamato l’evento DocumentComplete, sul quale viene impostato un flag che ci informa che la navigazione è stata completata. Nota che DocumentComplete viene chiamato ogni volta che la navigazione è finita, in caso di successo o fallimento.
  5. Una volta impostato il flag documentLoaded, lo stato di stampa viene interrogato tramite QueryStatusWB () fino a quando la stampa non è abilitata.
  6. La stampa inizia con la chiamata ExecWB (). Viene specificato il comando OLECMDID_PRINT insieme all’opzione OLECMDEXECOPT_DONTPROMPTUSER per stampare automaticamente senza interazione dell’utente. Una nota importante è che verrà stampato sulla stampante predefinita. Per specificare una stampante, è necessario impostare la stampante predefinita (nel codice, è ansible chiamare SetDefaultPrinter () ). I due parametri finali consentono parametri di input e output opzionali.
  7. Non vogliamo uscire finché la stampa non è completa, quindi ancora una volta viene inserito un ciclo. Dopo l’triggerszione dell’evento PrintTemplateTeardown, viene impostato il flag di documento stampato. Gli oggetti possono quindi essere ripuliti.

Da questo sito http://www.ussbd.com/printhtm.html

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

Ora aggiungi il codice nel tuo progetto per stampare la pagina html dal suo testo sorgente:

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

Se si desidera stampare senza la finestra di dialogo di stampa, utilizzare la seguente riga:

 hpObj.PrintHtml(txtString.Text, false); 

Ecco un altro modo per stampare senza una finestra di dialogo di stampa. Si crea un object PrintDialog, lo si inizializza e quindi si chiama il metodo Print ().

La funzione seguente viene utilizzata per stampare una piccola etichetta con codice a barre da 2 “x0.75”. Dovrai trovare un modo per ottenere un object Document dal file 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"); } } 

È ansible utilizzare la class PrintDocument nello spazio dei nomi System.Drawing.Printing per avere un maggiore controllo sulla stampa, vedere qui per maggiori informazioni.

Ad esempio puoi fare quanto segue:

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

Quindi viene aumentata una funzione per ogni pagina da stampare e viene assegnata un’area grafica a cui attingere

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

Questo richiede che tu gestisca il disegno reale sul testo / immagine sulla pagina, vedi qui per maggiori informazioni.

OLECMDEXECOPT_PROMPTUSER sembra forzare una richiesta all’utente di selezionare la stampante e tutti gli elementi associati, che sono abbastanza sicuro non è consentito da un servizio. Qualcuno può verificare questo?