web-dev-qa-db-ja.com

Window.Open PDF代わりにPDF location

質問 Open PDF new browser full window に基づいて、JavaScriptを使用してPDFで新しいウィンドウを開くことができるようです_次のコードを含むファイル:

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

window.open でURLの場所として使用するファイル名の代わりにバイト配列を追加することにより、サーバーからの帰路でこれを行いたい

現在、 this のようなPDFファイルを返しています:

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

JavascriptのPDFバイト配列で新しいウィンドウを開く方法はありますか。

このようなもの:

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

window.openは、場所パラメーターとしてデータURIを取ります。

したがって、質問から次のように開くことができます: Opening PDF javascriptを使用して新しいウィンドウの文字列

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

runnableplunkerの例 、および サンプルpdfファイル は、すでにbase64でエンコードされています。

サーバー上で、次のようにバイト配列をbase64エンコードに変換できます。

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

[〜#〜] note [〜#〜]:これは、IE PDF全体を送信するには非常に小さいです。

26
KyleMit

:IEの最新バージョンと、Mozilla、Chromeなどの他のブラウザで確認しましたが、これでうまくいきます。他の人にも役立つことを願っています。

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