在运行时更改报告中的打印机设置

时间:2009-08-21 08:50:38

标签: reporting-services settings printing

我们可以在SSRS 2008中的运行时更改打印机设置吗?

例如,如果报告在Legal尺寸纸张上,但我想在运行时在A4横向或Legal上打印,具体取决于传入的参数。

1 个答案:

答案 0 :(得分:1)

答案是不,除非你自己编写解决方案,否则你不能。报表查看器控件不支持此操作。您可以选择创建自定义打印解决方案,也可以操作RDLC文件以手动修改设置。

如果您决定动态修改RDLC文件,则需要将RDLC文件加载到内存中,修改XML文件以指定新的页面设置,然后在报表查看器中重新加载RDLC文件。

如果您决定进行手动打印,可以使用以下VB.NET代码来帮助您入门:

  Dim m_pageSettings As PageSettings          'Stores page settings for printout
  Dim m_currentPage As Integer                'Used for index of pages
  Private m_pages As New List(Of Stream)()    'Stores a stream for each pages

  'Event fires when printDocument starts printing - reset page index to zero
  Private Sub PrintDocument1_BeginPrint(ByVal sender As System.Object, ByVal e As System.Drawing.Printing.PrintEventArgs) Handles PrintDocument1.BeginPrint
    m_currentPage = 0
  End Sub

  'Function that prints all the pages included in the report
  Private Sub PrintDocument1_PrintPage(ByVal sender As System.Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage
    Dim pageToPrint As Stream = m_pages(m_currentPage)
    pageToPrint.Position = 0

    Dim pageMetaFile As Metafile = New Metafile(pageToPrint)      'create an image(metafile) of the report page
    Using (pageMetaFile)
      'Create a rectangle the size of our report - include margins
      ' Dim adjustedRect As Rectangle = New Rectangle( _
      '    e.PageBounds.Left - CType(e.PageSettings.HardMarginX, Integer), _
      '    e.PageBounds.Top - CType(e.PageSettings.HardMarginY, Integer), _
      '    e.PageBounds.Width, _
      '    e.PageBounds.Height)

      Dim adjustedRect As Rectangle = New Rectangle( _
    e.PageBounds.Left, _
    e.PageBounds.Top, _
    e.PageBounds.Width, _
    e.PageBounds.Height)

      e.Graphics.FillRectangle(Brushes.White, adjustedRect)   'Fill rectangle with WHITE background
      e.Graphics.DrawImage(pageMetaFile, adjustedRect)        'Draw report in rectangle - this will be printed
      m_currentPage = m_currentPage + 1
      e.HasMorePages = m_currentPage < m_pages.Count          'If more pages are left - keep processing
    End Using
  End Sub

  'Event fires when PrintDocument queries for PageSettings.  Return a copy of m_pagesettings.
  Private Sub PrintDocument1_QueryPageSettings(ByVal sender As System.Object, ByVal e As System.Drawing.Printing.QueryPageSettingsEventArgs) Handles PrintDocument1.QueryPageSettings
    e.PageSettings = CType(m_pageSettings.Clone, PageSettings)
  End Sub

  'Render the report in a EMF - This function creates metafiles(images) of each page in the report
  Private Sub RenderAllLocalReportPages(ByVal localReport As LocalReport)
    Dim deviceInfo As String = CreateEMFDeviceInfo()    'Enhanced MetaFile
    Dim warnings As Warning() = Nothing
    m_pages.Clear()
    localReport.Render("IMAGE", deviceInfo, AddressOf LocalReportCreateStreamCallback, warnings)
  End Sub

  'Callback function used with RenderAllLocalReportPages
  Private Function LocalReportCreateStreamCallback(ByVal name As String, ByVal extension As String, ByVal encoding As Encoding, ByVal mimeType As String, ByVal willSeek As Boolean) As Stream
    Dim stream As New MemoryStream()
    m_pages.Add(stream)
    Return stream
  End Function

  Private Function CreateEMFDeviceInfo() As String
    Dim paperSize As PaperSize = m_pageSettings.PaperSize
    Dim margins As Margins = m_pageSettings.Margins

    'The device info string defines the page range to print as well as the size of the page.
    'A start and end page of 0 means generate all pages.
    Return String.Format(CultureInfo.InvariantCulture, "<DeviceInfo><OutputFormat>emf</OutputFormat><StartPage>0</StartPage><EndPage>0</EndPage><MarginTop>{0}</MarginTop><MarginLeft>{1}</MarginLeft><MarginRight>{2}</MarginRight><MarginBottom>{3}</MarginBottom><PageHeight>{4}</PageHeight><PageWidth>{5}</PageWidth></DeviceInfo>", ToInches(margins.Top), ToInches(margins.Left), ToInches(margins.Right), ToInches(margins.Bottom), ToInches(paperSize.Height), ToInches(paperSize.Width))
  End Function

  'Convert report printing size to inches
  Private Shared Function ToInches(ByVal hundrethsOfInch As Integer) As String
    Dim inches As Double = hundrethsOfInch / 100.0R
    Return inches.ToString(CultureInfo.InvariantCulture) & "in"
  End Function

希望这会有所帮助。