web-dev-qa-db-fra.com

Imprimer le fichier PDF à partir de la balise javascript

J'ai un fichier PDF et j'essaie de l'imprimer via Javascript. J'ai essayé cette astuce d'intégration: Imprimer en mode silencieux un PDF incorporé. Cependant, la fonction d'impression ne devient jamais disponible, elle est toujours indéfinie.

J'ai essayé l'astuce Iframe avec ce code:

function printPDF() {
if(document.getElementById("pdfDocument").contentWindow.document.readyState === "complete") {   
    document.getElementById("pdfDocument").focus();
    document.getElementById("pdfDocument").contentWindow.print();
} else {
    setInterval(printPDF(), 1000);
}
}

(pdfDocument est l'ID de l'iframe) Cela fait apparaître la boîte de dialogue d'impression, mais en imprimant une page vierge. J'adorerais la méthode de balise incorporée pour travailler. Mais pourquoi la fonction d’impression n’est-elle jamais disponible?

La plupart des articles sur ce sujet sont assez anciens. Quelle est la meilleure façon de faire HTML5/jQuery? (ou juste JS régulier à ce stade)

MODIFIER:

voici le code JS pour la balise embed:

function printPDF() {
alert(document.getElementById("pdfDocument").print);
//Wait until PDF is ready to print    
 if (typeof document.getElementById("pdfDocument").print == 'undefined') {
     setTimeout(function(){printPDF();}, 1000);
 } else {
     var x = document.getElementById("pdfDocument");
     x.print();
 }
}

Cela ne cesse de changer "indéfini" chaque seconde. L'option Imprimer n'est jamais disponible. Des idées?

11
mmaceachran

J'ai mis une prime sur cette question il y a environ une semaine et elle est expirée. Je vais publier ici ce que j'ai appris après de nombreuses recherches pour tous ceux qui pourraient le trouver à l'avenir.

Les PDF sont affichés différemment selon le navigateur, la version du navigateur, la configuration du navigateur et le système d'exploitation. Il y a beaucoup de variables, je vais donc parler des situations les plus courantes.

  • Sur tous les navigateurs, je ne pouvais appeler aucune méthode print () via Javascript, je ne pouvais utiliser que PdfActions. L’OPENACTION appellerait print. Je les ai incorporés dans PDF à l'aide de iText.

  • Chrome utilise la visionneuse d'Adobe, qui ne donne accès à aucune méthode print (), mais exécute les actions PdfActions incorporées au fichier PDF. Ainsi, vous pouvez incorporer une 'OpenAction' dans un PDF et faire en sorte que l'appel PDF soit imprimé chaque fois qu'il est ouvert à partir de toute application qui examine ces actions.

  • Firefox (au-dessus d'une certaine version, toutes les versions récentes cependant) utilise le visualiseur Adobe de Windows, qui reconnaît également PdfActions. Cependant, sous OSX, il ne prend plus en charge le lecteur Adobe et passe au lecteur cuit dans Firefox (pdf.js). Ce qui ne supporte pas PdfActions.

  • IE: Je n'ai pas vraiment testé beaucoup sur IE. Principalement parce que j'ai abandonné l'impression de fichiers PDF à partir de Javascript après que Firefox ne fonctionnait plus sous OSX (un req. Pour moi).

Mes fichiers PDF étant générés par un serveur que je contrôle, j'ai donc fini par modifier le service sur mon serveur et à ajouter un service get PNG qui générait un fichier PNG basé sur le même balisage utilisé par la génération PDF. Les navigateurs traitent les images beaucoup mieux que les PDF, ce que je savais, mais espérais que je pourrais simplement réutiliser le service de génération PDF, car il est utilisé ailleurs dans mon code.

Cela ne répond pas à la question, mais c'est toute l'information que j'ai. Ma suggestion à quiconque pourrait trouver cela à l'avenir: abandonner PDF si possible dans ce cas et aller plus simple. Sinon, veuillez mettre à jour cette question si vous savez comment appeler print () via Javascript dans FF preview pdf viewer in OSX.

-Phil

12
philhan

Avec Javascript, je ne suis pas sûr que nous puissions le faire. Cependant, il est possible d’atteindre l’injection de script dans le fichier pdf. Si ma compréhension est correcte, c'est ce que Google fait.

Par exemple.

  1. Ouvrez l'URL: https://drive.google.com/viewerng/viewer?url=http://www.energy.umich.edu/sites/default/files/pdf-sample.pdf
  2. Maintenant, cliquez sur l'icône d'impression.
  3. Comme vous pouvez le voir, une nouvelle fenêtre avec la commande d'impression injectée dans le fichier pdf s'ouvre. Une fois le fichier pdf chargé, la commande d'impression intégrée est déclenchée. Vous pouvez voir l'impression déclenchée chaque fois que vous actualisez la page. Cela signifie que le comportement d'impression est lié à l'événement de chargement de document.

ITextSharp peut être utilisé pour simuler le comportement ci-dessus.

2
Rama Kathare

Il existe un moyen de restituer l'intégralité du fichier PDF dans un navigateur (au lieu d'intégrer une application externe), ce qui vous donne un accès complet aux API du navigateur en ce qui concerne le pdf.

Ceci est l'implémentation pdf de Mozilla en JavaScript: https://github.com/mozilla/pdf.js/
Et voici la vitrine: http://mozilla.github.io/pdf.js/web/viewer.html (remarquez le bouton Imprimer en haut à droite).

Consultez le code du lecteur ici pour savoir comment cela fonctionne: https://github.com/mozilla/pdf.js/blob/master/web/viewer.js

Sur le plan négatif - cela va être beaucoup plus difficile que de simplement intégrer.
Du côté positif, cela fonctionnera réellement.

2
Arseny Smoogly

Dans Chrome, vous pouvez exécuter:

var toolbar = document.querySelector('#toolbar');
toolbar.shadowRoot.querySelector('#print').click();
0
stomy