Подтвердить что ты не робот

Window.Open с потоком PDF вместо местоположения PDF

Исходя из вопроса Открыть PDF в новом окне браузера, похоже, что я могу использовать JavaScript для открытия нового окна с файлом PDF со следующим кодом:

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

Я хотел бы сделать это в обратном пути с сервера, добавив байтовый массив вместо имени файла, который будет использоваться в качестве URL-адреса в window.open

В настоящее время я возвращаю PDF файлы, такие как this:

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

Есть ли способ открыть новое окно с байтовым массивом PDF в javascript.

Что-то вроде этого:

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

Ответ 1

Похоже, что window.open возьмет URI данных в качестве параметра местоположения.

Итак, вы можете открыть его вот так из вопроса: Открытие строки PDF в новом окне с помощью javascript:

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

Здесь runnable пример в plunker, и пример файла pdf, который уже закодирован в base64.

Затем на сервере вы можете преобразовать массив байтов в кодировку base64 следующим образом:

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

ПРИМЕЧАНИЕ. Это сложно реализовать в IE, потому что длина URL-адреса является непомерно малой для отправки всего PDF файла.

Ответ 2

Примечание. Я проверял последнюю версию 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');
    }

}