web-dev-qa-db-fra.com

Window.Open avec PDF flux au lieu de PDF emplacement

Basé sur la question Ouvrir PDF dans la nouvelle fenêtre de navigation complète , il semble que je puisse utiliser JavaScript pour ouvrir une nouvelle fenêtre avec un PDF fichier avec le code suivant:

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

Je voudrais le faire lors d'un retour du serveur en ajoutant un tableau d'octets au lieu du nom de fichier à utiliser comme emplacement de l'URL dans window.open

Je retourne actuellement PDF fichiers du type this :

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

Est-il possible d'ouvrir une nouvelle fenêtre avec un tableau d'octets PDF en javascript?.

Quelque chose comme ça:

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

Ça ressemble à window.open prendra un URI de données comme paramètre d'emplacement.

Vous pouvez donc l'ouvrir comme ceci à partir de la question suivante: Ouverture PDF Chaîne dans une nouvelle fenêtre avec javascript :

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

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

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

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

[~ # ~] note [~ # ~] : Cela semble difficile à implémenter dans IE car la longueur de l'URL est prohibitif pour envoyer un PDF entier.

26
KyleMit

Note: 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 fonctionnera également 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');
    }

}
4
Dinesh Rajput