Imprimer un PDF [C Windows] - C - Programmation
Marsh Posté le 15-07-2003 à 16:59:10
Je pense que le plus simple c'est d'utiliser ShellExecuteEx avec le "verbe" print. Par contre, il faudra Acrobat Reader (pas besoin de plus) d'installé (et tu vas voir la fenêtre de lancement d'acrobat je pense).
Une autre solution, c'est de trouver une bibliothèque permettant de lire les pdf (tu trouveras peut être quelque chose du côté de GhostView qui est un logiciel gratuit) et de faire l'impression directement de ton soft.
Marsh Posté le 15-07-2003 à 17:05:52
gatorette a écrit : Je pense que le plus simple c'est d'utiliser ShellExecuteEx avec le "verbe" print. Par contre, il faudra Acrobat Reader (pas besoin de plus) d'installé (et tu vas voir la fenêtre de lancement d'acrobat je pense). |
Toutes les versions d'Acrobat Reader ne permettent pas d'imprimer directement à partir de la ligne de commande. Nottament la 5, version pour laquelle le seul moyen qui m'est apparu est de donner des ordres à Reader via des messages DDE. Pas vraiment simple...
Marsh Posté le 15-07-2003 à 17:19:26
Euh, avec Acrobat 5 (par Reader), j'ai lancé l'impression en ligne de commande d'un PDF.
gatorette > bonne idée, faut que je regarde de ce côté.
En somme si je veux gérer une multisortie de mes documents, ça va être une usine à gaz ! ! !
Marsh Posté le 16-07-2003 à 08:45:35
Cherrytree a écrit : Euh, avec Acrobat 5 (par Reader), j'ai lancé l'impression en ligne de commande d'un PDF. |
Ha... ben moi je m'étais basé sur ce que fait windows pour imprimer nu PDF quand Acrobat Reader est installé. Dans le détail de l'action "print" (ou "imprimer" ), on voit que DDE est utilisé.
Pour l'usine à gaz, ça risque de l'être un peu, ouais...
Marsh Posté le 16-07-2003 à 13:34:17
ReplyMarsh Posté le 16-07-2003 à 13:38:50
HelloWorld a écrit : Qu'entends-tu par "router" un document ? |
Le prendre par la main jusqu'à une imprimante du réseau, pour y être imprimé.
Marsh Posté le 16-07-2003 à 15:07:29
Quelle différence avec imprimer directement sur une imprimante (rézo ou pas d'ailleurs) ?
Marsh Posté le 16-07-2003 à 15:24:53
Ok.
"router" sous entendait que tu voulais re-expédier des documents en attente d'impression sur une imprimante X vers une imprimante rezo.
Marsh Posté le 17-07-2003 à 16:49:14
Non non, même pas. En fait, on a un soft qui s'appelle Crystal Reports, lequel édite des documents avec les paramètres qu'on lui passe. CR crache du PDF, du DOC, du XLS... Nos clients ne veulent pas ouvrir manuellement chaque document pour ensuite cliquer sur le bouton print. Je dois donc faire imprimer le document, quelque soit son type, mais pour l'instant disons du PDF, par l'imprimante.
Désolé si je suis peu clair.
Marsh Posté le 21-07-2003 à 13:18:15
Tu bosse sous quel OS?
Sous windows tu dois pouvoir faire un ShellExecute pour l'impression (à voir de plus près) ce qui devrait faire imprimer ton document quel que soit son type, à condition que l'opération soit définie bien sûre.
Marsh Posté le 21-07-2003 à 13:22:37
Je suis sous Windows dans tous les cas. Ainsi avec cette simple commande je peux imprimer un pdf, un xls ou un doc, pourvu que Acrobat Reader, Excel ou Word soit installé, c'est ça ?
Marsh Posté le 21-07-2003 à 13:26:49
Cherrytree a écrit : Je suis sous Windows dans tous les cas. Ainsi avec cette simple commande je peux imprimer un pdf, un xls ou un doc, pourvu que Acrobat Reader, Excel ou Word soit installé, c'est ça ? |
Ouaip:
http://msdn.microsoft.com/library/ [...] xecute.asp
Marsh Posté le 21-07-2003 à 15:04:02
Si vraiment tu es sous Windows et veu faire un truc "pro" regarde du cote de l'automation
C facile a mettre en oeuvre (enfin pas trop complique), ICI la version pour Office (donc Word Excel ou autre). Tu peux normalement tres facilement le faire sur le mm principe avec Acrobat (ca marchait avec la version 3 de reader je pense que ca marche toujours) suffit de recup de Acrobat.Application enfin du genre pour le reader et de faire a peu pres comme pour Word ou excel (enfin pour le lancer et appeler la fonction Print de l'instance sur l'appli)
Marsh Posté le 22-07-2003 à 14:56:10
VisualC++ > j'ai pas tout compris.
Sinon, j'ai essayé de tester ShellExecute, mais je n'ai pas dû comprendre comment ça marchai. J'ai juste fait une frame de base et la fonction WindowProc suivante :
Code :
|
Pouvez-vous m'aider ?
Marsh Posté le 22-07-2003 à 15:00:49
heuh je connais pas la fonction en detail, mais les \ entre " doivent etre doubles (\\)
Marsh Posté le 22-07-2003 à 15:04:40
Effectivement, maintenant ça donne des résultats, merci chrisbk.
Marsh Posté le 22-07-2003 à 16:30:03
Cherrytree a écrit : Effectivement, maintenant ça donne des résultats, merci chrisbk. |
Ben alors !? En java c'est la même chose...
Marsh Posté le 22-07-2003 à 17:11:43
Ben l'automation ca te permettra d'acceder directement au fonction du logiciel via C++
Pour ton pb de print de doc au format PDF ca donne ca sous VisualC++ 6 et + pour imprimer un fichier PDF en passant par un controle ActiveX de Acrobat (il est fourni avec le reader). La version via Automation je l'ai pas la je trouve plus les sources mais bon c plus chiant l'auomation pour Acrobat pour peu de fonction en plus du control ActiveX.
Juste a inserer le control dans ton projet, declare une variable de type ControleActiveXAcrobatReader et de l'utiliser.
Code :
|
A toi apres de jouer avec les fonctions fournies par le control.
Marsh Posté le 22-07-2003 à 17:15:15
ReplyMarsh Posté le 22-07-2003 à 20:47:58
Juste une question : ShellExecute prend en paramètre un handle de fenêtre (HWND). Est-ce que cela m'empêche d'utiliser ShellExecute dans un programme sans GUI ?
Marsh Posté le 22-07-2003 à 21:21:12
chrisbk a écrit : j'en doute, mais consulte la msdn en cas de doute |
Je redoute.
Marsh Posté le 22-07-2003 à 22:20:30
Je pense pas, on peut utiliser les messageBox sans avoir de handle sous la main.
Marsh Posté le 22-07-2003 à 22:28:45
a vrai dire je me demande pkoi shellExecute a besoin d'un hwnd ?
Marsh Posté le 22-07-2003 à 23:03:24
chrisbk a écrit : a vrai dire je me demande pkoi shellExecute a besoin d'un hwnd ? |
Pour y envoyer les éventuels dialogues : rapports d'erreurs...
Marsh Posté le 28-07-2003 à 10:53:04
Je profite de ce topic pour plonger plus avant dans la programmation C Windows.
J'ai remarqué que la fonction ShellExecute forwarde l'impression vers l'imprimante par défaut.
Peut-on faire autrement ?
J'aimerais pouvoir spécifier l'imprimante sur laquelle le travail d'impression doit se faire. Quelles structures/fonctions dois-je potasser ?
Marsh Posté le 28-07-2003 à 10:58:21
Cherrytree a écrit : Je profite de ce topic pour plonger plus avant dans la programmation C Windows. |
Tu dois pouvoir passer des paramètres à print, non?
Marsh Posté le 28-07-2003 à 11:03:49
ReplyMarsh Posté le 28-07-2003 à 11:17:01
A moin que l'appli qui imprimme ne puisse prendre en paramétre l'imprimente cible, il va falloir que tu change l'imprimente par défaut avant l'impression.
Marsh Posté le 28-07-2003 à 11:18:50
Citation : J'ai remarqué que la fonction ShellExecute forwarde l'impression vers l'imprimante par défaut. |
ShellExecute ne fait rien d'autre que d'analyser la bdr pour retrouver la commande à envoyer pour imprimer le document demandé. ShellExecute n'imprime rien, mais demande l'impression, si elle sait le faire.
Pour un pdf par exemple, lance regedit, va à la clé HKCR\.pdf
Tu apprends que c'est un fichier de type AcroExch.Document.
Va à HKCR\AcroExch.Document\shell et tu as la liste des commandes que l'on peut passer à ShellExecute que ce type de document peut traiter. En l'occurence :
"HKCR\AcroExch.Document\shell\print\command" donne sur ma machine ""C:\Program Files\Adobe\Acrobat 5.0\Reader\AcroRd32.exe" /p /h "%1""
Donc ça appelle juste AcroRd32 avec le paramètre /p pour print (je suppose). Faut donc potasser l'aide de Acrobat pour savoir quel(s) paramètre(s) passer pour spécifier une autre imprimante. Tu passes ces paramètres avec le champ spécial de ShellExecute.
Faut procéder ainsi pour tous les documents que tu veux ...
Marsh Posté le 28-07-2003 à 13:24:33
HelloWorld > Un grand merci ! Je comprends maintenant le fonctionnement de ShellExecute. C'est moins magick soudain.
Marsh Posté le 28-07-2003 à 13:29:30
Après si tu veux qqc de plus fin faut utiliser l'automation, comem l'avais déjà remarquer qqn d'autre (je sais plus qui désolé )
Marsh Posté le 28-07-2003 à 13:50:10
Alors dans ce cas, j'ai besoin de sélectionner par programmation l'imprimante. Des pistes ?
Marsh Posté le 28-07-2003 à 13:50:47
LetoII a écrit : Après si tu veux qqc de plus fin faut utiliser l'automation, comem l'avais déjà remarquer qqn d'autre (je sais plus qui désolé ) |
ça me fait peur ! Mais je vais peut-être devoir m'y risquer.
Marsh Posté le 28-07-2003 à 13:53:55
LA methode que je t ai indique via l automation/activex ca prend 4 ligne de code ca va c pas la mort
Marsh Posté le 29-07-2003 à 09:29:45
VisualC++ a écrit : LA methode que je t ai indique via l automation/activex ca prend 4 ligne de code ca va c pas la mort |
Le contrôle Acrobat que tu utilises quelques posts plus haut, il correspond à quoi, je veux dire : tu le crées ? tu récupères une référence sur un objet qu'Acrobat propose (il y a de la doc sur ces choses là ?) ?
Marsh Posté le 29-07-2003 à 09:39:02
Tu as normalement un ActiveX utilisable depuis ton IDE (ajouter un composant COM).
Sinon y'a le Adobe SDK mais je crois que c'est payant.
Faut chercher avec google ...
Marsh Posté le 29-07-2003 à 10:19:02
Reply
Marsh Posté le 15-07-2003 à 16:32:47
Comment faire pour router un fichier PDF (ou autre d'ailleurs : doc, rtf...) vers une imprimante du réseau ? Quelle est la complexitéje de la tâche ? De quoi ai-je besoin ? Acrobat doit-il être installé ?
---------------
Le site de ma maman