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類型應用程序中的打印更穩定一些。