由于情况超出了我的控制范围,我将用自制的 XML 报告替换所有的 Crystal 报告,这些报告运行得非常好。对于大多数弹出 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 文本?
EDIT:我已经尝试添加:
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,但这也不是我想要的。
终于想通了我刚刚创建了一个不可见的 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();
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)