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

oenim 发布于 2018-02-03 c# 最后更新 2018-02-03 01:02 687 浏览

我想从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脚本错误:
Error: 'dialogArguments.___IE_PrintType' is null or not an object
URL: res://ieframe.dll/preview.dlg
出现一个小的空白打印预览对话框。
已邀请:

nautem

赞同来自:

我知道Visual Studio本身(至少在2003版本中)直接引用IE dll来呈现“设计视图”。 这可能是值得研究的。 否则,我想不出任何超出Web浏览器控制的东西。

pquo

赞同来自:

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

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及以上,我认为。

yet

赞同来自:

我不知道具体的工具,但有一些公用事业记录/重播点击。换句话说,您可以在打印对话框中自动执行“点击”。 (我知道这是一个黑客,但是当其他的都失败了...)

xnobis

赞同来自:

也许这会有所帮助。 http://www.codeproject.com/KB/printing/printhml.aspx 也不知道你试图从哪个线程访问浏览器,但它需要是STA 注 - 链接中引用的项目确实允许您导航到页面并执行打印而不显示打印对话框。

ket

赞同来自:

如果你已经在预算(~$ 3000),请检查PrinceXML。 它将HTML呈现为PDF格式,在服务环境中运行良好,并且支持高级特性,例如不会在表格单元格中间打开一个页面(很多浏览器目前不支持)。

oqui

赞同来自:

简单!把你的问题分成两个更简单的部分:

  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