Window.Open with PDF stream instead of PDF location Window.Open with PDF stream instead of PDF location asp.net asp.net

Window.Open with PDF stream instead of PDF location


It looks like window.open will take a Data URI as the location parameter.

So you can open it like this from the question: Opening PDF String in new window with javascript:

window.open("data:application/pdf;base64, " + base64EncodedPDF);

Here's an runnable example in plunker, and sample pdf file that's already base64 encoded.

Then on the server, you can convert the byte array to base64 encoding like this:

string fileName = @"C:\TEMP\TEST.pdf";byte[] pdfByteArray = System.IO.File.ReadAllBytes(fileName);string base64EncodedPDF = System.Convert.ToBase64String(pdfByteArray);

NOTE: This seems difficult to implement in IE because the URL length is prohibitively small for sending an entire PDF.


Note: I have verified this in the latest version of IE, and other browsers like Mozilla and Chrome and this works for me. Hope it works for others as well.

if (data == "" || data == undefined) {    alert("Falied to open PDF.");} else { //For IE using atob convert base64 encoded data to byte array    if (window.navigator && window.navigator.msSaveOrOpenBlob) {        var byteCharacters = atob(data);        var byteNumbers = new Array(byteCharacters.length);        for (var i = 0; i < byteCharacters.length; i++) {            byteNumbers[i] = byteCharacters.charCodeAt(i);        }        var byteArray = new Uint8Array(byteNumbers);        var blob = new Blob([byteArray], {            type: 'application/pdf'        });        window.navigator.msSaveOrOpenBlob(blob, fileName);    } else { // Directly use base 64 encoded data for rest browsers (not IE)        var base64EncodedPDF = data;        var dataURI = "data:application/pdf;base64," + base64EncodedPDF;        window.open(dataURI, '_blank');    }}