好的,终于想通了。
该博客文章几乎包含了我需要的所有内容,但我将在此处发布完整答案以供参考。
我最终在幕后使用了报表查看器对象,但这只是为了方便,因为它不是必需的。
第一步是询问用户打印机设置:
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