2008-08-01 19 views
66

Tôi muốn in HTML từ dịch vụ web C#. Kiểm soát trình duyệt web là quá mức cần thiết và không hoạt động tốt trong môi trường dịch vụ, cũng như không hoạt động tốt trên hệ thống có các ràng buộc bảo mật rất chặt chẽ. Có bất kỳ loại thư viện nào miễn phí .NET để hỗ trợ in một trang HTML cơ bản không? Đây là mã tôi có cho đến nay, mà không chạy đúng cách.Làm cách nào để in tài liệu HTML từ dịch vụ web?

public void PrintThing(string document) 
{ 
    if (Thread.CurrentThread.GetApartmentState() != ApartmentState.STA) 
    { 
     Thread thread = 
      new Thread((ThreadStart) delegate { PrintDocument(document); }); 
     thread.SetApartmentState(ApartmentState.STA); 
     thread.Start(); 
    } 
    else 
    { 
     PrintDocument(document); 
    } 
} 

protected void PrintDocument(string document) 
{ 
    WebBrowser browser = new WebBrowser(); 
    browser.DocumentText = document; 
    while (browser.ReadyState != WebBrowserReadyState.Complete) 
    { 
     Application.DoEvents(); 
    } 
    browser.Print(); 
} 

này hoạt động tốt khi gọi từ chủ đề giao diện người dùng kiểu, nhưng không có gì xảy ra khi gọi từ một sợi dịch vụ-type. Thay đổi Print() để ShowPrintPreviewDialog() mang lại kịch bản IE lỗi sau:

Error: 'dialogArguments.___IE_PrintType' is null or not an object
URL: res://ieframe.dll/preview.dlg

Và một hộp thoại xem trước khi in nhỏ trống rỗng xuất hiện.

+0

Vui lòng chọn câu trả lời tốt nhất, cảm ơn. – mruanova

+0

@mruanova Không có câu trả lời nào làm việc cuối cùng tôi đã thử chúng. Nếu bạn có một cái gì đó hoạt động cho chúng tôi biết. –

Trả lời

3

Tôi biết rằng chính Visual Studio (ít nhất là trong phiên bản 2003) tham chiếu dll IE trực tiếp để hiển thị "Design View".

Có thể đáng xem xét điều đó.

Nếu không, tôi không thể nghĩ ra bất kỳ điều gì ngoài kiểm soát Trình duyệt web.

28

Bạn có thể in từ dòng lệnh bằng cách sử dụng sau đây:

rundll32.exe %WINDIR%\System32\mshtml.dll,PrintHTML "%1"

đâu% 1 là đường dẫn tập tin của tập tin html được in.

Nếu bạn không cần phải in từ bộ nhớ (hoặc có thể đủ khả năng để ghi vào đĩa trong một tập tin temp), bạn có thể sử dụng:

using (Process printProcess = new Process()) 
{ 
    string systemPath = Environment.GetFolderPath(Environment.SpecialFolder.System); 
    printProcess.StartInfo.FileName = systemPath + @"\rundll32.exe"; 
    printProcess.StartInfo.Arguments = systemPath + @"\mshtml.dll,PrintHTML """ + fileToPrint + @""""; 
    printProcess.Start(); 
} 

N.B. Điều này chỉ hoạt động trên Windows 2000 trở lên tôi nghĩ.

+0

Câu trả lời hay - sẽ đánh dấu nó được chấp nhận và chạy thử nghiệm của tôi. Dường như dll vẫn bật lên hộp thoại Print, và vì điều này là để chạy như một dịch vụ Windows không giám sát, chúng ta cần phải bỏ qua bằng cách nào đó. Tôi đã kiệt sức với Google, và tôi đã kết thúc trí thông minh của mình. –

+0

Rất tiếc, hộp thoại máy in xuất hiện. Tôi đã thử nghiệm trên Windows 7 x64. – LukTar

-1

Tôi không biết các công cụ cụ thể, nhưng có một số tiện ích ghi lại/phát lại nhấp chuột. Nói cách khác, bạn có thể tự động hóa "bấm" trên hộp thoại in. (Tôi biết đây là một hack, nhưng khi tất cả những người khác thất bại ...)

0

Có lẽ điều này sẽ giúp ích. http://www.codeproject.com/KB/printing/printhml.aspx Cũng không chắc chắn bạn đang cố gắng truy cập vào điều khiển trình duyệt nào, nhưng cần phải là STA

Lưu ý - Dự án được đề cập trong liên kết cho phép bạn điều hướng đến một trang và thực hiện in mà không hiển thị hộp thoại in.

3

Nếu bạn đã có trong ngân sách (~ $ 3000), hãy xem PrinceXML.

Nó sẽ hiển thị HTML thành PDF, hoạt động tốt trong môi trường dịch vụ và hỗ trợ các tính năng nâng cao như không phá vỡ trang ở giữa ô bảng (rất nhiều trình duyệt hiện không hỗ trợ).

3

Dễ dàng! Tách vấn đề của bạn thành hai phần đơn giản hơn:

  1. render the HTML to PDF
  2. in PDF (SumatraPDF)
  • -print-to-default $file.pdf prints a PDF file on a default printer
  • -print-to $printer_name $file.pdf prints a PDF on a given printer
+0

Cuối cùng tôi đã kiểm tra, phần 2 (in qua dòng lệnh với Adobe) không hoạt động trong một dịch vụ - nó đòi hỏi sự tương tác của người dùng. –

+1

Hãy thử Sumatra PDF nhanh hơn rất nhiều http://blog.kowalczyk.info/software/sumatrapdf/manual.html#manual-cmd-line –