2010-10-14 4 views
8

Je cherche un moyen d'imprimer un fichier html formaté en mode paysage dans C# (principalement wpf). Imprimer la boîte de dialogue serait bien pour définir le paramètre de la page en mode paysage. J'ai essayé d'utiliser le convertisseur html en xaml de Microsoft et il a détruit le formatage. Je trouve assez incroyable qu'il n'y ait pas de méthode ou de saisir un fichier et d'envoyer directement à une imprimante.Impression d'une page HTML formatée en C#

Toutes les idées seraient grandement appréciées.

Répondre

2

Il me semble que la meilleure façon de procéder est de choisir d'abord le moteur de rendu HTML et d'y chercher un support d'impression. Il n'existe aucun moyen "standard" pour imprimer un document HTML, quel que soit le langage, le système d'exploitation ou le framework.

9

Vous pouvez accéder à la méthode Print() de la classe WebBrowser, en C# pour cela. Ce qui est cool, c'est que vous n'avez pas besoin d'afficher WebBrowser n'importe où dans votre application. Il suffit simplement de nourrir le contenu du contrôle WebBrowser comme ceci:

webBrowser1.DocumentContent = openfiledialog.FileName;

Et puis il suffit d'appeler la méthode webBrowser1.Print();. Voici une référence MSDN:

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

Hope this helps.

+0

Vous devez noter que cela est uniquement pris en charge par le contrôle Windows Forms WebBrowser, pas celui de WPF. – ygoe

1

Peut-être quelque chose comme:

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

Fonctionne comme un charme! –

+0

Ce code est évidemment pour Windows Forms au lieu de WPF. Le contrôle WPF WebBrowser ne prend pas en charge cela (il ne peut pas imprimer). – ygoe

4

Pendant de nombreuses années, nous avons utilisé le contrôle WebBrowser .net comme indiqué dans d'autres réponses, mais plus récemment que le contrôle est devenu de plus en plus instable. Même en reconstruisant la machine que nous utilisons pour imprimer nos feuilles de sélection dans l'entrepôt pour exécuter Windows 10, nous avons toujours des problèmes avec les pages qui ne s'impriment jamais jusqu'à ce que nous redémarrions l'ordinateur. Le même code nous a bien servi pendant 4 ans et plus, mais il semble maintenant que les récentes mises à jour de Microsoft ont rendu ce contrôle encore plus bogué que par le passé.

L'autre problème majeur est qu'il n'existe aucun moyen facile d'imprimer sur une imprimante autre que celle définie par défaut pour Internet Explorer. Par conséquent, si vous souhaitez imprimer sur différentes imprimantes, vous n'aurez pas vraiment de chance.

Il y a plusieurs années, nous avons écrit une version de notre code d'impression pour les bordereaux d'emballage en utilisant C++ et la bibliothèque QtWebKit. Donc, pour résoudre ces problèmes, j'ai déterré l'ancienne application C++ qui imprime les fichiers de pages Web et l'a transformée en projet pour imprimer via la ligne de commande, et l'a permis d'imprimer sur différentes imprimantes.

Vous pouvez obtenir le code source ici:

https://github.com/kendallb/PrintHtml

et vous pouvez télécharger une pré-compilé pour Windows en utilisant MinGW binaire 32 bits d'ici:

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

Le code est entièrement portable de sorte que vous pouvez facilement le compiler pour s'exécuter sur macOS ou Linux si vous le souhaitez à partir du code source.

La ligne de commande est assez facile à utiliser et l'utilisation est ci-dessous:

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. 

Il est évident que d'utiliser ce à partir d'une application .NET, vous aurez besoin pour se reproduire sur la ligne de commande, mais qui est assez facile faire. En supposant que le programme PrintHtml.exe est dans le répertoire bin pour votre application ou d'un site Web, vous pouvez l'exécuter à partir .net comme ceci:

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

Pour vous remercier je dois passer une journée à gagner +50 de réputation: D. Tu m'as sauvé la vie. – huydq5000