Imprimer PDF dans Firefox

Comment imprimer un PDF dans Firefox?

Cette fonction fonctionne dans Chrome mais pas dans Firefox

function print_pdf(url){ var id = 'iframe', html = ''; $('#main').append(html); $('#'+id).load(function(){ document.getElementById(id).contentWindow.print(); } } 

Erreur

 Error: Permission denied to access property "print" 

Firefox: autorisation d’access à la propriété “print” interdite

Ceci est un bogue dans Firefox . Localement, il peut être désactivé en allant à about:config et définissez la propriété de pdfjs.disabled sur true. Seule solution possible consiste à utiliser un script côté serveur et à modifier le fichier pdf. En utilisant php, vous pouvez utiliser fpdf et incorporer des extensions pour implémenter js (en incluant la fonction print() ) ou simplement convertir le pdf en image, renvoyer l’URL et l’imprimer. Vous pouvez utiliser FPDI pour modifier le pdf existant. Je vais vous donner un exemple sur la façon dont je l’ai fait fonctionner avec PHP.

Génération d’un fichier PDF avec javascript en ligne (impression automatique) à l’aide de FPDI et PDF_JS

 require_once('fpdf.php'); require_once('fpdi.php'); class PDF_JavaScript extends FPDI { var $javascript; var $n_js; function IncludeJS($script) { $this->javascript=$script; } function _putjavascript() { $this->_newobj(); $this->n_js=$this->n; $this->_out('<<'); $this->_out('/Names [(EmbeddedJS) '.($this->n+1).' 0 R]'); $this->_out('>>'); $this->_out('endobj'); $this->_newobj(); $this->_out('<<'); $this->_out('/S /JavaScript'); $this->_out('/JS '.$this->_textssortingng($this->javascript)); $this->_out('>>'); $this->_out('endobj'); } function _putresources() { parent::_putresources(); if (!empty($this->javascript)) { $this->_putjavascript(); } } function _putcatalog() { parent::_putcatalog(); if (!empty($this->javascript)) { $this->_out('/Names >'); } } } class PDF_AutoPrint extends PDF_JavaScript { function AutoPrint($dialog=false) { //Open the print dialog or start printing immediately on the standard printer $param=($dialog ? 'true' : 'false'); $script="print($param);"; $this->IncludeJS($script); } function AutoPrintToPrinter($server, $printer, $dialog=false) { $script = "document.contentWindow.print();"; $this->IncludeJS($script); } } $pdf=new PDF_AutoPrint(); $pdf->setSourceFile("mozilla.pdf"); //Open the print dialog $tplIdx = $pdf->importPage(1, '/MediaBox'); $pdf->addPage(); $pdf->useTemplate($tplIdx, 10, 10, 90); $pdf->AutoPrint(true); $pdf->Output('generated.pdf', 'F'); 

Maintenant, vous pouvez simplement append le pdf généré à votre page et le javascript inclus appellera la fonction print() . Vous n’avez même plus besoin de l’appeler manuellement. Cependant, dans Firefox, cela ne fonctionnera qu’avec la visibility: hidden et non avec l’ display: none .

 function print_pdf(url){ var iFrameJQueryObject = $(''); $('#foo').append(iFrameJQueryObject); } print_pdf('mozilla_generated.pdf'); 

Chrome: erreur de sécurité (origine croisée)

Le pdf devrait être situé sur le même hôte. Firefox était compatible avec d’autres domaines dans mes tests, mais chrome m’a donné des erreurs d’origine croisée.


Firefox: la page imprimée contient à about:blank uniquement

Vous obtiendrez une page vide dans firefox ( jsfiddle ), car elle imprimera l’iframe avant d’avoir chargé un contenu. Les méthodes mentionnées comme $(document).onload() ne seront d’aucune aide, car elles n’attendent que le chargement du DOM et setTimeout() peut toujours générer des erreurs, car vous ne savez pas combien de temps il faut à l’iFrame pour le charger.

Vous pouvez simplement résoudre ce problème en utilisant jQuery load() . ( doc ) Cela vous donnera la possibilité d’utiliser une fonction de rappel comme paramètre.

Si un rappel “complet” est fourni, il est exécuté après le post-traitement et l’insertion HTML a été effectuée. Le rappel est déclenché une fois pour chaque élément de la collection jQuery, et this est défini sur chaque élément DOM.

Exemple de code 1

 function print_pdf(url){ var id = 'iframe', html = ''; $('body').append(html); // wait for the iFrame to fully load and call the print() function afterwards $('#' + id).load(function () { document.getElementById(id).contentWindow.print(); }); } 

Vous pouvez également créer directement un object jQuery et utiliser jQuery on() ( doc ) pour attacher un gestionnaire d’événement.

Exemple de code 2 ( jsfiddle )

 function print_pdf(url){ var iFrameJQueryObject = $(''); $('body').append(iFrameJQueryObject); iFrameJQueryObject.on('load', function(){ $(this).get(0).contentWindow.print(); }); } 

Modifier, mis à jour

Essayez d’utiliser l’événement window.onload , document.createElement() , onload événement onload , setTimeout() dont la duration définie sur 2000 , la définition de src d’ iframe après l’ajout de l’élément au document

 window.onload = function() { function print_pdf(url){ var id = "iframe", frame = document.createElement("iframe"); frame.setAtsortingbute("id", id); frame.setAtsortingbute("width", "800px"); frame.setAtsortingbute("height", "600px"); frame.setAtsortingbute("allowfullscreen", "true"); frame.setAtsortingbute("name", "printframe"); document.body.appendChild(frame); frame.onload = function() { this.requestFullScreen = this.mozRequestFullScreen || this.webkitRequestFullScreen; this.requestFullScreen(); setTimeout(function() { print() },2000) } frame.setAtsortingbute("src", url); } print_pdf("http://zeitreisen.zeit.de/wp-content/uploads/2014/09/pdftest2.pdf"); } 

plnkr http://plnkr.co/edit/mHBNmc5mdM0YJRwRbYif?p=preview

Les PDF ont un support Javascript. J’avais besoin de capacités d’impression automatique lorsqu’un fichier PDF généré par PHP était créé et que je pouvais utiliser FPDF pour le faire fonctionner:

http://www.fpdf.org/en/script/script36.php

@clarkk je recommande d’utiliser quelque chose de plus puissant qui a été couvert par beaucoup de gens, je suggère d’utiliser http://pdfmake.org/#/ .

J’ai utilisé ce pdfmake dans mes datatables et cela fonctionne absolument parfait. Gardez à l’esprit que si vous imprimez plus de 10 000 lignes à partir de tables ou de quelque chose, cela épuisera la mémoire du navigateur 🙂

Je ne l’ai pas utilisé depuis un moment, mais c’est ce que j’avais l’habitude de faire pour imprimer des pdf à partir d’un iframe …

 function printfile() { window.frames['objAdobePrint'].focus(); window.frames['objAdobePrint'].print(); }   

Vous pouvez implémenter une fonction d’impression sans créer de nouveau iframe (uniquement avec css) pour éviter les problèmes de sécurité:

 var style = document.createElement("style"); style.setAtsortingbute("media", "print"); //style.setAtsortingbute("media", "screen,print"); style.appendChild(document.createTextNode("")); document.head.appendChild(style); var width = $("#printDiv").width(); var height = $("#printDiv").height(); style.sheet.insertRule("body { width: 210mm !important, height: 25.4mm !important; visibility: hidden; }", 0); style.sheet.insertRule("#printDiv { visibility: visible; position: fixed !important;top: 5px; left: 5px; width:" + width + "px;height:" + height + "; page-break-after: avoid;}", 0); window.focus(); window.print(true); style.remove(); 

Imprimer un pdf avec javascript ou jquery

Créez un iframe en html:

  

Puis changez le src de cet iframe et en charge, imprimez-le:

 $('#pdf-iframe').attr("src", pdf_url).load(function(){ document.getElementById('pdf-iframe').contentWindow.print(); }); 

Ou, vous voudrez peut-être essayer https://mozilla.github.io/pdf.js/