JsPDF-pas autorisé à naviguer cadre supérieur à L'URL de données

Après la mise à jour de Google Chrome, le rapport jsPDF dans une nouvelle fenêtre ne fonctionne plus.

La console affiche le message:

Pas autorisé à naviguer dans le cadre supérieur vers L'URL de données: données: application / pdf; base64,jvberi0xljmkmyawig9iago8pc9uexblic9qywdlci9qyxjlbnqgmsawifikl1....

Peut vous aider-moi?

Merci.

25
demandé sur Difster 2017-08-03 22:41:46

9 réponses

Apparemment, Google Chrome a supprimé le support pour la navigation top-frame, vous pouvez voir plus d'informations ici: https://groups.google.com/a/chromium.org/forum/#! topic / blink-dev / GbVcuwg_QjM

Vous pouvez essayer de rendre le jsPDF à un iFrame

24
répondu Pedro Calderon 2017-08-03 23:16:10

Cela fonctionne bien maintenant que chrome a supprimé la navigation du cadre supérieur. Seul le téléchargement du pdf dans chrome pose problème. Télécharger fonctionne bien dans 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();
27
répondu Joyston 2017-08-21 05:02:43

J'ai récemment eu le même problème en utilisant L'objet FileReader pour lire le contenu et afficher mon JSReport.

 var reader = new FileReader();                        
 reader.onload = function (e) {
      window.open(reader.result, "_blank");
 }
 reader.readAsDataURL(blob);

Malheureusement, après la mise à jour de chrome, tout mon rapport a cessé de fonctionner. J'ai essayé de résoudre ce problème en utilisant l'objet Blob et cela fonctionne toujours, mais si vous avez un bloqueur de popup, cela ne fonctionnera pas.

 var file = new Blob([blob], { type: 'application/pdf' });
 var fileURL = URL.createObjectURL(file);
 window.open(fileURL);

Je trouve enfin un moyen d'éviter ce problème en créant dynamiquement l'iFrame après avoir lu ce sujet et j'ai décidé de partager la solution .

 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>')
11
répondu Sadek Lallouani 2017-08-15 20:14:03

Peut-être peut-être aider, créer une fonction à exporter avec l'attribut de téléchargement 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();
}
4
répondu nikoz84 2017-10-18 17:24:39
<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>
1
répondu Lonely Planeteer 2017-08-16 06:04:35

Basé sur Joyston Réponse , mais sans reparsing et donc sans besoin supplémentaire d'échapper à quelque chose:

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);
1
répondu T S 2017-11-30 20:52:01
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);
}
1
répondu Surya T 2017-12-17 13:49:19

@kuldeep-choudhary

Salut, en fait, pour résoudre j'utilise la balise d'objet avec angularJS

<object ng-attr-data="{{data}}" type="application/pdf"></object>

Et dans le script:

$scope.doc.data = $sce.trustAsResourceUrl(doc.output("datauristring"));

En javascript pur, peut-être que cela fonctionne:

Html:

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

Js:

document.elementById('obj').data = doc.output("datauristring");

S'il vous plait, essayez de me corriger si je me trompe.

1
répondu Márcio Rossato 2018-02-22 10:20:54

Pas lié à jspdf, mais m'a aidé ici (et cette question Est le meilleur succès chez google): si vous spécifiez un attribut download="..." à la balise d'ancrage, l'invite de téléchargement s'ouvrira correctement.

0
répondu Blauhirn 2018-03-01 13:03:32