我想从 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

然后会出现一个小的空打印预览对话框。

没有正确的解决方案

其他提示

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

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

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

这可能值得研究一下。

否则,我想不出任何超出 Web 浏览器控制范围的事情。

简单的!将您的问题分成两个更简单的部分:

  1. 将 HTML 渲染为 PDF
  2. 打印 PDF(苏门答腊PDF)
  • -print-to-default $file.pdf 在默认打印机上打印 PDF 文件
  • -print-to $printer_name $file.pdf 在给定打印机上打印 PDF

如果您的预算在(约 3000 美元)内,请查看 PrinceXML.

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

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

注意 - 链接中引用的项目允许您导航到页面并执行打印,而无需显示打印对话框。

我不知道具体的工具,但有一些实用程序可以记录/重播点击。换句话说,您可以自动执行打印对话框上的“单击”操作。(我知道这是一个黑客,但当其他一切都失败时......)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top