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

Показать поток pdf в новом окне

Я создаю на сервере PDF-документ, который я хочу показать тогда на клиенте. Серверная сторона выглядит следующим образом:

ByteArrayOutputStream baos = generatePDF();
response.setContentType("application/pdf");
response.setHeader("Content-Disposition", "attachment; filename=file.pdf");
response.setContentLength(baos.size());
baos.writeTo(response.getOutputStream());

В клиенте у меня есть следующий код для получения PDF файла:

$.ajax({
    type: "POST",
    url: url,
    data: {"data": JSON.stringify(myData)},
    success: function(data, textStatus, jqXHR) {
        window.open("data:application/pdf," + escape(data));
    },
    error: function(jqXHR) {
        showError("...");
    }
});

Хорошо выглядит, новое окно открыто, но PDF не отображается. Он всегда появляется пустой документ.

Тем не менее, если клиент выглядит следующим образом, он отлично работает:

var form = $("<form target='_blank'>").attr({
    action : myURL,
    method : "POST"
});
var input1 = $("<input type='hidden'>").attr({
    "name": "data",
    value: JSON.stringify(myData)
});

form.append(input1);
$("body").append(form);
form.submit();
form.remove();

Но я не могу использовать второй способ, потому что мне нужно управлять ошибками, и я не могу сделать это, используя form.submit().

Любая идея о том, что происходит с PDF?

4b9b3361

Ответ 1

Вы можете получить строку base64 вашего потока pdf и передать его в ответ.

И ваш метод изменится

$.ajax({
    type: "POST",
    url: url,
    data: {"data": JSON.stringify(myData)},
    success: function(data, textStatus, jqXHR) {
        var pdfWin= window.open("data:application/pdf;base64, " + data, '', 'height=650,width=840');
        // some actions with this win, example print...
    },
    error: function(jqXHR) {
        showError("...");
    }
});

Ответ 2

Попробуйте использовать:

dataType: "application/pdf",
success: function(data, textStatus, jqXHR) {
    window.open(escape(data), "Title", "");
},

Ответ 3

Я не мог сделать это async, но этот js возвращает вложение ok для меня:

$('<iframe src="url"></iframe>').appendTo('body').hide();

Затем браузер запускает всплывающее окно сохранения/просмотра, что отлично подходит для моих требований; однако обработка ошибок не выполняется.

Я думаю, что с вашей стороны сервера вы можете вернуть его как встроенный, например. response.setHeader("Content-Disposition", "inline; filename=file.pdf");

Вы устанавливаете длину содержимого ОК, может быть, код успеха будет срабатывать дважды, первый раз в начале потока и второй раз в конце.

Сообщите нам, если у вас это получилось.