В течение многих лет мы использовали элемент управления .net WebBrowser, как указано в других ответах, однако в последнее время этот элемент управления становится все более нестабильным. Даже перестраивая машину, которую мы используем для печати наших комплектов на складе для запуска Windows 10, у нас все еще остаются проблемы со страницами, которые просто не печатаются, пока мы не перезагрузим компьютер. Один и тот же код служил нам более 4 лет, но теперь, похоже, недавние обновления от Microsoft сделали этот элемент управления еще более ошибочным, чем в прошлом.
Другая важная проблема заключается в том, что нет простого способа печати на принтере, кроме стандартного набора для 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;
}
}
Наслаждайтесь!