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

голоса
68

Я хочу напечатать 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» равно нулю или не является объектом
URL: Рез: //ieframe.dll/preview.dlg

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

Задан 01/08/2008 в 19:33
источник пользователем
На других языках...                            


6 ответов

голоса
29

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

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

NB Это работает только на Windows 2000 и выше, я думаю.

Ответил 03/08/2008 в 19:06
источник пользователем

голоса
3

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

  1. визуализации HTML в PDF
  2. печать PDF ( SumatraPDF )
  • -print-to-default $file.pdf печатает файл PDF на принтер по умолчанию
  • -print-to $printer_name $file.pdf печатает PDF на данном принтере
Ответил 15/08/2012 в 14:27
источник пользователем

голоса
3

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

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

Ответил 12/04/2010 в 18:57
источник пользователем

голоса
3

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

Это может быть стоит посмотреть на это.

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

Ответил 02/08/2008 в 01:42
источник пользователем

голоса
0

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

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

Ответил 17/06/2009 в 18:36
источник пользователем

голоса
-1

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

Ответил 20/09/2008 в 18:37
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more