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.