【问题标题】:How do I print an HTML document from a web service?如何从 Web 服务打印 HTML 文档?
【发布时间】:2010-09-05 05:41:35
【问题描述】:

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

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

【问题讨论】:

  • @mruanova 上次我尝试的答案都没有。如果您有什么可行的方法,请告诉我们。
  • 我知道这在 08 年被认为是一个很好的问题,但现在它已经离题了。
  • @Joshua 怎么样?

标签: c# html web-services printing


【解决方案1】:

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

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 服务运行的,所以我们需要以某种方式绕过它。我已经筋疲力尽了谷歌,我已经束手无策了。
  • 不幸的是出现了打印机对话框。我在 Windows 7 x64 上进行了测试。
【解决方案2】:

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

这可能值得研究。

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

【讨论】:

    【解决方案3】:

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

    1. render the HTML to PDF
    2. 打印 PDF (SumatraPDF)
    • -print-to-default $file.pdf 在默认打印机上打印 PDF 文件
    • -print-to $printer_name $file.pdf 在给定的打印机上打印 PDF

    【讨论】:

    • 我上次检查,第 2 部分(通过 Adob​​e 命令行打印)在服务中不起作用 - 它需要用户交互。
    • @ColonelPanic 哇。很好的提示。我花了很长时间才找到一个甚至可以从服务中使用的工具,而且 SumatraPdf 似乎实际上可以在商业包中使用。
    【解决方案4】:

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

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

    【讨论】:

      【解决方案5】:

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

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

      【讨论】:

        【解决方案6】:

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

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

        【讨论】:

          【解决方案7】:

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

          【讨论】:

            猜你喜欢
            • 2011-08-01
            • 1970-01-01
            • 2013-01-25
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2010-10-12
            • 1970-01-01
            相关资源
            最近更新 更多