2008-08-01 47 views
66

我想从C#web服务打印HTML。 Web浏览器控件过度使用,并且在服务环境中运行不正常,在安全性非常严格的系统上也不能很好地运行。有什么免费的.NET库可以支持打印基本的HTML页面吗?这是我迄今为止的代码,它无法正常运行。如何从Web服务打印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()到​​产生以下的IE脚本错误:

Error: 'dialogArguments.___IE_PrintType' is null or not an object
URL: res://ieframe.dll/preview.dlg

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

+0

请选择最佳答案,谢谢。 – mruanova 2017-08-22 22:26:15

+0

@mruanova没有任何答案最后工作我试了他们。如果你有一些作品让我们知道。 – 2017-09-23 20:49:05

回答

3

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

这可能是值得研究的。

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

28

可以在命令行使用下列打印:

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,而且我的智慧已经结束了。 – 2009-08-24 16:25:54

-1

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

3

如果你已经在预算(〜$ 3000),检查出PrinceXML

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

3

简单!分裂您的问题分为两个简单的部分:

  1. render the HTML to 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