Сведения о вопросе

Sadijon

16:03, 1st July, 2020

Теги

c#   html   web-services   printing    

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

Просмотров: 524   Ответов: 6

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

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

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



  Сведения об ответе

SILA

18:03, 1st July, 2020

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

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


  Сведения об ответе

SKY

18:03, 1st July, 2020

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

Может быть, стоит в этом разобраться.

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


  Сведения об ответе

#hash

18:03, 1st July, 2020

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

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


  Сведения об ответе

JUST___

18:03, 1st July, 2020

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

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


  Сведения об ответе

SSESION

18:03, 1st July, 2020

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

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


  Сведения об ответе

ASSembler

18:03, 1st July, 2020

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


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться