web-dev-qa-db-fra.com

Une boîte de dialogue d'impression de fichier PDF PDF peut-elle être ouverte avec Javascript?

Je sais comment ouvrir une page Web dans une nouvelle fenêtre et ajouter du javascript pour que la boîte de dialogue d'impression s'affiche. Existe-t-il un moyen de faire la même chose avec un fichier PDF?

42
user83358

Oui, vous pouvez...

Les fichiers PDF prennent en charge Javascript. J'avais besoin d'avoir des capacités d'impression automatique lors de la création d'un PDF PDF) et j'ai pu utiliser FPDF pour le faire fonctionner:

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

33
Edward

Je fais habituellement quelque chose de similaire à l'approche donnée par Comment utiliser JavaScript pour imprimer un PDF (eHow.com) , en utilisant un iframe.

  1. une fonction pour héberger le déclencheur d'impression ...

    function printTrigger(elementId) {
        var getMyFrame = document.getElementById(elementId);
        getMyFrame.focus();
        getMyFrame.contentWindow.print();
    }
    
  2. un bouton pour donner accès à l'utilisateur ...

    (un onClick sur un a ou button ou input ou ce que vous voulez)

    <input type="button" value="Print" onclick="printTrigger('iFramePdf');" />
    
  3. un iframe pointant vers votre PDF ...

    <iframe id="iFramePdf" src="myPdfUrl.pdf" style="display:none;"></iframe>
    

Idée bonus n ° 1 - Créez le iframe et ajoutez-le à votre page dans la printTrigger(); afin que le PDF ne soit chargé que lorsque l'utilisateur clique sur votre bouton "Imprimer" , le javascript peut attaquer! l'iframe et déclencher la boîte de dialogue d'impression.


Idée bonus n ° 2 - Crédit supplémentaire si vous désactivez votre bouton "Imprimer" et donnez à l'utilisateur un petit spinner de chargement ou quelque chose après avoir cliqué dessus, afin qu'il sache que quelque chose est en cours au lieu de cliquer dessus à plusieurs reprises!

31
brandonjp

Je viens de comprendre comment le faire dans le PDF lui-même - si vous avez acrobat pro, allez dans l'onglet de vos pages, faites un clic droit sur la vignette de la première page et cliquez sur les propriétés de la page. Cliquez sur l'onglet actions en haut de la fenêtre et sous sélectionner le déclencheur choisir la page ouverte. Sous sélectionner l'action choisir "exécuter un javascript". Ensuite, dans la fenêtre javascript, tapez ceci:

this.print({bUI: false, bSilent: true, bShrinkToFit: true});

Cela imprimera votre document sans dialogue sur l'imprimante par défaut de votre appareil. Si vous voulez la boîte de dialogue d'impression, changez simplement bUI en true, bSilent en false et, facultativement, supprimez le paramètre de rétrécissement pour s'adapter.

Impression automatique de PDF!

13
mheavers

J'utilise named action au lieu de javascript car javascript est souvent désactivé, et s'il ne l'est pas, il donne un avertissement.

Mon application web crée un fichier postscript qui est ensuite converti avec ghostscript en pdf. Je veux qu'il s'imprime automatiquement car l'utilisateur a déjà cliqué sur imprimer dans mon application. Avec les informations sur les actions nommées de @DSimon ci-dessus, j'ai recherché comment résoudre ce problème. Tout se résume à insérer la chaîne /Type /Action /S /Named /N /Print au bon endroit dans le pdf.

Je pensais écrire un petit utilitaire, mais il doit analyser le pdf pour trouver le nœud racine, insérer /OpenAction avec une référence un objet avec l'action, et recalculez les décalages d'octets en xref.

Mais j'ai découvert pdfmark qui est une extension de postscript pour exprimer, dans la syntaxe postscript, des idiomes qui sont convertis en pdf par le distillateur Adobes ou par ghostscript.

Puisque j'utilise déjà ghostscript, tout ce que j'ai à faire est d'ajouter ce qui suit à la fin de mon fichier postscript:

