Проблема для нас заключается в том, что мы не можем сохранять данные по юридическим причинам. Поэтому нам нужно работать с потоками и аналогичными, не сохраняя PDF в файловой системе. И по нескольким причинам страница не должна перезагружаться при загрузке или отображении PDF-файла.
Сначала мы попытались с помощью PDF.JS из-за предложения @lubos hasko: Нам удалось использовать Base64 со зрителем. Это работало в Firefox и Chrome. Но это было очень медленно. IE / Edge вообще не работал для нас.
Отображение строки PDF-Base64 в теге-объекте не работало для нас в браузере Microsoft (IE / Edge), но очень хорошо Chrome / Firefox / Safari. Поэтому для IE11 / Edge мы использовали IFrame для отображения потока PDF. Он работает хорошо, и усилия по техническому обслуживанию поддерживаются в пределах. Для IE9 / IE10 мы просто отправляем файл в виде загружаемого потока, потому что он не очень хорошо работает с этими браузерами в сочетании с iframe. У пользователя нет возможности показывать pdf-файл в виде модального окна, который подходит для количества наших клиентов, которые используют эти браузеры (около 1%). Вы можете найти наше решение для загрузки здесь: Загрузите PDF без обновления с IFrame .
Причина, по которой мы не используем решение IFrame для всех браузеров, заключается в том, что хотя PDF-файл отображается правильно во всех наших проверенных браузерах, Chrome делает другой запрос к серверной функции, как только вы хотите загрузить PDF-документ в Chrome-PDF Reader. Спрятанное поле pdfHelperTransferData больше не задано, потому что PDF отображается в IFrame, поэтому параметр на стороне сервера - null . Для этой «функции / ошибки» см. Этот Chrome отправляет два запроса при загрузке PDF (и отменяет один из них) .
Наш Javascript
if (isMicrosoftBrowser()) {
// Case IE / Edge (because doesn't recoginzie Pdf-Base64 use Iframe)
var form = document.getElementById('pdf-helper-form');
$("#pdfHelperTransferData").val(transferData);
form.target = "iframe-pdf-shower";
form.action = "serverSideFunctonWhichWritesPdfinResponse";
form.submit();
} else {
// Case non IE use Object tag instead of iframe
$.ajax({
url: "serverSideFunctonWhichRetrivesPdfAsBase64",
type: "post",
data: { downloadHelperTransferData: transferData },
success: function (result) {
$("#object-pdf-shower").attr("data", result);
}
})
}
Наш HTML
Чтобы проверить наличие Microsoft-браузера для экземпляра: Как я могу обнаружить Internet Explorer (IE) и Microsoft Edge с помощью JavaScript? Я надеюсь, что эти результаты сохранят кто-то еще некоторое время.