我正在使用C1ReportViewer控件,并且已经在C1论坛上发布了一个问题,但我想我也会在这里发布,看看是否有人遇到过类似的问题。该控件使用通用的Silverlight PrintDocument()方法。
在Silverlight 5中从此控件打印Crystal Report时,报表会打印出乱码,表示不同大小的文本,锥形线和通常位置不对。它也很少打印整个报告。
我已将问题缩小到几台打印机,并且仅限于使用32位驱动程序的计算机。基于此,以及对Silverlight 5的更改,我假设问题围绕PostScript兼容性。但是,由于我们的产品是LOB应用程序,强制执行兼容PS的打印机和打印机驱动程序几乎是不可能的。
因此,如果这确实是一个后脚本问题,基于silverlight 5的文档,PrintDocument()方法应该失败回到默认的位图方法。见Am I correct in understanding that vector printing in SilverLight 5 will only work with a Postscript printer?
我对stackoverflow的问题是:有没有人在Silverlight 5中遇到类似的问题,或者是否有人成功打印Crystal Reports / PDF?在任何人都有机会的情况下,你想出了什么解决方案?
非常赞赏,
格雷格
答案 0 :(得分:0)
我能够为此提出解决方案。我没有使用内置的C1打印功能,而是编写了一些代码来强制进行位图打印。
首先,我创建了一个新的PrintDocument,并为其PrintPage事件连接了一些处理程序。
mobjPrintDocument = New PrintDocument
RemoveHandler mobjPrintDocument.PrintPage, AddressOf Print_Report
AddHandler mobjPrintDocument.PrintPage, AddressOf Print_Report
然后,只要您想打印,我们就可以在PrintDocument上调用PrintBitmap函数。在这里,当用户单击“打印”按钮时,我正在执行此操作。
Private Sub xbtnPrint_Click(sender As System.Object, e As System.Windows.RoutedEventArgs)
mintPageIndex = 0
mobjPrintDocument.PrintBitmap(FileName)
End Sub
现在是重要的一部分。我们可以通过挂钩到PrintPage事件来劫持目标内容(如上所述)。我可以将e.PageVisual设置为任何可视xaml元素,PrintBitmap将处理它。在这里,我使用GetPages函数并循环以确保我打印每个页面(pdfviewer元素)。但是,您可以将其指向任何视觉元素,就像我说的那样。
Private Sub Print_Report(sender As System.Object, e As PrintPageEventArgs)
e.PageVisual = xobjReportViewer.GetPages(mintPageIndex)
mintPageIndex += 1
e.HasMorePages = mintPageIndex < xobjReportViewer.GetPages.Count
End Sub
e.HasMorePages允许您在完成之前强制触发此事件。
希望这对某人有帮助。使用Silverlight 5和Post-Script打印机支持,很多具有PostScript仿真器的打印机可能不兼容,但也不会默认为位图打印。此解决方法修复了这一问题,使得在LOB类型的应用程序中打印更稳定。