打印转换后的XML

时间:2009-04-01 22:03:02

标签: c# xml winforms

由于我无法控制的情况,我正在用自制的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就好了,但不提供“打印”操作。在JavaScript块中添加“window.print()”有效,但需要在允许脚本运行后手动单击打印按钮,因为IE会阻止它。

编辑第三:我的老板告诉我不要担心,他们可以从IE打印。我还想弄明白这一点。我尝试过命令行“print.exe”,但只打印原始XML到打印机。用PrintDocument尝试了XslCompiledTransform,但这也不是我想要的。

1 个答案:

答案 0 :(得分:3)

终于搞清楚了。我刚刚创建了一个不可见的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();
}