2013-01-11 1 views
5

J'ai un pdf associé à un bouton. Lorsque je clique sur le bouton, je veux imprimer le pdf. Voici comment mon bouton est codé:Comment puis-je imprimer un pdf dans Google Chrome?

<input type="submit" class="btn-red" value="Print" 
name="Submit" id="printbtn" 
onclick="printPDF('http://www.irs.gov/pub/irs-pdf/fw4.pdf')" /> 

Maintenant, ma fonction d'impression fonctionne comme ceci:

function printPDF(pdfUrl) 
    { 

    if ((navigator.appName == 'Microsoft Internet Explorer')) 
    window.print(pdfUrl,"_self"); 
    else 
    { 
    var w = window.open(pdfUrl,"_self"); 
    w.print(); 
    w.close(); 
    } 
    } 

Le problème est, il fonctionne très bien dans IE et le renard de feu, mais ne fonctionne pas en chrome. Dans ie et Firefox, il ouvre l'option imprimante xps, mais en chrome, il ouvre juste une nouvelle fenêtre d'impression, avec l'aperçu avant impression de la div et pas le pdf. Mais je veux que l'option xps soit ouverte ici.

EDIT: En chrome lorsque j'essaie d'imprimer, seul l'élément html est disponible en aperçu et non en pdf. J'utilise la version de chrome: 20.0.1132.57

Comment puis-je contourner cette particularité? aide aimablement .

Répondre

4

Je devais faire la même chose et j'ai utilisé une approche différente, celle qui pour moi a fonctionné à la fois dans Chrome et Firefox.

Ma solution impliquait un fichier d'assistance print.html, qui recevait l'URL du fichier PDF en tant que paramètre de type GET, puis chargeait le pdf dans un iframe. Ensuite, il a continué à vérifier pour voir si le pdf avait complètement chargé (lier le chèque à l'événement onload ne fonctionnait pas) et à la fin il a déclenché la méthode d'impression.

ici:

<!DOCTYPE html> 
<html lang="en"> 
<head> 
    <meta charset="utf-8"> 
    <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=1"> 

    <title>Print Page</title> 

    <meta name="title" content="Print" /> 

    <script> 

    (function (window, document, undefined) { 


     var printy = { 

       urlGET: function (param) { 

        var params = document.URL.split('?'); 

        if(params.length > 1) { 
         params = params[1].split('&'); 

         for (var i = 0, len = params.length; i < len; i++) { 
          if (params[i].split('=')[0] === param) { 
           return params[i].split('=')[1]; 
          } 
         } 
        } 

        return null; 
       }, 


       init: function() { 

        var self = this; 

        window.onload = function() { 

         var src = self.urlGET('path'); 

         //creating an iframe element 
         var ifr = document.createElement('iframe'); 
         document.body.appendChild(ifr); 

         // making the iframe fill the viewport 
         ifr.width = '100%'; 
         ifr.height = window.innerHeight; 

         // continuously checking to see if the pdf file has been loaded 
         self.interval = setInterval(function() { 

          if (ifr.contentDocument.readyState === 'complete') { 
           clearInterval(self.interval); 
           // doing the actual printing 
           ifr.contentWindow.print(); 
          } 
         }, 100); 

         ifr.src = src; 
        } 
       } 
      } 

      printy.init(); 

    })(window, document, undefined); 
    </script> 

</head> 
<body> 
</body> 
</html> 

Cette solution n'a pas été testé sur IE cependant. Nous utilisons des Mac au travail donc ce n'était pas une option.

Pour faire l'impression, je l'utilise en appelant une URL comme ceci: http://example.com/print.html?path=docs/myfile.pdf

+0

Merci pour le partager. Je vais vérifier et vous dire si cela fonctionne pour moi. –

4

Cela a fonctionné pour moi et n'a pas besoin d'un fichier HTML hôte. La clé était d'attendre onload:

Pour un lien comme celui-ci:

<a class="print-pdf-link" href="/your/pdf.pdf">Print PDF</a> 

J'utilise javascript:

$('a.print-pdf-link').click(function() { 
    var w = window.open($(this).attr('href')); 

    w.onload = function() { 
     w.print(); 
    }; 

    return false; 
}); 
+0

Ne fonctionne pas sur FF. –