How to Print an ASP.NET Local Report RDLC without Preview or Printer Dialog

Neodynamic

Well-known member
Joined
Dec 5, 2005
Messages
137
Programming Experience
10+
In this walkthrough, you'll learn how to print a Local Report (RDLC) from an ASP.NET website to the client printer without previewing the report through Visual Studio ReportViewer control. In fact, you'll be able to print the RDLC report without displaying any Printer Dialog at all! And one important thing... it works with any browser on Windows OS like IE (6 or later), Chrome, Firefox, Opera & Safari!


Print RDLC Local Report without Preview or Print Dialog

The sample report is a Local Report RDLC designed to print a product list of the classic and famous MS Northwind Traders database. In a simple ASP.NET webpage, we provide a preview of such report (just for you to know what to expect after printing) and all the needed code in C# and VB to print the report without previewing or displaying any printer dialog by using WebClientPrint for ASP.NET solution

You can print the RDLC local report to the Default client printer as well as to any other installed printer at the client machine.

Requirements
- WebClientPrint 2.0 for ASP.NET (or greater)
- ASP.NET 3.5 (or greater)
- Visual Studio 2010 / VWD 2010 (or greater)
- jQuery 1.4.1 (or greater)
- WebClientPrint Processor 2.0 for Windows & Adobe Reader need to be installed at the client machine

NOTE: In this guide we used VS 2010 and ASP.NET 3.5 but the same code & concept can be applied to VS 2005/2008 and ASP.NET 2.0 as well as VS 2012 and ASP.NET 4.x

Follow up these steps
- Download and install WebClientPrint for ASP.NET
- Open Visual Studio and create a new ASP.NET 3.5 Website naming it PrintRDLCReport
- Add a reference to Neodynamic.SDK.WebClientPrint.dll to your project
- Open your web.config file and add the following entries:

<system.web>
<httpHandlers>
<add verb="*" path="wcp.axd" type="Neodynamic.SDK.Web.WebClientPrint, Neodynamic.SDK.WebClientPrint"/>
</httpHandlers>
</system.web>
<system.webServer>
<handlers>
<add name="WCP" verb="*" path="wcp.axd" type="Neodynamic.SDK.Web.WebClientPrint, Neodynamic.SDK.WebClientPrint"/>
</handlers>
</system.webServer>

- Open the default.aspx page and paste the following markup. The task of this page is to try to detect the WCPP and ask the user to install it if it's missing.

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
<style>
body{font: 13px 'Segoe UI', Tahoma, Arial, Helvetica, sans-serif;}
</style>

<%-- WCPP-detection meta tag for IE10 --%>
<%= Neodynamic.SDK.Web.WebClientPrint.GetWcppDetectionMetaTag() %>
</head>
<body>
<form id="form1" runat="server">
<div id="msgInProgress">
<div id="mySpinner" style="width:32px;height:32px"></div>
<br />
Detecting WCPP utility at client side...
<br />
Please wait a few seconds...
<br />
</div>
<div id="msgInstallWCPP" style="display:none;">
<h3>#1 Install WebClientPrint Processor (WCPP)!</h3>
<p>
<strong>WCPP is a native Windows app (without any dependencies!)</strong> that handles all print jobs
generated by the <strong>WebClientPrint ASP.NET component</strong> at the server side. The WCPP
is in charge of the whole printing process and can be
installed on Windows 98, 2000, Me, XP, Vista, Windows 7 and Windows 8 (Desk-mode). It can print to Serial Port RS232 (e.g. COM1),
Parallel Port (e.g. LPT1), your Windows-Installed Printers (USB) and Network/IP Ethernet printers.
</p>
<p>
The <strong>WCPP</strong> utility <strong>is digitally-signed with a Windows Authenticode</strong> issued by <a href="http://www.digicert.com">DigiCert, Inc.</a>. <strong>Install WCPP only if the <u>Publisher is Neodynamic SRL</u></strong>, otherwise do not proceed. <br /><br />
<a href="http://www.neodynamic.com/downloads/wcpp20-installer.exe" target="_blank">Download and Install WCPP from Neodynamic website</a><br />
</p>
<h3>#2 After installing WCPP...</h3>
<p>
<a href="PrintRDLC.aspx">You can go and test WebClientPrint for ASP.NET</a>
</p>
</div>
</form>
<%-- Add Reference to jQuery at Google CDN --%>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js"></script>
<%-- Add Reference to spin.js (an animated spinner) --%>
<script src="http://fgnass.github.io/spin.js/dist/spin.min.js"></script>
<script type="text/javascript">
var wcppPingDelay_ms = 10000;

