Print RDLC Report Directly To Printer In MVC

Article Overview

  • Background
  • Prerequisites
  • How to print rdlc report directly to the printer in MVC
  • Complete example
  • Output
  • Summary

Background

There was a situation where I had to render an RDLC report into an MVC application and directly open it to the print dialog box.

Hence, I have created an rdlc report in MVC rendered that report as bytes using ReportViewer, and saved it to a pdf file. I have used PdfReader and added JavaScript to the pdf file through PdfStamper for the Mozilla browser issue. After that, I opened a print dialog using JavaScript.

Here, I have kept all the implementation details along with a complete example.

Prerequisites

  • You should have a basic knowledge of RDLC report implementation as well as MVC applications.
  • Reference of "Microsoft.ReportViewer.WebForms" and "iTextSharp"

How to print the RDLC report directly to the printer in MVC?

There are mainly four key steps to implement this.

  • Create rdlc report in MVC
  • Use ReportViewer and render as bytes
  • Create pdf file using PdfReader and add JavaScript to pdf file through PdfStamper
  • Open Print dialog using JavaScript

Now, let us see in detail.

Create RDLC report

Our first task is to add and create a report file for the project.

First, create an MVC project.

Second, add a new RDLC report by “Add New Item” => “Visual C#” => “Report” selection.

MVC Project

Third, design report. To make it easy to understand I have created one simple static report without any database connection just for simplicity.

Static report

User ReportViewer and render as bytes

Now, our second task is to use the (consume) report in the C# (code).

First, add the “Microsoft.ReportViewer.WebForms” reference to the project.

Web form

Second, add the “Microsoft.ReportViewer.WebForms” namespace.

using Microsoft.Reporting.WebForms;

Third, write code and set the report path.

reportViewer.LocalReport.ReportPath = Server.MapPath(@"~\Report1.rdlc");

Create pdf file using PdfReader and add JavaScript to pdf file through PdfStamper.

Now, we have to render (convert) the report into bytes and save it as a PDF file along with some JavaScript settings like the following.

First, render the report into bytes.

Warning[] warnings;
string[] streamids;
string mimeType, encoding, filenameExtension;

byte[] bytes = reportViewer.LocalReport.Render("Pdf", null, out mimeType, out encoding, out filenameExtension, out streamids, out warnings);

Second, add iTextShart using NuGet to save the pdf file and add some properties to that pdf file as described below.

Nuget

// File
string FileName = "Test_" + DateTime.Now.Ticks.ToString() + ".pdf";
string FilePath = HttpContext.Server.MapPath(@"~\TempFiles\") + FileName;

// Create and set PdfReader
PdfReader reader = new PdfReader(bytes);
FileStream output = new FileStream(FilePath, FileMode.Create);

string Agent = HttpContext.Request.Headers["User-Agent"].ToString();

// Create and set PdfStamper
PdfStamper pdfStamper = new PdfStamper(reader, output, '0', true);

if (Agent.Contains("Firefox"))
    pdfStamper.JavaScript = "var res = app.loaded('var pp = this.getPrintParams();pp.interactive = pp.constants.interactionLevel.full;this.print(pp);');";
else
    pdfStamper.JavaScript = "var res = app.setTimeOut('var pp = this.getPrintParams();pp.interactive = pp.constants.interactionLevel.full;this.print(pp);', 200);";

pdfStamper.FormFlattening = false;
pdfStamper.Close();
reader.Close();

Here, PdfStamper is being used to add JavaScript so that a print popup will open especially for the Firefox web browser.

Third, return the created pdf file’s path.

// Return file path
string FilePathReturn = @"TempFiles/" + FileName;
return Content(FilePathReturn);

Note, that here I am creating a pdf file and storing it into the “TempFiles” folder location.

Open Print dialog

Now, our last task is to open a file into the print dialog.

First, place a placeholder for pdf to show.

<div id="divPDF">
    <div id="printerDiv"><iframe id="frmPDF"></iframe></div>
</div>

Second, assign pdf and call print option from JavaScript.

$('#frmPDF').attr('src', '@Url.Content("~/")' + result);
setTimeout(function () {
    frame = document.getElementById("frmPDF");
    framedoc = frame.contentWindow;
    framedoc.focus();
    framedoc.print();
}, 1000);

That’s it.

Complete example

For your reference, I have kept the complete example in a single folder and uploaded that with this article and it contains the below files.

  • Index.cshtml (View)
  • HomeController.cs (Controller)
  • Report1.rdlc (Report)
  • TempFiles (Folder to store created pdf file)

The complete code is like the following.

View (Index.cshtml)

<style>
    #printerDiv iframe { position: absolute; top: -1000px; }
</style>

<div class="jumbotron">
    <button onclick="funExportToPDF()">Export to PDF</button>
</div>

<div id="divPDF">
    <div id="printerDiv"><iframe id="frmPDF"></iframe></div>
</div>

<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>

<script type="text/javascript">
    function funExportToPDF() {

        $.ajax({
            url: '@Url.Action("ExportToPDF", "Home")',
            type: 'GET',
            contentType: 'application/json; charset=utf-8',
            success: function (result) {

                $('#frmPDF').attr('src', '@Url.Content("~/")' + result);

                setTimeout(function () {
                    frame = document.getElementById("frmPDF");
                    frameframedoc = frame.contentWindow;
                    framedoc.focus();
                    framedoc.print();
                }, 1000);
            },
            error: function (xhr, status, err) {
                alert(err);
            }
        });

        return false;
    }
</script>

Controller (HomeController.cs)

public ActionResult ExportToPDF()
{
    // Report
    ReportViewer reportViewer = new ReportViewer();

    reportViewer.ProcessingMode = ProcessingMode.Local;
    reportViewer.LocalReport.ReportPath = Server.MapPath(@"~\Report1.rdlc");

    // Byte
    Warning[] warnings;
    string[] streamids;
    string mimeType, encoding, filenameExtension;

    byte[] bytes = reportViewer.LocalReport.Render("Pdf", null, out mimeType, out encoding, out filenameExtension, out streamids, out warnings);

    // File
    string FileName = "Test_" + DateTime.Now.Ticks.ToString() + ".pdf";
    string FilePath = HttpContext.Server.MapPath(@"~\TempFiles\") + FileName;

    // create and set PdfReader
    PdfReader reader = new PdfReader(bytes);
    FileStream output = new FileStream(FilePath, FileMode.Create);

    string Agent = HttpContext.Request.Headers["User-Agent"].ToString();

    // create and set PdfStamper
    PdfStamper pdfStamper = new PdfStamper(reader, output, '0', true);

    if (Agent.Contains("Firefox"))
        pdfStamper.JavaScript = "var res = app.loaded('var pp = this.getPrintParams();pp.interactive = pp.constants.interactionLevel.full;this.print(pp);');";
    else
        pdfStamper.JavaScript = "var res = app.setTimeOut('var pp = this.getPrintParams();pp.interactive = pp.constants.interactionLevel.full;this.print(pp);', 200);";

    pdfStamper.FormFlattening = false;
    pdfStamper.Close();
    reader.Close();

    // return file path
    string FilePathReturn = @"TempFiles/" + FileName;
    return Content(FilePathReturn);
}

Output

The output will be like the following in Chrome browser after clicking on the "Export to PDF" button.

Output

Summary

Now, I believe you will be able to print rdlc reports directly to the printer in MVC.


Similar Articles