0

我正在使用C1ReportViewer控件,并且已经在C1论坛发布了一个问题,但是我想我会在这里发帖以查看是否有人遇到过类似的问题。该控件使用通用的silverlight PrintDocument()方法。Silverlight 5打印乱码报告

当在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

我能拿出一个解决方案。我没有使用内置的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类型应用程序中的打印更稳定一些。