function wcppDetectOnSuccess(){
<%-- WCPP utility is installed at the client side
redirect to WebClientPrint sample page --%>
<%-- get WCPP version --%>
var wcppVer = arguments[0];
if(wcppVer == "2.0.0.0")
window.location.href = "PrintRDLC.aspx";
else //force to install WCPP v2.0
wcppDetectOnFailure();
}

function wcppDetectOnFailure() {
<%-- It seems WCPP is not installed at the client side
ask the user to install it --%>
$('#msgInProgress').hide();
$('#msgInstallWCPP').show();
}

$(document).ready(function () {
<%-- Create the Spinner with options (spin.js) --%>
var spinner = new Spinner({
lines: 12,
length: 7,
width: 3,
radius: 10,
color: '#336699',
speed: 1,
trail: 60
}).spin($('#mySpinner')[0]);
});

</script>

<%-- WCPP detection script --%>
<%= Neodynamic.SDK.Web.WebClientPrint.CreateWcppDetectionScript() %>

</body>
</html>

The Local Report RDLC we've created for this sample is a simple product list for MS Northwind Traders database and it has an XML data source. The report looks like the following figure.


Sample RDLC report featuring Northwind Traders product list

- Download and copy both MyReport.rdlc & NorthwindProducts.xml files to your website root folder
- Finally, add a new ASPX page and name it PrintRDLC.aspx (be sure to UNSELECT the "Place code in separate file" checkbox)

This page allows your user to print the RDLC report to local printers. It basically converts the report to PDF format and then passes it to the WCPP utility to print it to the specified printer. The user is required to have Adobe Reader installed to get this code working.

Please paste the following markup and code depending on your preferred language i.e. C# or VB on your PrintRDLC.aspx file.

VB
<%@ Page Language="VB" %>
<%@ Import Namespace="System.Data" %>
<%@ Import Namespace="System.Collections.Generic" %>
<%@ Import Namespace="System.IO" %>
<%@ Import Namespace="Neodynamic.SDK.Web" %>
<%@ Register Assembly="Microsoft.ReportViewer.WebForms, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
Namespace="Microsoft.Reporting.WebForms" TagPrefix="rsweb" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<script runat="server">
Protected Sub Page_Init(sender As Object, e As System.EventArgs)
'Print report???
If (WebClientPrint.ProcessPrintJob(Request)) Then
'create PDF version of RDLC report
Dim myReport As New LocalReport()
myReport.ReportPath = "MyReport.rdlc"
Dim ds As New DataSet()
ds.ReadXml(Server.MapPath("~/NorthwindProducts.xml"))
myReport.DataSources.Add(New ReportDataSource("Products", ds.Tables(0)))

'Export to PDF. Get binary content.
Dim pdfContent As Byte() = myReport.Render("PDF", Nothing, Nothing, Nothing, Nothing, Nothing, Nothing)

'Now send this file to the client side for printing
'IMPORTANT: Adobe Reader needs to be installed at the client side

Dim useDefaultPrinter As Boolean = (Request("useDefaultPrinter") = "checked")
Dim printerName As String = Server.UrlDecode(Request("printerName"))

'create a temp file name for our PDF report...
Dim fileName As String = Guid.NewGuid().ToString("N") + ".pdf"

'Create a PrintFile object with the pdf report
Dim file As New PrintFile(pdfContent, fileName)
'Create a ClientPrintJob and send it back to the client!
Dim cpj As New ClientPrintJob()
'set file to print...
cpj.PrintFile = file
'set client printer...
If (useDefaultPrinter OrElse printerName = "null") Then
cpj.ClientPrinter = New DefaultPrinter()
Else
cpj.ClientPrinter = New InstalledPrinter(printerName)
End If
'send it...
cpj.SendToClient(Response)
End If
End Sub

