Cliff Green's Blog

Controlling Page Size in a Reporting Services Report

The default page size in the US is Letter, 8.5in x 11in.  In other parts of the world A4 (8.3in x 11.7in) is the standard.  Reports in Reporting Services are hard coded as part of the design process.  In order to control the page size in the rendering process we need to pass the proper Device Information Settings to the report at run time.  This will work for physical page oriented renders like PDF, Image, etc.  This is a simple Xml string that can be passed as a parameter to the report in order to control these settings.  Each export type has a different set of properties that can be overridden and controlled in this way.  The Device Info Settings for a PDF document can be found here.

If we are using the Report Viewer control to display the reports we will need to disable the ability to print a report and potentially disable exporting the report, depending on the use cases we want to support.  To still provide this capability to our users we can expose the print and export properties using a link button or other postback capable control.  We can also expose the available print and export formats using a drop down or other mechanism.  Now when the user chooses to print or export the report we can override the process by passing the device info settings for the page height and width when the report is rendered.  In the example below we are exporting to PDF and passing the page height and width to match an A4 paper size as the targeted device (line 66).

   1: private void RenderReportToClient()
   2: {
   3:     //set credentials
   4:     RSExecuteProxy.ReportExecutionService rs = new RSExecuteProxy.ReportExecutionService();
   5:     rs.Credentials = System.Net.CredentialCache.DefaultCredentials;
   6:  
   7:     RSProxy.ReportingService2005 rsInfo = new RSProxy.ReportingService2005();
   8:     rsInfo.Credentials = System.Net.CredentialCache.DefaultCredentials;
   9:  
  10:     // init render args
  11:     byte[] result = null;
  12:     string reportPath = rptViewer.ServerReport.ReportPath;
  13:     string format = "PDF";
  14:     string historyId = null;
  15:  
  16:     string encoding;
  17:     string mimeType;
  18:     string extension;
  19:     RSExecuteProxy.Warning[] warnings = null;
  20:     string[] streamIDs = null;
  21:  
  22:     //init exec info
  23:     RSExecuteProxy.ExecutionInfo execInfo = new RSExecuteProxy.ExecutionInfo();
  24:     RSExecuteProxy.ExecutionHeader execHeader = new RSExecuteProxy.ExecutionHeader();
  25:  
  26:     rs.ExecutionHeaderValue = execHeader;
  27:  
  28:     //get report
  29:     execInfo = rs.LoadReport(reportPath, historyId);
  30:  
  31:     String SessionId = rs.ExecutionHeaderValue.ExecutionID;
  32:  
  33:     //get parameter info
  34:     ReportParameterInfoCollection parameters = rptViewer.ServerReport.GetParameters();
  35:  
  36:     //figure out how many parameters we will have 
  37:     //those with multi-value will need there own ParameterValue in the array
  38:     int paramCount = 0;
  39:  
  40:     foreach (ReportParameterInfo pramInfo in parameters)
  41:     {
  42:         paramCount += pramInfo.Values.Count;
  43:     }
  44:  
  45:  
  46:     RSExecuteProxy.ParameterValue[] prams = new SSRSWeb.RSExecuteProxy.ParameterValue[paramCount];
  47:  
  48:     int currentPramPosition = 0;
  49:  
  50:     //set pram values
  51:     foreach (ReportParameterInfo pramInfo in parameters)
  52:     {
  53:         foreach (string pramValue in pramInfo.Values)
  54:         {
  55:             prams[currentPramPosition] = new SSRSWeb.RSExecuteProxy.ParameterValue();
  56:             prams[currentPramPosition].Label = pramInfo.Name;
  57:             prams[currentPramPosition].Name = pramInfo.Name;
  58:             prams[currentPramPosition].Value = pramValue;
  59:             currentPramPosition++;
  60:         }
  61:     }
  62:  
  63:     rs.SetExecutionParameters(prams, "en-US");
  64:  
  65:     //build the device settings  (A4 8.3 × 11.7)
  66:     string deviceInfo = string.Format("<DeviceInfo><PageHeight>{0}</PageHeight><PageWidth>{1}</PageWidth></DeviceInfo>", "11.7in", "8.3in");
  67:  
  68:     //get report bytes
  69:     result = rs.Render(format, deviceInfo, out extension, out encoding, out mimeType, out warnings, out streamIDs);
  70:  
  71:     Response.ClearContent();
  72:     Response.AppendHeader("Content-Disposition", "inline;filename=report.pdf");
  73:     Response.AppendHeader("content-length", result.Length.ToString());
  74:     Response.ContentType = "application/pdf";
  75:     Response.BinaryWrite(result);
  76:     Response.Flush();
  77:     Response.Close();
  78: }

When the report is saved you can view the PDF and examine the properties and notice that the page height and width is 8.3in x 11.7in as specified.

Published Wednesday, November 12, 2008 8:29 PM by green.cliff

Comment Notification

If you would like to receive an email when updates are made to this post, please register here

Subscribe to this post's comments using RSS

Leave a Comment

(required) 
(optional)
(required) 

  
Enter Code Here: Required
Submit

© 2009 Microsoft Corporation. All rights reserved. Terms of Use  |  Trademarks  |  Privacy Statement
Microsoft
Page view tracker