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

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

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

0
额外 编辑
意见: 1
@mruanova没有任何答案最后工作我试了他们。如果你有什么作品让我们知道。
额外 作者 Chris Marasti-Georg,
请选择最佳答案,谢谢。
额外 作者 mruanova,

6 答案

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

这可能值得研究。

否则,我无法想象超出Web浏览器控件的任何内容。

0
额外

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

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

0
额外
很好的答案 - 将它标记为已接受,并运行我的测试。似乎DLL仍然弹出“打印”对话框,并且因为这是作为无人参与的Windows服务运行的,所以我们需要以某种方式绕过它。我已经非常精疲力尽Google,而且我的智慧已经结束了。
额外 作者 Chris Marasti-Georg,
不幸的是出现打印机对话我在Windows 7 x64上测试过。
额外 作者 LukTar,

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

  1. 将HTML呈现为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
0
额外
最后,我检查了第2部分(通过命令行与Adobe打印)在服务中不起作用 - 它需要用户交互。
额外 作者 Chris Marasti-Georg,
尝试使用Sumatra PDF更快速 blog.kowalczyk.info/software/ sumatrapdf /…
额外 作者 Colonel Panic,

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

0
额外

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

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

0
额外

如果你的预算(约3000美元),请查看 PrinceXML

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

0
额外