Protected Sub Page_Load(sender As Object, e As System.EventArgs)
If (IsPostBack = False) Then
'load report in case user want to preview it
ReportViewer1.ProcessingMode = ProcessingMode.Local
ReportViewer1.LocalReport.ReportPath = "MyReport.rdlc"
Dim ds As New DataSet()
ds.ReadXml(Server.MapPath("~/NorthwindProducts.xml"))
ReportViewer1.LocalReport.DataSources.Add(New ReportDataSource("Products", ds.Tables(0)))
End If
End Sub
</script>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>Print Local Report RDLC without Previewing nor Print Dialog!</title>
<style>
body{font: 13px 'Segoe UI', Tahoma, Arial, Helvetica, sans-serif;background:#ddd;color:#333;margin:0;}
h1{background:#333;color:#fff;padding:10px;font: 29px 'Segoe UI Light', 'Tahoma Light', 'Arial Light', 'Helvetica Light', sans-serif;}
.myRow{width:auto;padding:0 20px 0 20px;height:auto;}
.myMenu{float:left;margin:0 20px 0 0;padding:2px;color:#333;}
.cBlue{border-bottom: 5px solid #6B89B7;}
.cYellow{border-bottom: 5px solid #FCAA25;}
.cSand{border-bottom: 5px solid #CCCC66;}
</style>
</head>
<body>
<%-- Store User's SessionId --%>
<input type="hidden" id="sid" name="sid" value="<%=Session.SessionID%>" />

<form id="form1" runat="server">
<h1>Print Local Report RDLC without Previewing nor Print Dialog!</h1>
<div class="myRow">
<a href="#" onclick="DisplayPanel(0);">
<div class="myMenu cBlue">
<h2>Print Report</h2>
<p>Print the report without previewing it!</p>
</div>
</a>
<a href="#" onclick="DisplayPanel(1);">
<div class="myMenu cYellow">
<h2>Preview Report</h2>
<p>Display the report that will be printed</p>
</div>
</a>

<a href="http://www.neodynamic.com/products/printing/raw-data/aspnet-mvc/" target="_blank">
<div class="myMenu cSand">
<h2>About WebClientPrint</h2>
<p>Know more about WebClientPrint for ASP.NET</p>
</div>
</a>
</div>
<div class="myRow" style="clear:both" id="pnlReport">
<br /><br />
<rsweb:ReportViewer ID="ReportViewer1" runat="server" Height="450px" Width="790px">
</rsweb:ReportViewer>
</div>
<div class="myRow" style="clear:both;background-color:#e3e3e3;" id="pnlPrintSettings">
<br />
<h3>Print the RDLC sample report.</h3>
<label class="checkbox">
<input type="checkbox" id="useDefaultPrinter"> <strong>Use default printer</strong> or...
</label>
<div id="loadPrinters">
<br />
WebClientPrint can detect the installed printers in your machine.
<br />
<input type="button" onclick="javascript:jsWebClientPrint.getPrinters();" value="Load installed printers..." />
<br /><br />
</div>
<div id="installedPrinters" style="visibility:hidden">
<br />
<label for="installedPrinterName">Select an installed Printer:</label>
<select name="installedPrinterName" id="installedPrinterName"></select>
</div>
<br /><br />

<input type="button" style="font-size:18px" onclick="javascript:jsWebClientPrint.print('useDefaultPrinter=' + $('#useDefaultPrinter').attr('checked') + '&printerName=' + $('#installedPrinterName').val());" value="Print Report..." />

<script type="text/javascript">
var wcppGetPrintersDelay_ms = 5000; //5 sec
function wcpGetPrintersOnSuccess(){
<%-- Display client installed printers --%>
if(arguments[0].length > 0){
var p=arguments[0].split("|");
var options = '';
for (var i = 0; i < p.length; i++) {
options += '<option>' + p + '</option>';
}

$('#installedPrinters').css('visibility','visible');
$('#installedPrinterName').html(options);
$('#installedPrinterName').focus();
$('#loadPrinters').hide();
}else{
alert("No printers are installed in your system.");
}
}

function wcpGetPrintersOnFailure() {
<%-- Do something if printers cannot be got from the client --%>
alert("No printers are installed in your system.");

}
</script>
</div>
<asp:ScriptManager ID="ScriptManager1" runat="server">
</asp:ScriptManager>
</form>
<%-- Add Reference to jQuery at Google CDN --%>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js"></script>
<%-- Register the WebClientPrint script code --%>
<%=Neodynamic.SDK.Web.WebClientPrint.CreateScript()%>
<script type="text/javascript">
$(document).ready(function () {
$('#pnlReport').hide();
});
function DisplayPanel() {
$('#pnlReport').hide();
$('#pnlPrintSettings').hide();
if (arguments[0] == 0) {
$('#pnlPrintSettings').show();
} else if (arguments[0] == 1) {
$('#pnlReport').show();
}
}
</script>
</body>
</html>

C#
<%@ Page Language="C#" %>

<%@ Import Namespace="System.Data" %>
<%@ Import Namespace="System.Collections.Generic" %>
<%@ Import Namespace="System.IO" %>
<%@ Import Namespace="Neodynamic.SDK.Web" %>

<%@ Register Assembly="Microsoft.ReportViewer.WebForms, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
Namespace="Microsoft.Reporting.WebForms" TagPrefix="rsweb" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<script runat="server">

protected void Page_Init(object sender, EventArgs e)
{
//Print report???
if (WebClientPrint.ProcessPrintJob(Request))
{
//create PDF version of RDLC report
LocalReport myReport = new LocalReport();
myReport.ReportPath = "MyReport.rdlc";
DataSet ds = new DataSet();
ds.ReadXml(Server.MapPath("~/NorthwindProducts.xml"));
myReport.DataSources.Add(new ReportDataSource("Products", ds.Tables[0]));

//Export to PDF. Get binary content.
string mimeType;
string encoding;
string fileNameExtension;
string[] streams;
Warning[] warnings;

byte[] pdfContent = myReport.Render("PDF", null, out mimeType, out encoding, out fileNameExtension, out streams, out warnings);

//Now send this file to the client side for printing
//IMPORTANT: Adobe Reader needs to be installed at the client side

bool useDefaultPrinter = (Request["useDefaultPrinter"] == "checked");
string printerName = Server.UrlDecode(Request["printerName"]);

//create a temp file name for our PDF report...
string fileName = Guid.NewGuid().ToString("N") + ".pdf";

//Create a PrintFile object with the pdf report
PrintFile file = new PrintFile(pdfContent, fileName);
//Create a ClientPrintJob and send it back to the client!
ClientPrintJob cpj = new ClientPrintJob();
//set file to print...
cpj.PrintFile = file;
//set client printer...
if (useDefaultPrinter || printerName == "null")
cpj.ClientPrinter = new DefaultPrinter();
else
cpj.ClientPrinter = new InstalledPrinter(printerName);
//send it...
cpj.SendToClient(Response);

}
}

protected void Page_Load(object sender, EventArgs e)
{
if (IsPostBack == false)
{
//load report in case user want to preview it
ReportViewer1.ProcessingMode = ProcessingMode.Local;
ReportViewer1.LocalReport.ReportPath = "MyReport.rdlc";
DataSet ds = new DataSet();
ds.ReadXml(Server.MapPath("~/NorthwindProducts.xml"));
ReportViewer1.LocalReport.DataSources.Add(new ReportDataSource("Products", ds.Tables[0]));
}

}

</script>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>Print Local Report RDLC without Previewing nor Print Dialog!</title>
<style>
body{font: 13px 'Segoe UI', Tahoma, Arial, Helvetica, sans-serif;background:#ddd;color:#333;margin:0;}
h1{background:#333;color:#fff;padding:10px;font: 29px 'Segoe UI Light', 'Tahoma Light', 'Arial Light', 'Helvetica Light', sans-serif;}
.myRow{width:auto;padding:0 20px 0 20px;height:auto;}
.myMenu{float:left;margin:0 20px 0 0;padding:2px;color:#333;}
.cBlue{border-bottom: 5px solid #6B89B7;}
.cYellow{border-bottom: 5px solid #FCAA25;}
.cSand{border-bottom: 5px solid #CCCC66;}
</style>

</head>
<body>
<%-- Store User's SessionId --%>
<input type="hidden" id="sid" name="sid" value="<%=Session.SessionID%>" />

<form id="form1" runat="server">
<h1>Print Local Report RDLC without Previewing nor Print Dialog!</h1>
<div class="myRow">
<a href="#" onclick="DisplayPanel(0);">
<div class="myMenu cBlue">
<h2>Print Report</h2>
<p>Print the report without previewing it!</p>
</div>

</a>

<a href="#" onclick="DisplayPanel(1);">
<div class="myMenu cYellow">
<h2>Preview Report</h2>
<p>Display the report that will be printed</p>
</div>
</a>

<a href="http://www.neodynamic.com/products/printing/raw-data/aspnet-mvc/" target="_blank">
<div class="myMenu cSand">
<h2>About WebClientPrint</h2>
<p>Know more about WebClientPrint for ASP.NET</p>
</div>
</a>
</div>
<div class="myRow" style="clear:both" id="pnlReport">
<br /><br />
<rsweb:ReportViewer ID="ReportViewer1" runat="server" Height="450px" Width="790px">
</rsweb:ReportViewer>
</div>
<div class="myRow" style="clear:both;background-color:#e3e3e3;" id="pnlPrintSettings">
<br />
<h3>Print the RDLC sample report.</h3>
<label class="checkbox">
<input type="checkbox" id="useDefaultPrinter"> <strong>Use default printer</strong> or...
</label>
<div id="loadPrinters">
<br />
WebClientPrint can detect the installed printers in your machine.
<br />
<input type="button" onclick="javascript:jsWebClientPrint.getPrinters();" value="Load installed printers..." />

<br /><br />
</div>
<div id="installedPrinters" style="visibility:hidden">
<br />
<label for="installedPrinterName">Select an installed Printer:</label>
<select name="installedPrinterName" id="installedPrinterName"></select>
</div>

<br /><br />
<input type="button" style="font-size:18px" onclick="javascript:jsWebClientPrint.print('useDefaultPrinter=' + $('#useDefaultPrinter').attr('checked') + '&printerName=' + $('#installedPrinterName').val());" value="Print Report..." />

<script type="text/javascript">
var wcppGetPrintersDelay_ms = 5000; //5 sec

function wcpGetPrintersOnSuccess(){
<%-- Display client installed printers --%>
if(arguments[0].length > 0){
var p=arguments[0].split("|");
var options = '';
for (var i = 0; i < p.length; i++) {
options += '<option>' + p + '</option>';
}
$('#installedPrinters').css('visibility','visible');
$('#installedPrinterName').html(options);
$('#installedPrinterName').focus();
$('#loadPrinters').hide();
}else{
alert("No printers are installed in your system.");
}
}

function wcpGetPrintersOnFailure() {
<%-- Do something if printers cannot be got from the client --%>
alert("No printers are installed in your system.");
}
</script>
</div>

<asp:ScriptManager ID="ScriptManager1" runat="server">
</asp:ScriptManager>

</form>

<%-- Add Reference to jQuery at Google CDN --%>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js"></script>

<%-- Register the WebClientPrint script code --%>
<%=Neodynamic.SDK.Web.WebClientPrint.CreateScript()%>

<script type="text/javascript">
$(document).ready(function () {
$('#pnlReport').hide();
});

function DisplayPanel() {
$('#pnlReport').hide();
$('#pnlPrintSettings').hide();
if (arguments[0] == 0) {
$('#pnlPrintSettings').show();
} else if (arguments[0] == 1) {
$('#pnlReport').show();
}
}
</script>

</body>
</html>


- That's it! Run your website and test it. Click on Print Report to print the RDLC report without preview. You can print it to the Default client printer or you can get a list of the installed printers available at the client machine and select one for printing the report.

Links:
This Demos
Demos
Download WebClientPrint for ASP.NET
More Information about Neodynamic WebClientPrint for ASP.NET

Neodynamic
NET Components & Controls
Barcode, Labeling, Printing & Imaging components for .NET by Neodynamic
 
Top Bottom