85

我想从 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为空或不是对象。

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

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

4

7 回答 7

36

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

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

于 2008-08-03T18:06:30.913 回答
7

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

这可能值得研究。

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

于 2008-08-02T00:42:35.310 回答
6

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

  1. 将 HTML 呈现为 PDF
  2. 打印 PDF ( SumatraPDF )
  • -print-to-default $file.pdf 在默认打印机上打印 PDF 文件
  • -print-to $printer_name $file.pdf 在给定的打印机上打印 PDF
于 2012-08-15T13:27:40.940 回答
4

如果您有预算(约 3000 美元),请查看PrinceXML

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

于 2010-04-12T17:57:20.060 回答
2

对我来说效果很好的工具是 HiQPdf。 https://www.hiqpdf.com/

价格合理(起价 245 美元),它可以将 HTML 渲染为 PDF,还可以直接管理 PDF 文件的打印。

于 2019-09-08T02:35:05.200 回答
1

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

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

于 2009-06-17T17:36:22.350 回答
-2

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

于 2008-09-20T17:37:33.710 回答