Я хочу напечатать 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
И появляется небольшое пустое диалоговое окно предварительного просмотра.
Вы можете распечатать из командной строки, используя следующее:
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 и выше, я думаю.
Я знаю, что сама Visual Studio (по крайней мере, в версии 2003) ссылается на библиотеку IE напрямую, чтобы отобразить «представление дизайна».
Возможно, стоит посмотреть на это.
В противном случае, я не могу думать ни о чем, кроме контроля веб-браузера.
Легко! Разделите вашу проблему на две более простые части:
- визуализировать HTML в PDF
- распечатать PDF ( SumatraPDF )
-print-to-default $file.pdf
печатает файл PDF на принтере по умолчанию-print-to $printer_name $file.pdf
печатает PDF на указанном принтере
Если у вас есть это в бюджете (~ $ 3000), проверьте PrinceXML .
Он будет отображать HTML в PDF, хорошо функционирует в сервисной среде и поддерживает расширенные функции, такие как не ломать страницу в середине ячейки таблицы (которую в настоящее время не поддерживают многие браузеры).
Может быть, это поможет. http://www.codeproject.com/KB/printing/printhml.aspx Также не уверен, из какого потока вы пытаетесь получить доступ к элементу управления браузера, но он должен быть STA
Примечание. Проект, указанный в ссылке, позволяет перейти на страницу и выполнить печать без отображения диалогового окна печати.
Инструмент, который очень хорошо работает для меня - HiQPdf. https://www.hiqpdf.com/
Цена является разумной (от 245 долларов США), и она может отображать HTML в PDF, а также напрямую управлять печатью файлов PDF.
Я не знаю конкретных инструментов, но есть некоторые утилиты, которые записывают / воспроизводят клики. Другими словами, вы можете автоматизировать «щелчок» в диалоговом окне печати. (Я знаю, что это взлом, но когда все остальное не удается ...)