[C Windows] Imprimer un PDF

Imprimer un PDF [C Windows] - C - Programmation

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
Reply

Marsh Posté le 15-07-2003 à 16:32:47   

Reply

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.


---------------
each day I don't die is cheating
Reply

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).
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.


 
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...

Reply

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 ! ! !


---------------
Le site de ma maman
Reply

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.
 
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 ! ! !


 
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...

Reply

Marsh Posté le 16-07-2003 à 13:34:17    

Qu'entends-tu par "router" un document ?


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh 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é.


---------------
Le site de ma maman
Reply

Marsh Posté le 16-07-2003 à 15:07:29    

Quelle différence avec imprimer directement sur une imprimante (rézo ou pas d'ailleurs) ?


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 16-07-2003 à 15:18:04    

C'est la même chose.


---------------
Le site de ma maman
Reply

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.


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 16-07-2003 à 15:24:53   

Reply

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.


---------------
Le site de ma maman
Reply

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.


---------------
Le Tyran
Reply

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 ?


---------------
Le site de ma maman
Reply

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


---------------
Le Tyran
Reply

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)


Message édité par VisualC++ le 21-07-2003 à 15:20:05
Reply

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 :
  1. LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
  2. {
  3.     switch (uMsg)
  4.     {
  5.         case WM_LBUTTONDOWN:
  6.             ShellExecute(hwnd, "print", "C:\test.txt", NULL, "C:\TEMP", SW_SHOWNORMAL);
  7.             return 0;
  8.         case WM_DESTROY:
  9.             PostQuitMessage(0);
  10.             return 0;
  11.         default:
  12.             return DefWindowProc(hwnd, uMsg, wParam, lParam);
  13.     }
  14. }


 
Pouvez-vous m'aider ?


---------------
Le site de ma maman
Reply

Marsh Posté le 22-07-2003 à 15:00:49    

heuh je connais pas la fonction en detail, mais les \ entre " doivent etre doubles (\\)

Reply

Marsh Posté le 22-07-2003 à 15:04:40    

Effectivement, maintenant ça donne des résultats, merci chrisbk.


---------------
Le site de ma maman
Reply

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...

Reply

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 :
  1. void CDocumentHandle::m_fnvPrintDoc(CString& docName, int iStart, int iStop)
  2. {
  3. m_AcrobatControl.CreateObject();
  4. m_AcrobatControl.ShowWindow(false);
  5. m_AcrobatControl.LoadFile(docName);
  6. if (iStart == -1)
  7.  m_AcrobatControl.printAll();
  8. else {
  9.  m_AcrobatControl.printPages(iStart, iStop);
  10. }
  11. }


 
A toi apres de jouer avec les fonctions fournies par le control.

Reply

Marsh Posté le 22-07-2003 à 17:15:15    

Je regarde ça ce soir ou demain. Merci beaucoup.


---------------
Le site de ma maman
Reply

Marsh 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 ?


---------------
Le site de ma maman
Reply

Marsh Posté le 22-07-2003 à 20:51:10    

j'en doute, mais consulte la msdn en cas de doute

Reply

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.


---------------
Le site de ma maman
Reply

Marsh Posté le 22-07-2003 à 22:20:30    

Je pense pas, on peut utiliser les messageBox sans avoir de handle sous la main.


---------------
Le Tyran
Reply

Marsh Posté le 22-07-2003 à 22:28:45    

a vrai dire je me demande pkoi shellExecute a besoin d'un hwnd ?

Reply

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...


---------------
Le site de ma maman
Reply

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 ?


---------------
Le site de ma maman
Reply

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.
 
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 ?


Tu dois pouvoir passer des paramètres à print, non? :??:

Reply

Marsh Posté le 28-07-2003 à 11:03:49    

Je ne sais pas. C'est justement pour ça que je demande.


---------------
Le site de ma maman
Reply

Marsh 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.


---------------
Le Tyran
Reply

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 ...


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

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.


---------------
Le site de ma maman
Reply

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é :D)


---------------
Le Tyran
Reply

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 ?


---------------
Le site de ma maman
Reply

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é :D)


ça me fait peur ! Mais je vais peut-être devoir m'y risquer.


---------------
Le site de ma maman
Reply

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  :whistle:

Reply

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  :whistle:  


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à ?) ?


---------------
Le site de ma maman
Reply

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 ...


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 29-07-2003 à 10:19:02    

Je ne suis pas sorti de l'auberge.


---------------
Le site de ma maman
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed