Как распечатать документ 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();
}

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

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

URL-АДРЕС:res://ieframe.dll/preview.dlg

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

6 ответов

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

    Возможно, стоит в этом разобраться.

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

  2. Печать из командной строки можно выполнить с помощью следующих параметров:

    rundll32.исполняемый
    %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 и выше, я думаю.

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

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

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

  5. Если у вас есть это в бюджете (~00), проверьте PrinceXML .

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