Как распечатать документ 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 ноль или нет объекта.

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

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

1.08.2008 18:33:48
@mruanova Ни один из ответов не сработал, когда я их пытался. Если у вас есть что-то, что работает, дайте нам знать.
Chris Marasti-Georg 23.09.2017 20:49:05
Я знаю, что это был хороший вопрос в 2008 году, но сейчас это оффтоп.
Joshua 8.09.2019 14:42:31
@ Джошуа, как так?
Chris Marasti-Georg 30.09.2019 16:16:29
Joshua 30.09.2019 16:31:36
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();
}

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

32
23.03.2020 09:05:56
Отличный ответ - собирался отметить, что принял, и запустил мой тест. Похоже, что dll по-прежнему всплывает в диалоговом окне «Печать», и, поскольку это для запуска в качестве автоматической службы Windows, нам нужно как-то обойти это. Я в значительной степени исчерпал Google, и я в своем уме.
Chris Marasti-Georg 24.08.2009 16:25:54
К сожалению, диалоговое окно принтера появляется. Я тестировал на Windows 7 x64.
LukaszTaraszka 2.11.2016 13:45:46

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

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

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

5
2.08.2008 00:42:35

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

  1. визуализировать HTML в PDF
  2. распечатать PDF ( SumatraPDF )
  • -print-to-default $file.pdf печатает файл PDF на принтере по умолчанию
  • -print-to $printer_name $file.pdf печатает PDF на указанном принтере
4
23.05.2017 12:25:34
Последнее, что я проверил, часть 2 (печать через командную строку в Adobe) не работает в службе - она ​​требует взаимодействия с пользователем.
Chris Marasti-Georg 16.08.2012 14:37:12
Попробуйте Sumatra PDF, это намного быстрее blog.kowalczyk.info/software/sumatrapdf/…
Colonel Panic 16.08.2012 14:41:43
@ColonelPanic Wow. Отличный намек. Мне потребовались целую вечность, чтобы найти тот, который работает даже из сервиса, и кажется, что SumatraPdf действительно может использоваться в коммерческих пакетах.
Nyerguds 12.07.2018 13:36:13

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

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

3
13.04.2010 15:28:22

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

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

0
17.06.2009 17:36:22

Инструмент, который очень хорошо работает для меня - HiQPdf. https://www.hiqpdf.com/

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

0
8.09.2019 02:35:05

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

-1
20.09.2008 17:37:33