%AUTOPRINT
[ /_objdef {PrintAction} /type /dict /OBJ pdfmark
[ {PrintAction} << /Type /Action /S /Named /N /Print >> /PUT pdfmark
[ {Catalog} << /OpenAction {PrintAction} >> /PUT pdfmark

et ghostscript créera l'action, la liera et calculera les décalages xréf. (En postscript % est un commentaire et PrintAction est mon nom pour l'objet)

En regardant le PDF je vois qu'il a créé ceci:

1 0 obj
<</Type /Catalog /Pages 3 0 R
/OpenAction  9 0 R
/Metadata 10 0 R
>>
endobj

9 0 obj
<</S/Named
/Type/Action
/N/Print>>endobj

1 0 est l'objet 1, la révision 0 et 9 0 est l'objet 9, révision 0. Dans le pdf-trailer, il est dit que c'est l'objet 1 qui est le nœud racine. Comme vous pouvez le voir, il existe une référence de l'objet 1, /OpenAction pour exécuter l'objet 9 révision 0.

Avec ghostscript, il est possible de convertir un pdf en postscript (pdf2ps), d'ajouter le texte ci-dessus et de le reconvertir en pdf avec ps2pdf. Il convient de noter que les méta-informations sur le pdf sont perdues dans cette conversion. Je n'ai pas cherché plus à ce sujet.

9
some

Exemple de code d'intégration:

<object type="application/pdf" data="example.pdf" width="100%" height="100%" id="examplePDF" name="examplePDF"><param name='src' value='example.pdf'/></object>

<script>
   examplePDF.printWithDialog();
</script>

Il faudra peut-être jouer avec les identifiants/noms. Utilisation d'Adobe Reader ...

7
RandomGuy87

Si vous savez comment PDF sont structurés (ou si vous êtes prêt à passer un peu de temps à lire la spécification), vous pouvez le faire de cette façon.

Utilisez l'action nommée "Imprimer" dans le champ OpenAction de l'objet Catalogue; l'action "Imprimer" n'est pas documentée, mais Acrobat Reader et la plupart des autres principaux lecteurs la comprennent. Un bon avantage de cette approche est que vous ne recevez aucun avertissement JavaScript. Voir ici pour plus de détails: http://www.gnostice.com/nl_article.asp?id=157

Pour le rendre encore plus brillant, j'ai ajouté une deuxième action, URI, demandant au lecteur de revenir à la page à l'origine de la demande. Ensuite, j'ai attaché cette action à la première action nommée à l'aide de son champ Suivant. Avec la disposition du contenu définie sur "en ligne", cela fait en sorte que lorsque l'utilisateur clique sur le lien d'impression:

  1. Il ouvre Adobe Reader dans le même onglet et charge le fichier
  2. Il affiche immédiatement la boîte de dialogue d'impression
  3. Dès que la boîte de dialogue d'impression est fermée (qu'ils frappent "OK" ou "annuler"), l'onglet du navigateur revient à la page Web

J'ai pu faire toutes ces modifications dans Ruby assez facilement en utilisant uniquement les modules File et IO; J'ai ouvert le PDF = J'avais généré avec un outil externe, suivi la xréf vers la section Catalogue existante, puis ajouté une nouvelle section sur le PDF avec un objet Catalogue mis à jour contenant ma ligne spéciale OpenAction, ainsi que la nouvelle Objets d'action.

En raison des fonctionnalités de révision incrémentielle de PDF, vous n'avez pas à modifier les données existantes pour ce faire, il vous suffit d'ajouter une section supplémentaire à la fin.

4
DSimon

Pourquoi ne pas utiliser l'option de menu Actions pour définir cela?

Procédez comme suit: Si vous disposez d'Acrobat Pro, accédez à l'onglet de vos pages, cliquez avec le bouton droit sur la vignette de la première page, puis cliquez sur les propriétés de la page. Cliquez sur l'onglet actions en haut de la fenêtre et sous sélectionner le déclencheur, choisissez la page ouverte. Sous l'action de sélection, choisissez 'Exécuter un élément de menu'. Cliquez sur le bouton Ajouter puis sélectionnez "Fichier> Imprimer" puis OK. Cliquez à nouveau sur OK et enregistrez le PDF.

3
helpingout

Si vous utilisez la gemme crevette pour Ruby on Rails pour générer votre PDF, vous pouvez utiliser la gemme supplémentaire suivante pour activer la boîte de dialogue d'impression:

impression de crevettes

2
Justin Tanner

Une autre solution:

<input type="button" value="Print" onclick="document.getElementById('PDFtoPrint').focus(); document.getElementById('PDFtoPrint').contentWindow.print();">
1
Yasin Bikmazer