Как внедрить URI данных PDF в кодировке Base64 в атрибут данных `‹object›` HTML 5?

Итак, в моем приложении у пользователей есть возможность загрузить файл в <input type = "file" id = "my-file"> (ввод файла HTML 5). Впоследствии я могу получить этот файл, используя следующий Javascript:

var files = $("#my-file").files;
var file = files[0];

Могу ли я как-то использовать этот var file как data в теге <object>? Вот пример тега объекта, в котором PDF-файл захватывается путем нажатия URL-адреса и связи с сервером.

<object data="data/test.pdf" /*<-- I want the var file here */ type="application/pdf" width="300" height="200">
</object>

Как я могу это сделать? Обратите внимание, я должен поддерживать Internet Explorer 11.

ОБНОВЛЕНИЕ:

Я пытался что-то, что в конечном итоге закончилось неудачей. Я преобразовал PDF в data-uri с помощью FileReader, а затем использовал его в атрибуте data тега <object>, который отлично отображается в Chrome, но совсем не в Internet Explorer.

var files = $(e.currentTarget.files);
file = files[0];
var reader = new FileReader();
reader.onloadend = function() {
    var data = reader.result;
    console.log(data);
    $("#content").prepend('<object id="objPdf" data="'+data+'" type="application/pdf"></object>');
};
reader.readAsDataURL(file);

Где данные читателя выглядят так:

data:application/pdf;base64,JVBERi0xLjQKJe...

Вот причина, по которой PDF-файлы не работают с этим подходом в Internet Explorer (только изображения)... так грустно :(

ОБНОВЛЕНИЕ 2:

Пробовал pdf.js с некоторым успехом... он отображает PDF на странице, хотя он невероятно медленный (5 секунд для одной страницы) в Internet Explorer 11. Он также отображает только одну страницу за раз, тогда как тег <object> мгновенно отображал все страницы в удобном прокручиваемом контейнере. Хотя это крайний запасной вариант, я бы не хотел идти по этому пути.

У кого-нибудь есть другие идеи о том, как я могу просмотреть PDF-файлы, которые пользователь загружает прямо на веб-страницу?


person kibowki    schedule 15.07.2015    source источник
comment
Можно просто использовать API-интерфейс fileReader, обернуть данные в $(), удалить теги script и вставить все, что находится в теле, в div или даже поместить все в iframe.   -  person charlietfl    schedule 16.07.2015
comment
Не могли бы вы рассказать об этом с некоторыми примерами кода? Я попробовал подход data-uri, используя его в качестве источника для iframe, но в итоге iframe создал тег внедрения, который не поддерживает PDF-файлы в Internet Explorer.   -  person kibowki    schedule 16.07.2015
comment
все, что вам нужно, это необработанный html, нет необходимости в data-uri. Установите innerHTML тела с html после загрузки iFrame или document.write все это, если оно включает тег <html>   -  person charlietfl    schedule 16.07.2015
comment
Извините, кажется, я что-то упускаю. Установите innerHTML тела с помощью какого HTML? Тег <object>? Просто для ясности: я хочу использовать данные в <object> с var file, которые я получаю из пользовательского ввода, а не из файла, полученного с сервера.   -  person kibowki    schedule 16.07.2015
comment
Возможно, я неправильно истолковал исходный вопрос. Я думал, что это html-файл из заголовка. Это неправильно?   -  person charlietfl    schedule 16.07.2015
comment
Веб-приложение представляет собой файл HTML с <input type = "file">, что позволяет пользователю загружать файл из своей файловой системы. Я хочу получить этот файл (который будет в формате PDF) и позволить им просмотреть его. Этот файл, который они выбрали (var file из моего примера кода), я пытаюсь поместить в тег <object>.   -  person kibowki    schedule 16.07.2015
comment
возможно, вы захотите взглянуть на библиотеку jspdf   -  person charlietfl    schedule 16.07.2015
comment
Возможный дубликат Есть ли способ создать предварительный просмотр PDF в IE   -  person Paul Sweatte    schedule 17.09.2016
comment
Вам нужен ответ на ваш вопрос сейчас? Если да, то могу дать.   -  person Bharata    schedule 05.01.2019


Ответы (1)


Да, у меня это работает с файлом...

HTML:

<object id="pdf" data="" type="application/pdf"></object>

Javascript (JQuery)

var fr = new FileReader();
fr.onload = function(evtLoaded) {
  $('#pdf').attr('data', evtLoaded.target.result );
};
fr.readAsDataURL(inFile);

По сравнению с вашим подходом я использую обратный вызов «Я закончил чтение файла» по-разному, используя событие. Если я правильно понял: 'loadend' всегда будет вызываться независимо от того, удалось ли чтение или нет.

person Dirk Schumacher    schedule 15.12.2016
comment
<object> не отображает все файлы PDF. У меня возникают проблемы при рендеринге некоторых конкретных PDF-файлов. - person Adil; 06.12.2017