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?
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:
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
.
function printTrigger(elementId) {
var getMyFrame = document.getElementById(elementId);
getMyFrame.focus();
getMyFrame.contentWindow.print();
}
(un onClick
sur un a
ou button
ou input
ou ce que vous voulez)
<input type="button" value="Print" onclick="printTrigger('iFramePdf');" />
<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!
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!
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.
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 ...
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:
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.
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.
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:
Une autre solution:
<input type="button" value="Print" onclick="document.getElementById('PDFtoPrint').focus(); document.getElementById('PDFtoPrint').contentWindow.print();">