Live URL: https://nemely.com/blog/generate-pdf-report-in-dynamics-crm-365/ 

There is plenty of material available to achieve this very commonly needed functionality to generate PDF of the existing report in your CRM system. I will give some tips and tricks to achieve this in most efficient way. 

The requirement is to download PDF format of the SSRS report (OOB or Custom) on a button click either on home page grid or on a button click on the form. 

This can be divided in steps: 

Step 1: Get ReportSession and ControlID 

function getReportingSession(formContext) {  
try {  
var selectedIds = formContext.data.entity.getId();  
var reportName = “”;  
var reportGuid = null;  
reportName = ‘nameofthereport.rdl’; //for e.g. Quote.rdl  
reportGuid = getReportGuidByName(“nameofthereport”); //OR Report GUID – Replace with your report GUID  
if (reportGuid) {  
//use this path for version 8.2  
//var pth = Xrm.Utility.getGlobalContext().getClientUrl() + “/CRMReports/rsviewer/QuirksReportViewer.aspx”;  
//use this path for version 9.0 and above  
var pth = Xrm.Utility.getGlobalContext().getClientUrl() + “/CRMReports/rsviewer/reportviewer.aspx”;  
var retrieveEntityReq = new XMLHttpRequest();  
retrieveEntityReq.open(“POST”, pth, false);  
retrieveEntityReq.setRequestHeader(“Accept”, “*/*”);  
retrieveEntityReq.setRequestHeader(“Content-Type”, “application/x-www-form-urlencoded”);  
var strParameterXML = “”;  
var queryString = “”;  
//OOB report  
var strParameterXML = “<ReportFilter><ReportEntity paramname=’P1′ displayname=’Quotes’><fetch version=’1.0′ output-format=’xml-platform’ mapping=’logical’ distinct=’false’><entity name=’quote’><all-attributes/><filter type=’and’><condition attribute=’quoteid’ operator=’eq’ uitype=’quote’ value='” + selectedIds.toString().replace(“{“, “”).replace(“}”, “”) + “‘/></filter></entity></fetch></ReportEntity></ReportFilter>”;  
var queryString = “id=%7B” + reportGuid + “%7D&uniquename=” + Xrm.Utility.getGlobalContext().organizationSettings.uniqueName + “&iscustomreport=false&reportnameonsrs=&reportName=” + reportName + “&isScheduledReport=false&CRM_Filter=” + strParameterXML;  
retrieveEntityReq.send(queryString);  
var x = retrieveEntityReq.responseText.lastIndexOf(“ReportSession=”);  
var y = retrieveEntityReq.responseText.lastIndexOf(“ControlID=”);  
var ret = new Array();  
ret[0] = retrieveEntityReq.responseText.substr(x + 14, 24);  
ret[1] = retrieveEntityReq.responseText.substr(x + 10, 32);  
return ret;  
}  
}  
catch (e) {  
console.log(“Error in getReportingSession function : ” + e.message);  
throw new Error(“Error in getReportingSession function : ” + e.message);  
}  
}  
https://gist.github.com/cherilynski/92442574f90ba33857847f3df13cce7d/raw/c92bc1384aa5ead2516e929ccee5616c1f781394/Get%20ReportSession%20and%20ControlID

Step 2: Download report as PDF 

function runReportToPrint(formContext) {  
try {  
var params = getReportingSession();  
var strParameter = “nameofthefile”;  
// Code for web browser or CRM for Outlook only goes here.  
var newPth = Xrm.Utility.getGlobalContext().getClientUrl() + “/Reserved.ReportViewerWebControl.axd?ReportSession=” + params[0] + “&Culture=1033&CultureOverrides=True&UICulture=1033&UICultureOverrides=True&ReportStack=1&ControlID=” + params[1] + “&OpType=Export&FileName=” + strParameter + “&ContentDisposition=OnlyHtmlInline&Format=PDF”;  
window.open(newPth, “_self”);  
}  
catch (e) {  
console.log(“Error in runReportToPrint function : ” + e.message);  
throw new Error(“Error in runReportToPrint function : ” + e.message);  
}  
}  
https://gist.github.com/cherilynski/2d667ca19c011e88e7e288425faefa3d/raw/2099f1d6f570a6b4119081d7e25a9aa906125ea3/Download%20report%20as%20PDF

Tips and Tricks 

It is very important that you prepare parameter XML and query string correct in order to generate PDF report smoothly. I will show you how you can smoothen this.  

var queryString = “id=%7B” + reportGuid + “%7D&uniquename=” + Xrm.Utility.getGlobalContext().organizationSettings.u 

https://gist.github.com/cherilynski/cc0b516f0e39a4634184cb2295151f2c/raw/341e26e930ef3efe684332c4cc8eec972e3524b3/Trick%201

var queryString = “id=%7B” + reportGuid + “%7D&uniquename=” + Xrm.Utility.getGlobalContext().organizationSettings.uni 

https://gist.github.com/cherilynski/576f9ea45db48bae005a4a324f350120/raw/deb11d382c52928bc673bb349df5a50b685302e8/Trick%202

var queryString = “id=%7B” + reportGuid + “%7D&uniquename=” + Xrm.Utility.getGlobalContext().organizationSettings.uniqueNam 

https://gist.github.com/cherilynski/6143de754f47d72ff98498d439ca3efa/raw/5b4e1dece16210263a4a19db8c8482bf921e67e5/Trick%203

To get parameter XML, use fiddler to get all details you need. 

Hope this helps to achieve your goal. Please share your comments and contact us if you have any questions.  

Get resource