0

Я использую элемент управления C1ReportViewer и уже отправил вопрос на форумах C1, однако я думал, что разместил бы здесь также, чтобы узнать, столкнулся ли кто-нибудь с аналогичной проблемой. Элемент управления использует общий метод PrintDocument() silverlight.Silverlight 5 печатает искаженные отчеты

При печати Crystal Report с этого элемента управления в Silverlight 5 иногда отчет печатает искаженные, что означает текст разного размера, суженные линии и, как правило, не в положении. Он также редко печатает весь отчет.

Я сузил проблему до нескольких принтеров и только с машинами, использующими их 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/PDFs? И в том случае, если у кого-то есть, какие решения вы придумали?

Много Оценил,

Грег

ответ

0

я был в состоянии придумать решение для этого. Вместо использования встроенной функции печати C1 я смог написать код для принудительной печати растровых изображений.

Сначала я создал новый документ PrintDocument и подключил некоторые обработчики для своего события PrintPage.

mobjPrintDocument = New PrintDocument 
RemoveHandler mobjPrintDocument.PrintPage, AddressOf Print_Report 
AddHandler mobjPrintDocument.PrintPage, AddressOf Print_Report 

Затем мы можем вызвать функцию PrintBitmap в PrintDocument, когда вы хотите распечатать. Здесь я делаю это, когда пользователь нажимает кнопку «Печать».

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 и PostScript Script многие принтеры, у которых есть эмулятор PostScript, могут быть несовместимы, но также не будут по умолчанию печатать растровые изображения. Это обходное решение устраняет это, делая печать немного более стабильной в приложении типа LOB.