JsPDF - Не разрешено перемещаться по верхнему кадру с URL-адресом данных
После обновления Google Chrome отчет jsPDF в новом окне больше не работает.
На консоли отображается сообщение:
Не разрешено перемещаться по верхнему кадру по URL-адресу данных: данные: применение /PDF; base64, JVBERi0xLjMKMyAwIG9iago8PC9UeXBlIC9QYWdlCi9QYXJlbnQgMSAwIFIKL1....
Вы можете помочь мне?
Спасибо.
Ответы
Ответ 1
По-видимому, Google Chrome удалил поддержку навигации в верхнем фрейме, здесь вы можете увидеть более подробную информацию: https://groups.google.com/a/chromium.org/forum/#!topic/blink-dev/GbVcuwg_QjM
Вы можете попытаться отобразить jsPDF в iFrame
Ответ 2
Это хорошо работает теперь, когда хром удалил навигацию верхнего кадра. Проблема с загрузкой только PDF файла в хром. Скачать работает хорошо в firefox tho.
var string = doc.output('datauristring');
var iframe = "<iframe width='100%' height='100%' src='" + string + "'></iframe>"
var x = window.open();
x.document.open();
x.document.write(iframe);
x.document.close();
Ответ 3
Недавно у меня была такая же проблема с использованием объекта FileReader для чтения содержимого и отображения моего JSReport.
var reader = new FileReader();
reader.onload = function (e) {
window.open(reader.result, "_blank");
}
reader.readAsDataURL(blob);
К сожалению, после обновления хрома все мои сообщения перестали работать.
Я попытался исправить это, используя объект Blob, и он все еще работает, но если у вас есть блокировщик всплывающих окон, это не сработает.
var file = new Blob([blob], { type: 'application/pdf' });
var fileURL = URL.createObjectURL(file);
window.open(fileURL);
Наконец-то я нашел способ избежать этой проблемы, динамически создав iFrame после прочтения этой темы, и решил поделиться решением.
var file = new Blob([blob], { type: 'application/pdf' });
var fileURL = URL.createObjectURL(file);
var win = window.open();
win.document.write('<iframe src="' + fileURL + '" frameborder="0" style="border:0; top:0px; left:0px; bottom:0px; right:0px; width:100%; height:100%;" allowfullscreen></iframe>')
Ответ 4
Может быть, может помочь, создать функцию для экспорта с атрибутом загрузки html5:
var docPdf = doc.output();
exportToFile(docPdf,defaults.type);
function exportToFile(data,type){
var hiddenElement = document.createElement('a');
hiddenElement.href = 'data:text/'+type+';filename='+'exportar.'+type+';'+'charset=utf-8,' + encodeURI(data);
hiddenElement.target = '_blank';
hiddenElement.download = 'exportar.'+type;
hiddenElement.click();
}
Ответ 5
<iframe id="ManualFrame"
frameborder="0"
style="border:0"
allowfullscreen>
</iframe>
<script>
$(function () {
setManualFrame();
});
function setManualFrame() {
$("#ManualFrame").attr("height", screen.height);
$("#ManualFrame").attr("width", screen.width);
$("#ManualFrame").attr("src", "data:application/pdf;base64," + Your_PDF_Data);
}
</script>
Ответ 6
@Kuldeep-Чудхари
Привет, на самом деле, чтобы решить, я использую тег объекта с AngularJS 1.5.xx
<object ng-attr-data="{{data}}" type="application/pdf"></object>
и в сценарии:
$scope.doc.data = $sce.trustAsResourceUrl(doc.output("datauristring"));
В чистом JavaScript, возможно, так работает:
HTML:
<object id="obj" type="application/pdf" ></object>
ЯШ:
document.elementById('obj').data = doc.output("datauristring");
пожалуйста, попробуйте и поправьте меня, если я ошибаюсь.
Ответ 7
На основе Joyston answer, но без повторной обработки и, следовательно, без дополнительной необходимости что-то избежать:
x=window.open();
iframe=x.document.createElement('iframe')
iframe.width='100%'
iframe.height='100%'
iframe.frameBorder=0
iframe.style="border: 0"
iframe.src='data:text/html........' //data-uri content here
x.document.body.appendChild(iframe);
Ответ 8
var pdfUrl = doc.output('datauri').substring(doc.output('datauri').indexOf(',')+1);
var binary = atob(pdfUrl.replace(/\s/g, ''));
var len = binary.length;
var buffer = new ArrayBuffer(len);
var view = new Uint8Array(buffer);
for (var i = 0; i < len; i++) {
view[i] = binary.charCodeAt(i);
}
var blob = new Blob( [view], { type: "application/pdf" });
var url = URL.createObjectURL(blob);
function openPDF(){
window.open(url);
}
Ответ 9
Не относится к jspdf, но помогло мне в этом (и этот вопрос является самым популярным в google): если указать для тега привязки атрибут download="..."
, приглашение на загрузку откроется правильно.
Ответ 10
В angular2+ -
app.component.html -
<object id="obj" [attr.data] type="application/pdf"> </object>
app.component.ts
document.getElementById('obj').dataset.data = doc.output("datauristring");
var blob = doc.output("blob");
window.open(URL.createObjectURL(blob));
Ответ 11
Использование download = "" позволило мне скачать файл