Printing ServerReport without Preview

前端 未结 4 1223
时光取名叫无心
时光取名叫无心 2020-12-14 11:55

I have a SQLServer 2005 Reporting Services ServerReport deployed and frequently used by my Winforms app (Framework 2.0) via the ReportViewer control.

What I need is

相关标签:
4条回答
  • 2020-12-14 12:21

    Folks trying to use this code with SQL Server 2008 R2 will find that it only prints only the first page of multi-page reports. There's a new "behavior" wherein the array returned to streamids is empty. Please let Microsoft know you care here:

    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#

    0 讨论(0)
  • 2020-12-14 12:32

    2 caveats to the answer given by David above:-

    1) The order in which the streams labels are returned on SQL2005 is usually from the second page to the last, but on a heavily loaded maching (e.g. production environment) it is quite possible for them to be returned in arbitrary order.

    The stream ids take the form <reportname>_nn where nn is a number. This makes it a little tricky to sort since the report name will be alphabetic and the numbers are just short form, so page "myreport_2" will sort after page "myreport_10". Leading to my second caveat

    2) On SQL 2005 the report suffixes start at 2, on SQL 2008 they start at 1 (for page 2)

    0 讨论(0)
  • 2020-12-14 12:34

    I see this sample, but don't know if it suits your needs: http://www.gotreportviewer.com/EMFPrint.zip

    0 讨论(0)
  • 2020-12-14 12:39

    Ok, Finally figured out.

    That blog post has almost everything that I needed, but I'm going to post the full answer here for references.

    I ended up using the report viewer object behind the scenes, but only for convenience, since it's not required.

    The first step is asking the user for the printer settings:

    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
    

    Having that, we proceed to configure our report call: Modifying this string, you can get to print on any paper size and any orientation (switching height and width for landscape), but the report itself must be configured in the same page layout.

    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 = ""
    

    Finally, we render the report with all its pages.

    Note that if the report has only one page, the renderStream method is never used.

    rpt_control is the report viewer control, previously configured and aiming at a server report.

    Note allso that in this code we add pages to a list. This list is a global variable, since it's needed in the PrintPageHandler method.

    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()
    

    Until now, we haven't done any printing at all, this is actually handled by the PrintPageHandler method that we referenced earlier.

    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
    
    0 讨论(0)
提交回复
热议问题