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!
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