Печать отформатированной HTML-страницы в C # - PullRequest
12 голосов
/ 14 октября 2010

Я ищу способ напечатать отформатированный HTML-файл в альбомной ориентации в C # (в первую очередь, wpf). Диалог печати был бы хорош для того, чтобы установить настройку страницы в альбомной ориентации. Я попытался использовать конвертер html в xaml от Microsoft, и он уничтожил форматирование. Я нахожу довольно удивительным, что нет способа или захвата файла и отправки непосредственно на принтер.

Любые идеи будут высоко оценены.

Ответы [ 5 ]

14 голосов
/ 15 апреля 2013
 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();
        }
9 голосов
/ 14 октября 2010

Вы можете получить доступ к методу Print () класса WebBrowser в C #, чтобы сделать это. Круто то, что вам не нужно отображать WebBrowser где-либо в вашем приложении. Просто передайте содержимое в элемент управления WebBrowser следующим образом:

webBrowser1.DocumentContent = openfiledialog.FileName;

А затем просто вызовите метод webBrowser1.Print();. Вот ссылка на MSDN:

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

Надеюсь, это поможет.

8 голосов
/ 20 января 2017

В течение многих лет мы использовали элемент управления .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;
    }
}

Наслаждайтесь!

3 голосов
/ 14 октября 2010

Мне кажется, что лучший способ, которым вы хотели бы пойти, - это сначала выбрать механизм рендеринга HTML и обратиться к нему за поддержкой печати.Не существует «стандартного» способа печати HTML-документа независимо от языка, ОС или структуры.

1 голос
/ 14 октября 2010

Может быть что-то вроде:

webBrowser1.DocumentContent = YOUR_FILE_NAME;
mshtml.IHTMLDocument2 doc = webBrowser1.Document as mshtml.IHTMLDocument2;
doc.execCommand("Print", true, null);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...