2008-08-01 4 views
66

Я хочу напечатать HTML с веб-службы C#. Элемент управления веб-браузером является излишним, и он плохо функционирует в среде обслуживания, а также не работает в системе с очень жесткими ограничениями безопасности. Есть ли какая-нибудь бесплатная библиотека .NET, которая будет поддерживать печать основной HTML-страницы? Вот код, который у меня есть до сих пор, который работает неправильно.Как распечатать документ 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 ошибка сценария:

Error: 'dialogArguments.___IE_PrintType' is null or not an object
URL: res://ieframe.dll/preview.dlg

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

+0

Пожалуйста, выберите лучший ответ, спасибо. – mruanova 2017-08-22 22:26:15

+0

@mruanova Ни один из ответов не работал, я пробовал их. Если у вас есть что-то, что работает, сообщите нам об этом. – 2017-09-23 20:49:05

ответ

3

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

Возможно, стоит обратить внимание на это.

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

28

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

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

+0

Отличный ответ - собирался отметить его, и прошел мой тест. Похоже, что dll все еще всплывает диалоговое окно «Печать», и поскольку это должно выполняться как автоматическая служба Windows, нам нужно как-то обойти это. Я довольно сильно измучил Google, и я нахожусь на своем пути. – 2009-08-24 16:25:54

-1

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

0

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

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

3

Если у вас есть бюджет (~ $ 3000), ознакомьтесь с PrinceXML.

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

3

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

  1. render the HTML to PDF
  2. печати в формате PDF (SumatraPDF)
  • -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

 Смежные вопросы

  • Нет связанных вопросов^_^