Как распечатать HTML-документ из веб-службы?

Я хочу напечатать HTML из веб-службы C #. Контроль веб-браузера избыточен, и он плохо работает в служебной среде, а также плохо работает в системе с очень жесткими ограничениями безопасности. Есть ли какая-нибудь бесплатная .NET библиотека, которая поддерживает печать базовой HTML-страницы? Вот код, который у меня есть, но он не работает должным образом.

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

Это нормально работает при вызове из потоков UI-типа, но ничего не происходит при вызове из потока сервисного типа. Изменение Print() на ShowPrintPreviewDialog() приводит к следующей ошибке сценария IE:

Ошибка: dialogArguments.___IE_PrintType имеет значение null или не является объектом.

URL: res://ieframe.dll/preview.dlg

Появится небольшое пустое диалоговое окно предварительного просмотра печати.


person Chris Marasti-Georg    schedule 01.08.2008    source источник
comment
@mruanova Ни один из ответов не сработал в последний раз, когда я их пробовал. Если у вас есть что-то, что работает, дайте нам знать.   -  person Chris Marasti-Georg    schedule 23.09.2017
comment
Я знаю, что в 2008 году это считалось хорошим вопросом, но сейчас это оффтоп.   -  person Joshua    schedule 08.09.2019
comment
@ Джошуа, как так?   -  person Chris Marasti-Georg    schedule 30.09.2019
comment
См. Заголовок meta.stackoverflow.com/questions/251134/   -  person Joshua    schedule 30.09.2019


Ответы (7)


Вы можете печатать из командной строки, используя следующее:

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

Где% 1 - это путь к печатаемому HTML-файлу.

Если вам не нужно печатать из памяти (или вы можете позволить себе запись на диск во временном файле), вы можете использовать:

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. Я думаю, это работает только в Windows 2000 и выше.

person ICR    schedule 03.08.2008
comment
Отличный ответ - собирался отметить как принятый и провел тест. Кажется, что dll все еще появляется в диалоговом окне «Печать», и, поскольку он должен работать как автоматическая служба Windows, нам нужно как-то обойти это. Я довольно сильно вымотал Google, и я в своем уме. - person Chris Marasti-Georg; 24.08.2009
comment
К сожалению, появляется диалоговое окно принтера. Тестировал на Windows 7 x64. - person LukaszTaraszka; 02.11.2016

Я знаю, что сама Visual Studio (по крайней мере, в версии 2003) напрямую ссылается на DLL IE, чтобы отобразить «Представление дизайна».

Возможно, стоит изучить это.

В противном случае я не могу думать ни о чем, кроме управления веб-браузером.

person EndangeredMassa    schedule 02.08.2008

Легкий! Разделите вашу проблему на две более простые части:

  1. преобразовать HTML в PDF
  2. распечатать PDF-файл (SumatraPDF)
  • -print-to-default $file.pdf печатает файл PDF на принтере по умолчанию
  • -print-to $printer_name $file.pdf печатает PDF-файл на заданном принтере
person Colonel Panic    schedule 15.08.2012
comment
Последнее, что я проверял, часть 2 (печать через командную строку с помощью Adobe) не работает в сервисе - она ​​требует взаимодействия с пользователем. - person Chris Marasti-Georg; 16.08.2012
comment
Попробуйте Sumatra PDF, это намного быстрее blog.kowalczyk.info/software/ sumatrapdf / - person Colonel Panic; 16.08.2012
comment
@ColonelPanic Вау. Отличный намек. Мне потребовалось много времени, чтобы найти тот, который работает даже из службы, и кажется, что SumatraPdf действительно можно использовать в коммерческих пакетах. - person Nyerguds; 12.07.2018

Если у вас есть бюджет (~ 3000 долларов США), попробуйте PrinceXML.

Он преобразует HTML в PDF, хорошо работает в служебной среде и поддерживает расширенные функции, такие как отсутствие разрыва страницы в середине ячейки таблицы (что в настоящее время не поддерживается многими браузерами).

person user314783    schedule 12.04.2010

У меня очень хорошо работает инструмент HiQPdf. https://www.hiqpdf.com/

Цена разумная (начинается от 245 долларов), и он может преобразовывать HTML в PDF, а также напрямую управлять печатью файлов PDF.

person AnthonyVO    schedule 08.09.2019

Может это поможет. http://www.codeproject.com/KB/printing/printhml.aspx Также не уверен, из какого потока вы пытаетесь получить доступ к элементу управления браузера, но это должен быть STA

Примечание. Проект, упомянутый в ссылке, позволяет перейти на страницу и выполнить печать без отображения диалогового окна печати.

person NastyNateDoggy    schedule 17.06.2009

Я не знаю конкретных инструментов, но есть некоторые утилиты, которые записывают / воспроизводят щелчки. Другими словами, вы можете автоматизировать «щелчок» по диалоговому окну печати. (Я знаю, что это взлом, но когда все остальное терпит неудачу ...)

person Greg Ogle    schedule 20.09.2008