Как распечатать 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();
}

Это нормально работает при вызове из потоков UI-типа, но ничего не происходит при вызове из потока сервисного типа. Изменение Print() на ShowPrintPreviewDialog() приводит к следующей ошибке сценария IE:

Error:dialogArguments.___IE_PrintType is null or not an object.

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

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

@mruanova Ни один из ответов не работал в последний раз, когда я их пробовал. Если у вас есть что-то, что работает, дайте нам знать.

Chris Marasti-Georg 23.09.2017 23:49

Я знаю, что в 2008 году это считалось хорошим вопросом, но сейчас это оффтоп.

Joshua 08.09.2019 17:42

@ Джошуа, как так?

Chris Marasti-Georg 30.09.2019 19:16

См. meta.stackoverflow.com/questions/251134/…

Joshua 30.09.2019 19:31
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
79
4
16 026
7

Ответы 7

Я знаю, что сама 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, и я в своем уме.

Chris Marasti-Georg 24.08.2009 20:25

К сожалению, появляется диалоговое окно принтера. Тестировал на Windows 7 x64.

LukaszTaraszka 02.11.2016 16:45

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

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

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

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

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

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

  1. преобразовать HTML в PDF
  2. распечатать PDF (СуматраPDF)
  • -print-to-default $file.pdf prints a PDF file on a default printer
  • -print-to $printer_name $file.pdf prints a PDF on a given printer

Последнее, что я проверял, часть 2 (печать через командную строку с помощью Adobe) не работает в сервисе - для этого требуется взаимодействие с пользователем.

Chris Marasti-Georg 16.08.2012 18:37

Попробуйте Sumatra PDF, это намного быстрее blog.kowalczyk.info/software/sumatrapdf/…

Colonel Panic 16.08.2012 18:41

@ColonelPanic Вау. Отличный намек. Мне потребовалось много времени, чтобы найти тот, который работает даже из службы, и кажется, что SumatraPdf действительно можно использовать в коммерческих пакетах.

Nyerguds 12.07.2018 16:36

У меня очень хорошо работает инструмент HiQPdf. https://www.hiqpdf.com/

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

Другие вопросы по теме