2010-10-14 39 views
8

我正在尋找一種在c#(主要是wpf)中以橫向模式打印格式化html文件的方法。打印對話框將很好,以便將頁面設置設置爲橫向。我試圖使用微軟的HTML到XAML轉換器,它破壞了格式。我覺得很奇妙,沒有辦法或者抓取文件並直接發送到打印機。在C#中打印格式化的HTML頁面

任何想法將不勝感激。

回答

2

聽起來對我來說,想要走的最佳方式是首先選擇HTML渲染引擎並將其用於打印支持。不管語言,操作系統或框架如何,打印HTML文檔都沒有「標準」方法。

9

您可以使用C#訪問WebBrowser類的Print()方法來執行此操作。很酷的是,你不需要在應用程序的任何地方實際顯示WebBrowser。只需簡單地喂內容到WebBrowser控件,像這樣:

webBrowser1.DocumentContent = openfiledialog.FileName;

然後只需調用webBrowser1.Print();方法。下面是一個MSDN參考:

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

希望這有助於。

+0

您應該注意,這僅受Windows窗體WebBrowser控件支持,而不受WPF支持。 – ygoe 2016-10-12 13:30:38

1

也許是這樣的:

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

工程就像一個魅力! – 2014-10-20 02:29:29

+0

這段代碼顯然是用於Windows窗體而不是WPF。 WPF WebBrowser控件不支持這個(它不能打印)。 – ygoe 2016-10-12 13:31:46

4

對於我們使用了.NET WebBrowser控件在其他的答案中概述,但最近控制已經變得越來越不穩定多年。即使重建我們用於在倉庫中打印選擇表以運行Windows 10的機器,我們仍然存在頁面問題,直到我們重新啓動計算機後纔會打印。相同的代碼爲我們提供了4年以上的服務,但現在看來微軟最近的更新使得這種控制方式比過去更加麻煩。

另一個主要問題是沒有簡單的方法來打印到Internet Explorer的默認設置以外的打印機,所以如果您希望打印到不同的打印機,那麼對於該控件而言,您幾乎沒有運氣。

很多年前,我們用C++和QtWebKit庫編寫了打包代碼打印代碼的版本。因此,爲了解決這些問題,我挖掘了打印網頁文件的舊C++應用程序,並將其轉化爲此項目以通過命令行進行打印,並使其能夠打印到不同的打印機。

你可以得到源代碼在這裏:

https://github.com/kendallb/PrintHtml

,你可以下載一個32位二進制預編譯的Windows使用MinGW的從這裏開始:

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

代碼是完全可移植的,所以如果需要,您可以輕鬆地將它編譯爲在macOS或Linux上運行。

的命令行是很容易使用和下面的用法是:

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. 

顯然從.NET應用程序,您將需要生成它的命令行中使用這一點,但這是很容易去做。假設PrintHtml.exe程序的bin目錄爲你的應用程序或網站,你可以像這樣從.NET運行:

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

享受!

+0

要多謝你,我必須花一天時間來獲得+50名聲譽:D。你救了我的命。 – huydq5000 2017-07-14 04:49:20