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!
Si noti che questo è supportato solo dal controllo WebBrowser di Windows Form, non da quello di WPF. – ygoe