如何从Web服务打印HTML文档?


78

我想从C#Web服务打印HTML。Web浏览器控件过大,在服务环境中无法正常运行,在安全性非常严格的系统上也无法正常运行。是否有某种免费的.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或不是对象。

网址: res://ieframe.dll/preview.dlg

随即出现一个小的空白打印预览对话框。


@mruanova最后一个答案都没有起作用,我尝试过。如果您有可行的方法,请告诉我们。
克里斯·玛拉斯蒂·乔治

我知道这在08年被认为是一个好问题,但现在已经成为话题。
约书亚

@约书亚是怎么回事?
克里斯·玛拉斯蒂·乔治

Answers:


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上进行了测试。
LukaszTaraszka '16

6

我知道Visual Studio本身(至少在2003版中)直接引用IE dll来呈现“设计视图”。

可能值得研究一下。

否则,我将无法想到Web浏览器控件之外的任何东西。


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/…–
Panic Panic

@ColonelPanic哇。很好的提示。我花了很长时间才找到一种甚至可以通过服务使用的软件,而且SumatraPdf似乎实际上可用于商业软件包。
Nyerguds

4

如果您的预算中有它(〜$ 3000),请查看PrinceXML

它将HTML转换为PDF,在服务环境中运行良好,并支持高级功能,例如不破坏表格单元格中间的页面(许多浏览器目前不支持该功能)。




-1

我不知道具体的工具,但是有一些实用程序可以记录/重放点击。换句话说,您可以在打印对话框中自动执行“单击”。(我知道这是一个hack,但是当其他所有方法都失败时...)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.