0

我正在使用 C1ReportViewer 控件,并且已经在 C1 论坛上发布了一个问题,但是我想我也会在这里发布,看看是否有人遇到过类似的问题。该控件使用通用silverlight PrintDocument() 方法。

在 Silverlight 5 中从该控件打印 Crystal 报表时,有时报表打印出乱码,这意味着不同大小的文本、锥形线条并且通常位置不正确。它也很少打印整个报告。

我已将问题缩小到几台打印机,并且仅限于使用其 32 位驱动程序的机器。基于此,以及对 Silverlight 5 所做的更改,我假设问题与 PostScript 兼容性有关。但是,由于我们的产品是 LOB 应用程序,因此执行 PS 兼容的打印机和打印机驱动程序几乎是不可能的。

因此,如果这确实是后期脚本问题,则根据 silverlight 5 的文档,PrintDocument() 方法应该故障恢复为默认位图方法。请参阅我是否正确理解 SilverLight 5 中的矢量打印仅适用于 Postscript 打印机?

我对 stackoverflow 的问题是:有没有人在 Silverlight 5 中打印时遇到过类似的问题,或者有没有人成功打印 Crystal Reports/PDF?如果有人有机会,你想出了什么解决方案?

非常感激,

格雷格

4

1 回答 1

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 类型应用程序中的打印更加稳定。

于 2012-04-27T14:03:01.673 回答