Window.Open avec flux PDF au lieu de l'emplacement PDF

Basé sur la question Open PDF dans la nouvelle fenêtre du navigateur , il me semble que je peux utiliser JavaScript pour ouvrir une nouvelle fenêtre avec un fichier PDF avec le code suivant:

window.open('MyPDF.pdf', '_blank'); 

J'aimerais le faire lors d'un voyage aller-retour depuis le serveur en ajoutant un tableau d'octets au lieu du nom du fichier à utiliser comme emplacement URL dans window.open

Je retourne actuellement des fichiers PDF comme ceci :

 Response.Clear(); Response.ContentType = "application/pdf"; Response.BinaryWrite(pdfByteArray); Response.Flush(); 

Existe-t-il un moyen d'ouvrir une nouvelle fenêtre avec un tableau d'octets PDF sous javascript.

Quelque chose comme ça:

 var script = "window.open('" + pdfByteArray + "', '_blank');"; ScriptManager.RegisterClientScriptBlock(Parent.Page, typeof(Page), "pdf", script, true); 

Il semble que window.open prendra un URI de données comme paramètre de localisation.

Ainsi, vous pouvez l'ouvrir comme ceci à partir de la question: Ouverture de la chaîne PDF dans une nouvelle fenêtre avec javascript :

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

Voici un exemple utilisable dans plunker , et un exemple de fichier pdf déjà codé en base64.

Ensuite, sur le serveur, vous pouvez convertir le tableau d'octets en codage base64 comme ceci:

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

REMARQUE : cela semble difficile à mettre en œuvre dans IE car la longueur de l'URL est prohibitive pour l'envoi d'un PDF complet.

Remarque : J'ai vérifié dans la dernière version d'IE, et d'autres navigateurs comme Mozilla, Chrome et cela fonctionne pour moi. J'espère que cela fonctionne aussi pour les autres.

 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," + base64EncodedPDF1; window.open(dataURI, '_blank'); } }