2014-03-31 2 views
22

Auf der Grundlage der Frage Open PDF in new browser full window, es sieht aus wie ich JavaScript verwenden kann mit dem folgenden Code ein neues Fenster mit einer PDF-Datei zu öffnen:Window.Open mit PDF-Stream statt PDF Standort

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

Ich würde wie so auf einer Rückfahrt von dem Server zu tun, indem ein Byte-Array anstelle der Dateinamen hinzugefügt wird als URL-Position in window.open

ich zur Zeit Dateien PDF bin zu verwenden, wie this Rückkehr:

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

Gibt es eine Möglichkeit, ein neues Fenster mit einem PDF-Byte-Array in Javascript zu öffnen.

Etwas wie folgt aus:

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

Warum Sie keinen Handler (.ashx) erstellen, die die Ausgabe tut und window.open an, dass zu Punkt verwenden. Sie können nur eine uri/url passieren –

+0

http://www.w3schools.com/jsref/met_win_open.asp –

Antwort

24

Es sieht aus wie window.open eine Daten-URI als Lageparameter stattfinden wird.

So können Sie es wie folgt aus der Frage offen: Opening PDF String in new window with javascript:

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

Hier ist ein runnableexample in plunker und sample pdf file, der bereits Base64 codiert.

Dann auf dem Server, können Sie die Byte-Array zu Base64-Kodierung wie folgt konvertieren:

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

HINWEIS: Diese schwierige scheint in IE zu implementieren, da die URL-Länge für das Senden eines gesamten unerschwinglich klein ist PDF.

+1

von window.open Nach verschiedenen anderen Kommentaren auf ähnliche Fragen zu lesen, scheint es einige Leute behaupten, die Grenze irgendwo zwischen 2048 Bytes ist und 32KB. Beide sind leider zu klein für mich. Es sieht so aus, als ob es immer noch keine zuverlässige Möglichkeit gibt, einem Benutzer zu sagen, wenn sein PDF-Download die Generierung eines Ajax-Abfragerads beendet hat. – crush

+0

Welche Bibliothek muss ich 'System.Convert.ToBase64String' zu verwenden, importieren? Ich kann 'Convert' nicht in' System' finden. –

+0

Ich arbeite mit PHP im Backend, also machte ich base64_encode (Daten) vor dem PDF-Inhalt Senden (Überspringen den System.Convert.ToBase64String, die Sie dort schrieben, es war nicht für mich arbeiten). Vielen Dank! – dani24

3

Hinweis: Ich habe in der neuesten Version von IE und anderen Browsern wie Mozilla, Chrome überprüft und das funktioniert für mich. Hoffe, es funktioniert auch für andere.

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'); 
    } 

} 
+0

Ich habe endlich mit einer Kombination von .NET: Response.Write (System.Convert.ToBase64String (bytearray)) gearbeitet; und der JavaScript-Block oben. Danke @KyleMit! – blalond