Як надрукувати документ HTML із веб-служби?


80

Я хочу надрукувати 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

І з’являється невелике порожнє діалогове вікно попереднього перегляду друку.


@mruanova Жодна з відповідей не спрацювала останній раз, коли я їх спробував. Якщо у вас є щось, що працює, повідомте нас.
Chris Marasti-Georg

Я знаю, що це вважалося хорошим питанням у 2008 році, але зараз це не актуально.
Джошуа


Відповіді:


33

Ви можете друкувати з командного рядка, використовуючи наступне:

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();
}

Примітка: Це працює лише у Windows 2000 та новіших версіях.


Чудова відповідь - збирався позначити, що це прийнято, і провів мій тест. Здається, dll все ще вискакує з діалогового вікна "Друк", і оскільки це має працювати як неналежна служба Windows, нам потрібно якось обійти це. Я майже вичерпав Google, і я на своєму.
Кріс Марасті-Георг

На жаль, з'являється діалогове вікно принтера. Я тестував на Windows 7 x64.
Лукаш Тарашка

6

Я знаю, що сама Visual Studio (принаймні у версії 2003 року) посилається безпосередньо на DLL IE для відображення "Перегляду дизайну".

Можливо, варто це розглянути.

В іншому випадку я не можу придумати нічого поза межами контролю веб-браузера.


5

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

  1. рендеріть HTML в PDF
  2. роздрукувати PDF ( SumatraPDF )
  • -print-to-default $file.pdf друкує файл PDF на принтері за замовчуванням
  • -print-to $printer_name $file.pdf друкує PDF-файл на заданому принтері

Востаннє я перевірив, частина 2 (друк через командний рядок з Adobe) не працює в службі - вона вимагає взаємодії користувача.
Кріс Марасті-Георг

1
Спробуйте Sumatra PDF, це набагато швидше blog.kowalczyk.info/software/sumatrapdf/…
Полковник Панік,

@ColonelPanic Ого. Чудовий натяк. Мені знадобився вік, щоб знайти такий, який працює навіть із сервісом, і, здається, SumatraPdf насправді можна використовувати в комерційних пакетах.
Nyerguds

4

Якщо ви маєте це в бюджеті (~ 3000 доларів), перевірте PrinceXML .

Він перетворить HTML у PDF, добре функціонує в сервісному середовищі та підтримує розширені функції, такі як не розбивання сторінки посередині комірки таблиці (яку багато браузерів на даний момент не підтримують).


1

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

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


1

Я інструментом, який дуже добре працює для мене, є HiQPdf. https://www.hiqpdf.com/

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


-1

Я не знаю конкретних інструментів, але є деякі утиліти, які записують / відтворюють кліки. Іншими словами, ви можете автоматизувати "клацання" у діалоговому вікні друку. (Я знаю, що це хакерство, але коли все інше не вдається ...)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.