2010-10-14 34 views
8

Tôi đang tìm cách in tệp html được định dạng ở chế độ ngang trong C# (chủ yếu là wpf). Hộp thoại in sẽ đẹp để thiết lập cài đặt trang thành ngang. Tôi đã cố gắng sử dụng html của Microsoft để chuyển đổi xaml và nó bị phá hủy định dạng. Tôi tìm thấy nó khá tuyệt vời mà không có phương pháp hoặc lấy một tập tin và gửi trực tiếp đến một máy in.In trang HTML được định dạng trong C#

Bất kỳ ý tưởng nào cũng sẽ được đánh giá cao.

Trả lời

2

Nghe có vẻ như tôi là cách tốt nhất bạn muốn đi đầu tiên là chọn công cụ hiển thị HTML và tìm đến nó để được hỗ trợ in. Không có cách "chuẩn" để in tài liệu HTML bất kể ngôn ngữ, hệ điều hành hoặc khung công tác.

9

Bạn có thể truy cập phương thức Print() của Lớp WebBrowser, trong C# để thực hiện việc này. Điều thú vị là bạn không cần phải hiển thị WebBrowser ở bất cứ đâu trong ứng dụng của bạn. Chỉ đơn giản là ăn các nội dung vào Control WebBrowser như vậy:

webBrowser1.DocumentContent = openfiledialog.FileName;

Và sau đó chỉ cần gọi phương thức webBrowser1.Print();. Đây là tài liệu tham khảo MSDN:

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

Hy vọng điều này sẽ hữu ích.

+0

Bạn nên lưu ý rằng điều này chỉ được hỗ trợ bởi điều khiển Windows Forms WebBrowser, không phải điều khiển từ WPF. – ygoe

1

Có lẽ cái gì đó như:

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

Hoạt động như một sự quyến rũ! –

+0

Mã này rõ ràng là dành cho Windows Forms thay vì WPF. Điều khiển WPB WebBrowser không hỗ trợ điều này (nó không thể in). – ygoe

4

Trong nhiều năm chúng tôi sử dụng kiểm soát WebBrowser .net như được nêu trong câu trả lời khác, tuy nhiên thời gian gần đây hơn là kiểm soát đã ngày càng trở nên không ổn định hơn. Ngay cả việc xây dựng lại máy chúng tôi sử dụng để in tờ chọn của chúng tôi trong kho để chạy Windows 10, chúng tôi vẫn gặp sự cố với các trang đơn giản là không bao giờ in cho đến khi chúng tôi khởi động lại máy tính. Cùng một mã đã phục vụ chúng tôi tốt trong hơn 4 năm nhưng bây giờ nó xuất hiện các bản cập nhật gần đây từ Microsoft đã làm cho kiểm soát này thậm chí còn nhiều lỗi hơn so với trước đây.

Vấn đề chính khác là không có cách dễ dàng để in sang máy in khác với thiết lập mặc định cho Internet Explorer, vì vậy nếu bạn muốn in với các máy in khác nhau, bạn sẽ không may mắn với điều khiển đó.

Nhiều năm trước, chúng tôi đã viết một phiên bản mã in của chúng tôi để đóng gói phiếu bằng cách sử dụng C++ và thư viện QtWebKit. Vì vậy, để giải quyết những vấn đề này tôi đào lên ứng dụng C++ cũ đã in các tệp trang web và biến nó thành dự án này để in qua dòng lệnh và cho phép nó in ra các máy in khác nhau.

Bạn có thể lấy mã nguồn cho nó ở đây:

https://github.com/kendallb/PrintHtml

và bạn có thể tải về một phiên bản 32-bit nhị phân trước biên soạn dành cho Windows sử dụng MinGW từ đây:

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

Mã hoàn toàn di động, do đó bạn có thể dễ dàng biên dịch mã chạy trên macOS hoặc Linux nếu muốn từ mã nguồn.

Các dòng lệnh là khá dễ sử dụng và việc sử dụng là dưới đây:

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. 

Rõ ràng sử dụng điều này từ một ứng dụng .net bạn sẽ cần phải đẻ trứng nó trên dòng lệnh, nhưng đó là khá dễ dàng làm. Giả sử chương trình PrintHtml.exe nằm trong thư mục bin cho ứng dụng hoặc trang web của bạn, bạn có thể chạy nó từ .net như vậy:

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

Tận hưởng!

+0

Để cảm ơn bạn, tôi phải dành một ngày để đạt được +50 danh tiếng: D. Bạn đã cứu cuộc đời tôi. – huydq5000

Các vấn đề liên quan