ок, наконец разобрался.
проверьте эту ссылку:
Печать отчетов Служб 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