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

时间:2020-03-05 18:37:17  来源:igfitidea点击:

我想从Cweb服务打印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脚本错误:

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

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

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

解决方案:

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

可能值得研究一下。

否则,我想不出Web浏览器控件之外的任何东西。

我们可以使用以下命令从命令行进行打印:

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及更高版本。

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

也许这会有所帮助。 http://www.codeproject.com/KB/printing/printhml.aspx
也不确定我们要从哪个线程访问浏览器控件,但是它必须是STA

注意链接中引用的项目确实允许我们导航到页面并执行打印而不显示打印对话框。

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

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