2010-10-14 29 views
8

Sto cercando un modo per stampare un file html formattato in modalità orizzontale in C# (principalmente wpf). La finestra di dialogo Stampa sarebbe utile per impostare l'impostazione della pagina su orizzontale. Ho provato ad usare il convertitore da html a xaml di Microsoft e ha distrutto la formattazione. Trovo abbastanza sorprendente che non vi sia alcun metodo o afferrare un file e inviare direttamente a una stampante.Stampa di una pagina HTML formattata in C#

Qualsiasi idea sarebbe molto apprezzata.

risposta

2

Mi sembra che il modo migliore in cui vorreste andare sia selezionare prima il motore di rendering HTML e cercare il supporto per la stampa. Non esiste un modo "standard" per stampare un documento HTML indipendentemente dalla lingua, dal sistema operativo o dal framework.

9

È possibile accedere al metodo Print() della classe WebBrowser, in C# per farlo. La cosa interessante è che non è necessario visualizzare effettivamente il WebBrowser in qualsiasi punto dell'applicazione. Basta semplicemente alimentare il contenuto al controllo WebBrowser in questo modo:

webBrowser1.DocumentContent = openfiledialog.FileName;

E poi basta chiamare il metodo webBrowser1.Print();. Ecco un riferimento MSDN:

http://msdn.microsoft.com/en-us/library/system.windows.forms.webbrowser.print.aspx

Spero che questo aiuti.

+0

Si noti che questo è supportato solo dal controllo WebBrowser di Windows Form, non da quello di WPF. – ygoe

1

Forse qualcosa di simile:

webBrowser1.DocumentContent = YOUR_FILE_NAME; 
mshtml.IHTMLDocument2 doc = webBrowser1.Document as mshtml.IHTMLDocument2; 
doc.execCommand("Print", true, null); 
11
WebBrowser myWebBrowser = new WebBrowser(); 
     private void Form1_Load(object sender, EventArgs e) 
     { 
      myWebBrowser.DocumentCompleted += myWebBrowser_DocumentCompleted; 
      myWebBrowser.DocumentText =System .IO.File .ReadAllText (@"C:\a.htm"); 
     } 

     private void myWebBrowser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) 
     { 
      myWebBrowser.Print(); 
     } 
+0

Funziona come un fascino! –

+0

Questo codice è ovviamente per Windows Form invece che per WPF. Il controllo WebBrowser di WPF non supporta questo (non può stampare). – ygoe

4

Per molti anni abbiamo utilizzato il controllo WebBrowser .net come descritto in altre risposte, ma più di recente che il controllo è diventato sempre più instabile. Anche ricostruendo la macchina che usiamo per stampare i fogli di prelievo nel magazzino per eseguire Windows 10, abbiamo ancora problemi con le pagine semplicemente non stampando fino al riavvio del computer. Lo stesso codice ci è stato utile per oltre 4 anni, ma ora sembra che gli aggiornamenti recenti di Microsoft abbiano reso questo controllo ancora più problematico di quanto non fosse in passato.

L'altro problema importante è che non esiste un modo semplice per stampare su una stampante diversa dal set predefinito per Internet Explorer, quindi se si desidera stampare su stampanti diverse, si è praticamente sfortunati con quel controllo.

Molti anni fa abbiamo scritto una versione del nostro codice di stampa per il confezionamento degli slittamenti utilizzando C++ e la libreria QtWebKit. Quindi, per risolvere questi problemi, ho scovato la vecchia applicazione C++ che stampava i file delle pagine Web e l'ho trasformato in questo progetto per stampare tramite la riga di comando e abilitato per stampare su diverse stampanti.

È possibile ottenere il codice sorgente per qui:

https://github.com/kendallb/PrintHtml

e si può scaricare a 32-bit binario pre-compilato per Windows usando MinGW da qui:

https://github.com/kendallb/PrintHtml/blob/master/deploy/PrintHtml-window-x86.zip?raw=true

Il codice è completamente portatile in modo da poterlo compilare facilmente su MacOS o Linux, se desiderato dal codice sorgente.

La riga di comando è piuttosto facile da usare e l'utilizzo è inferiore:

Usage: PrintHtml [-test] [-p printer] [-l left] [-t top] [-r right] [-b bottom] <url> [url2] 

-test   - Don't print, just show what would have printed. 
-p printer - Printer to print to. Use 'Default' for default printer. 
-l left  - Optional left margin for page. 
-t top  - Optional top margin for page. 
-r right  - Optional right margin for page. 
-b bottom  - Optional bottom margin for page. 
url   - Defines the list of URLs to print, one after the other. 

Ovviamente per utilizzare questo da un'applicazione .NET è necessario per deporre le uova sulla linea di comando, ma che è abbastanza facile fare. Supponendo che il programma PrintHtml.exe si trova nella directory bin per l'applicazione o sito web, è possibile eseguirlo da .net in questo modo:

public bool PrintHtmlPages(
    string printer, 
    List<string> urls) 
{ 
    try { 
     // Spawn the code to print the packing slips 
     var info = new ProcessStartInfo(); 
     info.Arguments = $"-p \"{printer}\" \"{string.Join("\" \"", urls)}\""; 
     var pathToExe = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); 
     info.FileName = Path.Combine(pathToExe, "PrintHtml.exe"); 
     using (var p = Process.Start(info)) { 
      // Wait until it is finished 
      while (!p.HasExited) { 
       Application.DoEvents(); 
       System.Threading.Thread.Sleep(10); 
      } 

      // Return the exit code 
      return p.ExitCode == 0; 
     } 
    } catch { 
     return false; 
    } 
} 

Enjoy!

+0

Per ringraziarti devo passare un giorno per guadagnare +50 reputazioni: D. Mi hai salvato la vita. – huydq5000

Problemi correlati