Я хочу напечатать 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:
Error:
dialogArguments.___IE_PrintTypeis null or not an object.URL:
res://ieframe.dll/preview.dlg
Появится небольшое пустое диалоговое окно предварительного просмотра печати.
Я знаю, что в 2008 году это считалось хорошим вопросом, но сейчас это оффтоп.
@ Джошуа, как так?
См. meta.stackoverflow.com/questions/251134/…





Я знаю, что сама Visual Studio (по крайней мере, в версии 2003) напрямую ссылается на DLL IE, чтобы отобразить «Представление дизайна».
Возможно, стоит изучить это.
В противном случае я не могу думать ни о чем, кроме управления веб-браузером.
Вы можете печатать из командной строки, используя следующее:
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 и выше.
Отличный ответ - собирался отметить как принятый и провел тест. Кажется, что dll все еще появляется в диалоговом окне «Печать», и, поскольку он предназначен для работы в качестве автоматической службы Windows, нам нужно как-то обойти это. Я довольно сильно вымотал Google, и я в своем уме.
К сожалению, появляется диалоговое окно принтера. Тестировал на Windows 7 x64.
Я не знаю конкретных инструментов, но есть некоторые утилиты, которые записывают / воспроизводят щелчки. Другими словами, вы можете автоматизировать «щелчок» по диалоговому окну печати. (Я знаю, что это взлом, но когда все остальное терпит неудачу ...)
Может это поможет. http://www.codeproject.com/KB/printing/printhml.aspx Также не уверен, из какого потока вы пытаетесь получить доступ к элементу управления браузером, но это должен быть STA
Примечание. Проект, упомянутый в ссылке, позволяет перейти на страницу и выполнить печать без отображения диалогового окна печати.
Если у вас есть бюджет (~ 3000 долларов), посмотрите PrinceXML.
Он преобразует HTML в PDF-файл, хорошо работает в служебной среде и поддерживает расширенные функции, такие как отсутствие разрыва страницы в середине ячейки таблицы (что в настоящее время не поддерживается многими браузерами).
Легко! Разделите вашу проблему на две более простые части:
-print-to-default $file.pdfprints a PDF file on a default printer-print-to $printer_name $file.pdfprints a PDF on a given printer
Последнее, что я проверял, часть 2 (печать через командную строку с помощью Adobe) не работает в сервисе - для этого требуется взаимодействие с пользователем.
Попробуйте Sumatra PDF, это намного быстрее blog.kowalczyk.info/software/sumatrapdf/…
@ColonelPanic Вау. Отличный намек. Мне потребовалось много времени, чтобы найти тот, который работает даже из службы, и кажется, что SumatraPdf действительно можно использовать в коммерческих пакетах.
У меня очень хорошо работает инструмент HiQPdf. https://www.hiqpdf.com/
Цена разумная (начинается от 245 долларов), и он может преобразовывать HTML в PDF, а также напрямую управлять печатью файлов PDF.
@mruanova Ни один из ответов не работал в последний раз, когда я их пробовал. Если у вас есть что-то, что работает, дайте нам знать.