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

Я хочу напечатать 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 является нулем или не является объектом.

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

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

Ответы [ 6 ]

30 голосов
/ 03 августа 2008

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

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 и выше, я думаю.

4 голосов
/ 15 августа 2012

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

  1. рендеринг HTML в PDF
  2. распечатать PDF ( SumatraPDF )
  • -print-to-default $file.pdf печатает файл PDF на принтере по умолчанию
  • -print-to $printer_name $file.pdf печатает PDF на заданном принтере
4 голосов
/ 02 августа 2008

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

Возможно, стоит посмотреть на это.

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

3 голосов
/ 12 апреля 2010

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

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

0 голосов
/ 17 июня 2009

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

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

0 голосов
/ 20 сентября 2008

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...