由于我无法控制的情况下,我用自制的XML报告,这些报告工作精美取代我们所有的Crystal Reports。对于弹出Crystal Reports查看器的大多数报表,以下代码可在IE中很好地打开它们,并通过XSLT样式表将其转换为HTML。

ProcessStartInfo psi = new ProcessStartInfo(reportFilename)
{
   UseShellExecute = true
};

using (Process p = new Process {StartInfo = psi})
{
    p.Start();
}


问题在于某些报告只是直接打印到打印机,而从未向用户显示该报告,这在CR中工作正常。我无法弄清楚如何使用上面的代码来做到这一点。

我暂时不希望如果可能的话特别推出一个IE进程,但我保证,他们正在运行的Windows,所以这不是一个硬性要求。此外,将通过这种方式直接打印通过XSL将XML转换为HTML和打印,或只是打印实际的XML文本?

编辑:我已经尝试添加:

Verb = "Print"


到ProcessStartInfo对象,但风了一个异常被抛出一句话:

"No application is associated with the specified file for this operation"


再次编辑:指定IE的exe文件来启动再次加载XML就好了,但不提供“打印”操作。添加“window.print()”在JavaScript块的工作,但允许脚本运行后,需要手动点击打印按钮,因为IE阻止它。

编辑第三:我的老板告诉我不要它担心,他们可以从IE打印。我仍然想弄清楚这一点。我试着在命令行“print.exe”,但只打印原始XML到打印机。试图XslCompiledTransform用PrintDocument的,但是这不是我要找的,无论是。

最佳答案

终于明白了。我刚刚创建了一个不可见的WebBrowser控件来执行IE渲染,然后在DocumentCompleted上调用其Print()方法。使用默认打印机设置可以像超级按钮一样工作。

private static void PrintReport(string reportFilename)
{
    WebBrowser browser = new WebBrowser();

    browser.DocumentCompleted += browser_DocumentCompleted;

    browser.Navigate(reportFilename);
}

private static void browser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
    WebBrowser browser = sender as WebBrowser;

    if (null == browser)
    {
        return;
    }

    browser.Print();

    browser.Dispose();
}

09-17 14:58
查看更多