为什么Crystal Reports PrintToPrinter方法如此慢

时间:2014-01-15 22:18:30

标签: c# printing crystal-reports

我正在使用Visual Studio 2010中的Crystal Reports 13版。我有一台运行Windows 2012的打印服务器。我在运行时动态设置打印机,因为我有大约30台报告可以去的打印机。所有这些打印机都在打印服务器上配置。

PrintDocument pDoc = new PrintDocument();
PrintLayoutSettings PrintLayout = new PrintLayoutSettings();
PrinterSettings printerSettings = new PrinterSettings();
printerSettings.PrinterName = pq.printerName;
PageSettings pSettings = new PageSettings(printerSettings);
crReportDocument.PrintOptions.DissociatePageSizeAndPrinterPaperSize = true;
crReportDocument.PrintOptions.PrinterDuplex = PrinterDuplex.Simplex;

OnMessageLogged(TraceEventType.Information, "PrePrint " + crReportDocument.PrintOptions.PrinterName);

WindowsImpersonationContext ctx = WindowsIdentity.Impersonate(IntPtr.Zero);
try
{
    crReportDocument.PrintToPrinter(printerSettings, pSettings, false, PrintLayout);
    OnMessageLogged(TraceEventType.Information, "Printed " + pq.printerName);
}
catch (Exception eprint)
{
    OnMessageLogged(TraceEventType.Information, "****Failed to Print** to printer " + pq.printerName + " Exception " + eprint.ToString());
}
finally
{
    // Resume impersonation
    ctx.Undo();
    OnMessageLogged(TraceEventType.Information, "Success Printing to " + pq.printerName);
}

当我调用PrintToPrinter方法时:

crReportDocument.PrintToPrinter(printerSettings,pSettings,false,PrintLayout);

执行需要两到五分钟。无论我是在Visual Studio中运行代码还是在服务器上运行已部署的服务,我都会看到这种行为。

我们最近将服务服务器和打印服务器升级到Windows 2012.之前,我们的服务服务器是Windows 2008,我们的打印服务器是Windows 2003.我们没有遇到这个问题。

是否有人在打印机上花费很长时间或打印到Win2012打印服务器时遇到问题?

感谢?

2 个答案:

答案 0 :(得分:2)

使用

_report.ReportClientDocument.PrintOutputController.PrintReport(popt); 

代替_report.PrintToPrinter,速度提高了5-10倍。 我的代码示例:

CrystalDecisions.ReportAppServer.Controllers.PrintReportOptions popt = new CrystalDecisions.ReportAppServer.Controllers.PrintReportOptions();
popt.PrinterName = printerSettings.PrinterName;
_report.ReportClientDocument.PrintOutputController.PrintReport(popt);

在CR 13.06上测试过,PrintToPrinter花费了大约3800毫秒而PrintReport只花了大约320个

答案 1 :(得分:0)

此问题是由crystal 13基本运行时中的错误引起的。

如果使用no printer选项保存报告,则忽略设置打印机名称。因此,开发人员必须分配报表文档的整个PrinterSettings属性。这是延迟发生的地方。

// This is the old and reliable way - didn't work for version 13
Settings = new PrinterSettings();
Settings.PrinterName = "HP Printer";
// you don't even need the PrinterSettings object in  10.5, just the printer name
_report.PrintOptions.PrinterName = Settings.PrinterName;
// for version 13 you have to assign the printer settings
if(_report.PrintOptions.PrinterName != Settings.PrinterName)
    _report.PrintToPrinter(Settings, new PageSettings(), false);

我已经从10.5(基本的2008)升级,打印速度非常快,但由于这个(未确认的)错误而不得不经历一次难以回滚。

我目前正在研究Crystal的sp 10,看看这个问题是否已经解决。

修改

慢速PrintToPrinter的问题现已解决,但SAP建议我们使用:

report.ReportClientDocument.PrintOutputController.PrintReport(options);

而不是PrintToPrinter,它将无法进一步开发。