Печать ServerReport без предварительного просмотра

У меня есть SQL Server 2005 Reporting Services ServerReport, развернутый и часто используемый моим приложением Winforms (Framework 2.0) с помощью элемента управления ReportViewer.

Мне нужно предоставить кнопку печати одним нажатием одной из форм приложения, которая запускает только диалог печати, не создавая ReportViewer.

Я экспериментировал с рендерингом отчета в массив байтов, но я не могу пройти.

Этот отчет содержит несколько страниц, поэтому я не знаю, будет ли рендеринг "Image", который работает для локальных отчетов, работать и для отчетов сервера.

Я искал бросок MSDN, но есть только ссылки на локальные отчеты:

http://msdn.microsoft.com/en-us/library/ms252091(VS.80).aspx

И небольшая информация, которую я могу получить на отчетах на стороне сервера, использует веб-ссылки на веб-службу ReportServer, и я не хочу этого.

http://blogs.msdn.com/bryanke/articles/71491.aspx

Есть ли способ распечатать отчет сервера, используя диалоговое окно печати, без отображения пользователя просмотра отчетов (я не против, если он за кулисами)?

Ответ 1

Хорошо, наконец понял.

проверить эту ссылку:  Печать отчетов Reporting Services за 2005 год

В этом блоге есть почти все, что мне нужно, но я собираюсь опубликовать полный ответ здесь для ссылок.

В итоге я использовал объект просмотра отчетов за кулисами, но только для удобства, поскольку он не требуется.

На первом этапе пользователь запрашивает настройки принтера:

Dim doc As New Printing.PrintDocument()
AddHandler doc.PrintPage, AddressOf PrintPageHandler
Dim dialog As New PrintDialog()
dialog.Document = doc
Dim print As DialogResult
print = dialog.ShowDialog()
doc.PrinterSettings = dialog.PrinterSettings

После этого мы переходим к настройке нашего вызова отчета: Модифицируя эту строку, вы можете печатать на любом размере бумаги и любой ориентации (высота и ширина переключения для пейзажа), но сам отчет должен быть настроен в том же макете страницы.

Dim deviceInfo As String = _
"<DeviceInfo>" + _
"<OutputFormat>emf</OutputFormat>" + _
"  <PageWidth>8.5in</PageWidth>" + _
"  <PageHeight>11in</PageHeight>" + _
"  <MarginTop>0.25in</MarginTop>" + _
"  <MarginLeft>0.25in</MarginLeft>" + _
"  <MarginRight>0.25in</MarginRight>" + _
"  <MarginBottom>0.25in</MarginBottom>" + _
"</DeviceInfo>"

Dim warnings() As Warning
Dim streamids() As String
Dim mimeType, encoding, filenameExtension, path As String
mimeType = "" : encoding = "" : filenameExtension = ""

Наконец, мы представляем отчет со всеми его страницами.

Обратите внимание, что если отчет имеет только одну страницу, метод renderStream никогда не используется.

rpt_control - это средство просмотра отчетов, предварительно настроенное и нацеленное на отчет сервера.

Заметим также, что в этом коде мы добавляем страницы в список. Этот список является глобальной переменной, поскольку он необходим в методе PrintPageHandler.

Dim data() As Byte
rpt_control.ServerReport.SetParameters(_parametros)
data = rpt_control.ServerReport.Render("Image", deviceInfo, mimeType, encoding, filenameExtension, streamids, warnings)
pages.Add(New Metafile(New MemoryStream(data)))

For Each pageName As String In streamids
    data = rpt_control.ServerReport.RenderStream("Image", pageName, deviceInfo, mimeType, encoding)
    pages.Add(New Metafile(New MemoryStream(data)))
Next
doc.Print()

До сих пор мы вообще не выполняли печать, это фактически обрабатывается методом PrintPageHandler, на который мы ссылались ранее.

Dim pages As New List(Of Metafile)
Dim pageIndex As Integer = 0
Private Sub PrintPageHandler(ByVal sender As Object, ByVal e As PrintPageEventArgs)
    Dim page As Metafile = pages(pageIndex)
    pageIndex += 1
    e.Graphics.DrawImage(page, 0, 0, page.Width, page.Height)
    e.HasMorePages = pageIndex < pages.Count
End Sub

Ответ 2

2 оговорки к ответу Давида выше: -

1) Порядок, в котором метки тегов возвращаются на SQL2005, обычно со второй страницы до последней, но при сильно загруженной обработке (например, производственной среде) вполне возможно, что они будут возвращены в произвольном порядке.

Идентификаторы потока принимают форму <reportname> _nn, где nn - число. Это делает немного сложнее сортировать, так как имя отчета будет буквенным, а цифры являются просто короткими, поэтому страница "myreport_2" будет сортироваться после страницы "myreport_10". Следуя моему второму предостережению

2) В SQL 2005 суффикс отчета начинается с 2, на SQL 2008 они начинаются с 1 (для страницы 2)

Ответ 3

Пользователи, пытающиеся использовать этот код с SQL Server 2008 R2, обнаруживают, что он печатает только первую страницу многостраничных отчетов. Там появилось новое "поведение", в котором массив, возвращаемый в streamids, пуст. Пожалуйста, сообщите Microsoft, что вы здесь заботитесь:

https://connect.microsoft.com/SQLServer/feedback/details/573997/with-ssrs-2008-r2-microsoft-reporting-winforms-serverreport-render-method-returns-no-stream-identifiers-for-image-format#