如何从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(); } 

从UItypes的线程调用时,这工作正常,但从服务types的线程调用时没有任何反应。 将Print()更改为ShowPrintPreviewDialog()产生以下IE脚本错误:

错误:'dialogArguments .___ IE_PrintType'为空或不是对象
URL:res://ieframe.dll/preview.dlg

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

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

rundll32.exe%WINDIR%\ System32 \ mshtml.dll,PrintHTML“%1”

其中%1是要打印的html文件的文件path。

如果您不需要从内存中打印(或者可以在临时文件中写入磁盘),则可以使用:

 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(); } 

NB这只适用于Windows 2000及以上,我认为。

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

这可能是值得研究的。

否则,我想不出任何超出Web浏览器控制的东西。

如果你有预算(〜$ 3000),请查看PrinceXML 。

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

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

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

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

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

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