49 votes

Imprimer le 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 = '<iframe id="'+id+'" src="'+url+'" style="display:none"></iframe>';
    $('#main').append(html);
    $('#'+id).load(function(){
        document.getElementById(id).contentWindow.print();
    }
}
 

Erreur

 Error: Permission denied to access property "print"
 

37voto

Horst Jahns Points 2840

Firefox: le refus d'une Autorisation pour accéder à la propriété "imprimer"

C'est un bug dans firefox. Localement, il peut être désactivé en allant à l' about:config et définissez la propriété d' pdfjs.disabled de vrai. Seule solution possible est d'utiliser un script côté serveur et modifier les pdf. À l'aide de php, vous pouvez utiliser fpdf et d'intégrer des extensions à mettre en œuvre js (inclunding l' print() de la fonction) ou simplement de convertir le fichier pdf en une image, le retour de l'url et de l'imprimer. Vous pouvez utiliser FPDI de modifier le fichier pdf existant. Je vais vous donner un exemple sur la façon dont je l'ai eu à travailler avec PHP.

Génération d'un fichier PDF avec le javascript en ligne (autoprint) à 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->_textstring($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 <</JavaScript '.($this->n_js).' 0 R>>');
        }
    }
}

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 tout simplement ajouter le pdf généré à votre page et le javascript qui fera appel à la print() fonction. Vous n'avez même pas à l'appeler manuellement plus. Cependant, dans firefox, cela ne fonctionnera qu'avec des visibility: hidden et non pas avec de l' display: none.

function print_pdf(url){
    var iFrameJQueryObject = $('<iframe id="iframe" src="'+url+'" style="visibility: hidden"></iframe>');
    $('#foo').append(iFrameJQueryObject);
}
print_pdf('mozilla_generated.pdf');

Chrome: Erreur de Sécurité (cross-origin)

Le pdf doit être situé sur le même hôte. Firefox a été d'accord avec les autres domaines dans mes tests, mais chrome m'a donné de la croix-origine des erreurs.


Firefox: page Imprimée inclut about:blank seulement

Vous obtiendrez une page vide dans firefox (jsfiddle), car il permet d'imprimer l'iframe avant qu'il a chargé de tout contenu. Les moyens mentionnés comme $(document).onload() ne va pas aider, car ils n'attendez les DOM afin de charger et d' setTimeout() peut entraîner des erreurs, puisque vous ne savez pas combien de temps il prend l'iFrame à charger.

Vous pouvez simplement résoudre ce problème à l'aide de jQuery load(). (doc) Cela vous donnera la possibilité d'utiliser une fonction de rappel en tant que paramètre.

si un "complète" de rappel est fourni, il est exécuté après le post-traitement et HTML d'insertion a été effectuée. Le rappel est tiré une fois pour chaque élément dans le jQuery collection, et this est définie pour chaque élément du DOM à son tour.

Exemple De Code 1

function print_pdf(url){
    var id = 'iframe', html = '<iframe id="'+id+'" src="'+url+'" style="display:none"></iframe>';
    $('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 objet jQuery et l'utilisation de jQuery on() (doc) pour attacher un gestionnaire d'événement.

Exemple de Code 2 (jsfiddle)

function print_pdf(url){
    var iFrameJQueryObject = $('<iframe id="iframe" src="'+url+'" style="display:none"></iframe>');
    $('body').append(iFrameJQueryObject);
    iFrameJQueryObject.on('load', function(){
        $(this).get(0).contentWindow.print();
    });
}

4voto

guest271314 Points 2718

Modifier, mis à jour

Essayez d’utiliser les événements window.onload , document.createElement() , onload événement, setTimeout() avec duration défini sur 2000 , paramètre src de iframe après l'ajout d'élément à document

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

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

2voto

vrtech77 Points 62

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

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

0voto

@ clarkk, je recommanderais d'utiliser quelque chose de plus puissant qui a été couvert par beaucoup de gens, ma suggestion est d'utiliser http://pdfmake.org/#/ .

J'ai utilisé ce pdfmake dans mes datatables et cela fonctionne absolument parfait. Gardez à l'esprit si vous imprimez plus de 10 000 lignes à partir de tables ou si quelque chose excède la mémoire du navigateur :)

-1voto

Gary Points 423

Imprimer un pdf avec javascript ou jquery

Créez un iframe en HTML:

 <iframe id="pdf-iframe">
 

Puis changez le src de cette iframe et chargez-le, imprimez-le:

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

Vous pouvez également essayer https://mozilla.github.io/pdf.js/

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X