IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

WinDev Discussion :

Imprimer un pdf sur imprimante sans l'ouvrir


Sujet :

WinDev

  1. #1
    Membre éprouvé
    Inscrit en
    Avril 2008
    Messages
    1 129
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 1 129
    Points : 1 283
    Points
    1 283
    Par défaut Imprimer un pdf sur imprimante sans l'ouvrir
    Salut les amis!

    Tout est dans le titre! Cela est il possible tout d'abord?

    J'arrive à récupérer la liste des fichiers pdf d'un dossier. Je souhaiterais envoyer leur impression sur l 'imprimante par défaut sans même un apercu avant impression et sans les ouvrir avec adobe par exemple.

    Je ne trouve rien dans l'aide je donne ma langue, ma bouche et si vous voulez même ma tête de chat

  2. #2
    Membre expérimenté Avatar de klbsjpolp
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    1 065
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 065
    Points : 1 322
    Points
    1 322
    Par défaut
    C'est sûr que c'est possible, mais c'est peut-être un peu trop compliqué de le faire en wlanguage. Si j'étais toi, je chercherais un utilitaire pour imprimer des pdfs depuis la ligne de commande et je l'appellerais dans mon code.
    «Un problème bien défini est un problème à moitié résolu.»

  3. #3
    Membre éprouvé
    Inscrit en
    Avril 2008
    Messages
    1 129
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 1 129
    Points : 1 283
    Points
    1 283
    Par défaut
    Merci pour l'Excellente idée klbsjpolp

    Je vais commencé ma recherche

  4. #4
    Membre du Club Avatar de samlerouge
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    58
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2003
    Messages : 58
    Points : 66
    Points
    66
    Par défaut

    pour effectuer une impression d'un PDF existant, j'utilise les DDE pour contrôler Adobe Reader.

    A l'époque , je me suis basé de l'exemple suivant trouvé sur le forum de PC SOFT.
    Cela te permet d'effectuer une impression silencieuse et sur l'imprimante de ton choix . A noter que ce script fonctionne avec Adobe Acrobat et Adobe Reader.

    http://forum.pcsoft.fr/post.awp?grou...de%2Badobe&v=2

    Bon dév

    Samuel
    Windev-Webdev - Oracle- PLSQL
    est l'ami de tout le monde

  5. #5
    Membre éprouvé
    Inscrit en
    Avril 2008
    Messages
    1 129
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 1 129
    Points : 1 283
    Points
    1 283
    Par défaut
    Sam
    Merci pour le lien, entre temps j'avais trifouillé quelque chose, le hic est que le acrobat reader est ouvert, je tue le processus après.

    Je vais quand même voir ton lien !

    Voici le code pour ceux que ca interesse ou pour améliorer:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    // impression pdf des passation de caisse de la journée
    SlisteFichier, sFichierListe, sLigneCommande sont des chaînes
     
    SI fRépertoireExiste(MonRépertoire) ALORS
    	// Ajout des fichiers PDF à la liste
    	SlisteFichier = fListeFichier(MonRépertoire+ "\*.pdf",frNonRécursif)
    	POUR TOUTE CHAINE sFichierListe DE SlisteFichier SEPAREE PAR RC   
    		//Impression des fichiers *.pdf
    		sLigneCommande="C:\Program Files\Adobe\Reader 8.0\Reader\AcroRd32.exe /p/h """ + sFichierListe + """"
    		SI PAS LanceAppli(sLigneCommande)ALORS
    			Info(ErreurInfo)
    		FIN
     
    	FIN
     
    FIN
     
    // Ajout des applications en cours d'exécution dans le champ "ListeAppli"
    ListeAjoute(ListeAppli, ExeListeProcessus())
     
    sListe est une chaîne
     
    nRes est un entier = ListeCherche(ListeAppli,"AcroRd32.exe")
    SI nRes>0 ALORS
    	//Info(ListeAppli[nRes])
    	ExeTermine(ListeAppli[nRes])
    FIN

  6. #6
    Membre émérite

    Profil pro
    Inscrit en
    Février 2005
    Messages
    1 751
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 1 751
    Points : 2 368
    Points
    2 368
    Par défaut
    Bonjour,

    Le WLangage propose la fonction LanceAppliAssociée() qui encapsule l'API Windows ShellExecute.

    En gros, à une syntaxe de chemin et à un type de fichier sont associés des verbes (des actions) pour lesquels une ligne de commande est définie dans la base de registre.

    Voici quelques verbes possibles: open, print, printto, edit, explore, properties

    Ainsi, en se reposant sur ShellExecute, on peut demander à Windows d'imprimer un fichier, sans se soucier de connaître l'application qui réalise l'action.

    Voilà un exemple issu de l'aide en ligne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    // Imprime le document
    LanceAppliAssociée("C:\WDNEWS\Version\Fonctions.doc", "print")
    _

  7. #7
    Membre éprouvé
    Inscrit en
    Avril 2008
    Messages
    1 129
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 1 129
    Points : 1 283
    Points
    1 283
    Par défaut
    Salut Maestro JBO

    Ca fonctionne super bien en une ligne de code

    Par contre la fenetre Acrobat Reader qui s'ouvre, n'y a t-il pas une solution?

    Je suis obligé de mettre un arret avec un info("Impression") sinon mon code pour terminer le processus se lance et l'impression n'a pas le temps de se lancer...

    Le code devient ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    SlisteFichier, sFichierListe sont des chaînes
    SI fRépertoireExiste(MonRépertoire) ALORS
    	// Ajout des fichiers PDF à la liste
    	SlisteFichier = fListeFichier(MonRépertoire+ "\*.pdf",frNonRécursif)
    	POUR TOUTE CHAINE sFichierListe DE SlisteFichier SEPAREE PAR RC   
    		//Impression des fichiers *.pdf
    		SI PAS LanceAppliAssociée(sFichierListe,"print")ALORS
    			Info(ErreurInfo)
    		FIN
    	FIN
    FIN
     
    // Sans cet info pour arrêter le processus acrobat reader est terminé sans que les impressions aient pu être effectuées
     
    Info("Impression ok")
     
    // Ajout des applications en cours d'exécution dans le champ "ListeAppli"
    ListeAjoute(ListeAppli, ExeListeProcessus())
     
    nRes est un entier = ListeCherche(ListeAppli,"AcroRd32.exe")
    SI nRes>0 ALORS
    	//Info(ListeAppli[nRes])
    	ExeTermine(ListeAppli[nRes])
    FIN

  8. #8
    Membre émérite

    Profil pro
    Inscrit en
    Février 2005
    Messages
    1 751
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 1 751
    Points : 2 368
    Points
    2 368
    Par défaut
    Salut,
    Citation Envoyé par zouzoukha Voir le message

    Par contre la fenetre Acrobat Reader qui s'ouvre, n'y a t-il pas une solution?

    Je suis obligé de mettre un arret avec un info("Impression") sinon mon code pour terminer le processus se lance et l'impression n'a pas le temps de se lancer...
    Effectivement, je constate comme toi que le couple LanceAppliAssociée() + Acrobat Reader n'est pas un modèle de discrétion: (1) une fenêtre s'ouvre à l'écran; (2) après l'impression le document reste ouvert.
    A la limite, je préfère encore la ligne de commande avec les deux options /p /h.

    Mais quand même, ce n'est pas l'idéal de forcer l'arrêt du processus: imagine que l'utilisateur soit en train d'utiliser Acrobat Reader !

    Je comprends mieux tout l'intérêt de la fonction DDE proposée par samlerouge.

    Pour revenir à la fonction LanceAppliAssociée(), elle ne permet pas autant de choses que les API ShellExecute et ShellExecuteEx (néanmoins c'est quand même pas mal de pouvoir spécifier le verbe).

    Alors tu peux aussi envisager de programmer directement les API, mais sans être certain du résultat final (a priori, Acrobat Reader n'est pas prévu pour ouvrir plus d'une instance).
    Tu peux aussi utiliser le composant ActiveX fourni avec Acrobat Reader: pdf.ocx (résultat propre et embarqué dans l'application).
    Mais aussi, comme le suggère klbsjpolp, passer par un utilitaire pour l'impression des PDF.

    Justement, j'en vois un qui a l'air bien sympa. Il s'appelle PDF-XChange Viewer (version freeware possible):
    http://www.docu-track.com/home/prod_...s/pdfx_viewer/.

    Apparemment (1) il pourrait se piloter via la ligne de commande (options /print, /printto, /close) et (2) permettrait de lancer des instances mutiples (ce qui évite de "squatter" un viewer déjà démarré par l'utilisateur).

    C'était juste une piste. Je ne l'ai pas encore testé.
    _

  9. #9
    Membre émérite

    Profil pro
    Inscrit en
    Février 2005
    Messages
    1 751
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 1 751
    Points : 2 368
    Points
    2 368
    Par défaut Exemple d'utilisation de l'ActiveX pdf.ocx
    Bonjour,

    En pièce jointe, je vous propose un petit exemple d'utilisation de l'ActiveX pdf.ocx installé avec Acrobat Reader.

    [EDIT n°="1"]
    Attention: ici l'ActiveX référencé est celui fourni avec Acrobat Reader 6.
    Je ne sais pas si WinDev peut automatiquement s'adapter selon la version installée sur le PC.
    Franchement, j'en doute... ni WinDev, ni aucun autre.
    [/EDIT]


    Le nom "en clair" de l'ActiveX est Adobe Acrobat Control for ActiveX.
    Il est intégré dans la fenêtre FEN_AcrobatReader (cf. la pièce jointe, développée avec WD12).

    Cette fenêtre peut fonctionner en mode discret :
    si on lui passe en paramètre le chemin d'un fichier PDF, celui-ci est directement imprimé sur l'imprimante par défaut et la fenêtre se referme immédiatement.

    Exemple d'utilisation:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Ouvre(FEN_AcrobatReader, "c:\TestFax.pdf")
    [EDIT n°="2"]
    J'ai modifié la pièce jointe.

    L'identifiant de l'ActiveX Acrobat Reader n'est plus fixé "en dur" dans la description du champ.

    A la place, à l'ouverture de la fenêtre, une série de tests permet de déterminer quelle version de l'ActiveX est installée sur le PC.
    C'est cette version qui est alors référencée et le document PDF peut ensuite être manipulé.
    [/EDIT]

    _
    Fichiers attachés Fichiers attachés

  10. #10
    Membre expérimenté Avatar de klbsjpolp
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    1 065
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 065
    Points : 1 322
    Points
    1 322
    Par défaut
    À vrai dire, ma solution était plutôt d'utiliser un tool que l'on pourrait redistribuer avec le logiciel plutôt que d'obliger l'utilisateur à installer un logiciel spécifique. Personnellement, les solutions de Adobe et de PDF-XChange ne sont pas viable sans obliger l'installation d'un logiciel tiers.
    «Un problème bien défini est un problème à moitié résolu.»

  11. #11
    Membre averti

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2010
    Messages
    125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2010
    Messages : 125
    Points : 399
    Points
    399
    Par défaut
    Bonjour,

    Ma réponse arrive certainement un peu tard, mais je peux vos conseiller l'utilisation de PDFCreator, un outil gratuit qui peut s'installe en mode serveur au cas oû, qui propose un imprimant virtuel PDF et qui a une interface COM completement intégrable en WinDev. Je l'ai utilisé pour gérer des conversions et des impressions PDF pour un site Web, il fonctionne parfaitement bien.
    Si cela vous intéresse , je pourrais vous fournir ici un exemple de code d'intégration.

    Cordialement.

    Le lien vers PDFCreator :
    http://sourceforge.net/projects/pdfcreator/files/

    [EDIT]
    Pour ceux qui veulent, approfondir, vous pouvez jeter un oeil sur cette contribution expliquant une technique de mise en oeuvre de PDF Creator depuis WinDev...
    http://www.developpez.net/forums/d86...f-pdf-creator/

    Si vous avez des questions ou suggestions, n'hésitez pas...

  12. #12
    Membre éprouvé
    Inscrit en
    Avril 2008
    Messages
    1 129
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 1 129
    Points : 1 283
    Points
    1 283
    Par défaut
    Salut les amis, et merci pour toutes ses réponses

    Désolé du retard, mais je vais étudier toutes ses propositions...
    L'idée d'intégrer un logiciel tiers (meme en freeware) n'est pas ma solution préférée.
    J'ai jamais utilisé les activeX (une peur bleue) mais je pense que je ne vais pas y echapper

    Si je coule j'espère que vous allez m'eviter la noyade?

  13. #13
    Membre éprouvé
    Inscrit en
    Avril 2008
    Messages
    1 129
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 1 129
    Points : 1 283
    Points
    1 283
    Par défaut
    Salut les amis

    ca commence deja avec les activeX aïiieee !!!

  14. #14
    Membre émérite

    Profil pro
    Inscrit en
    Février 2005
    Messages
    1 751
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 1 751
    Points : 2 368
    Points
    2 368
    Par défaut
    Bonjour zouzoukha,

    Je ne voudrais pas t'embarquer malgré toi dans une "mauvaise" solution technique.

    Pour ce qui est des contrôles ActiveX, il n'y a rien de compliqué la dedans.
    Mais il y a une contrainte forte: il faut que le contrôle ActiveX (référencé par le champ ActiveX) soit installé sur le PC, et pas un quelconque contrôle compatible ou similaire, ni une version antérieure ou postérieure.

    En effet, un contrôle ActiveX est identifié de manière unique (l'identifiant tenant compte de la version), et je pense que le champ ActiveX de WinDev mémorise cet identifiant et ne permet d'utiliser que le contrôle correspondant.

    Quelle est la version d'Acrobat Reader installée sur ton PC ?
    L'exemple que je donne fonctionne avec une version 6 (déjà ancienne puisqu'Acrobat en est à la version 9).

    Pour tenir compte de la version installée sur ton PC, tu peux modifier le champ champPDF dans la fenêtre FEN_AcrobatReader afin de référencer le bon contrôle ActiveX.

    Par la suite, si tu retiens l'idée d'utiliser un contrôle ActiveX, mais que les PC ciblés n'ont pas la même version de l'ActiveX, il faudra que l'application puisse s'adapter au contexte.
    Dans les propriétés du champ ActiveX, je n'ai rien vu qui permette de modifier dynamiquement la référence du contrôle ActiveX.
    Peut-être faudra-t-il prévoir différents champs (ou fenêtres) configurés pour s'adapter aux multiples cas de figures à supporter ?

    _

  15. #15
    Membre éprouvé
    Inscrit en
    Avril 2008
    Messages
    1 129
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 1 129
    Points : 1 283
    Points
    1 283
    Par défaut
    Salut JBO

    Pas de souci, je sais bien ce qui m'attend ... Je ne vais pas échapper aux actives X (en dehors de acrobat, il y a par exemple des plannings que j'ose pas aborder)

    Tôt ou tard je vais y trépasser.
    Alors faut bien commencer...

  16. #16
    Membre émérite

    Profil pro
    Inscrit en
    Février 2005
    Messages
    1 751
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 1 751
    Points : 2 368
    Points
    2 368
    Par défaut
    Bonjour,

    Citation Envoyé par =JBO= Voir le message

    Quelle est la version d'Acrobat Reader installée sur ton PC ?
    L'exemple que je donne fonctionne avec une version 6 (déjà ancienne puisqu'Acrobat en est à la version 9).

    Pour tenir compte de la version installée sur ton PC, tu peux modifier le champ champPDF dans la fenêtre FEN_AcrobatReader afin de référencer le bon contrôle ActiveX.

    Par la suite, si tu retiens l'idée d'utiliser un contrôle ActiveX, mais que les PC ciblés n'ont pas la même version de l'ActiveX, il faudra que l'application puisse s'adapter au contexte.
    En fait, c'est assez simple.
    Il est possible à l'exécution de spécifier le ProgID (identifiant) de l'ActiveX installé sur le PC.

    Citation Envoyé par =JBO= Voir le message

    Dans les propriétés du champ ActiveX, je n'ai rien vu qui permette de modifier dynamiquement la référence du contrôle ActiveX.
    J'avais mal vu: la propriété Valeur permet de spécifier le ProgID de l'ActiveX.

    Ce qui pourrait donner quelque chose comme:
    Code WLangage : Sélectionner tout - Visualiser dans une fenêtre à part
    ChampPDF..Valeur = "PDF.pdfctrl.6"

    Reste à déterminer quelle version de l'ActiveX Acrobat Reader est installée sur le PC...
    Pour ne pas avoir à gérer les différentes versions d'acrobat reader, il vaut mieux passer par l'activex Internet Explorer.

    Exemple de code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    			// Procédure qui permet d'initialiser l'activeX dynamiquement
    			// L'ActiveX est-il installé ?
    			SI PAS RegistreExiste("HKEY_CLASSES_ROOT\Shell.Explorer") ALORS
    				Erreur("Cette application nécessite Internet Explorer 4 minimum")
    				FinProgramme()	
    			FIN
    			// Chargement de l'ActiveX
    			ACTACROBAT="Shell.Explorer"
    			// Vérification de la présence de l'objet Shell.Explorer
    			objTest est un objet OLE dynamique = actacrobat
    			SI objTest = Null ALORS
    				libérer objTest
    				Erreur("Le navigateur du poste n'est pas internet explorer, vous ne pouvez pas afficher les documents PDF")
    			FIN
    			libérer objTest
    		FIN
    		// Chargement du fichier
    		Message("Chargement du fichier "+F_NomfichPdf)
    		ACTACROBAT>>navigate(F_NomfichPdf)
    		Multitâche(-1)
    Dans ce code ACTABROBAT est un objet activex déclaré sur la fenêtre sans précision, il est affecté dynamiquement à Internet explorer.

    La référence de l'objet activex Acrobat reader dans la base de registre est Pdf.pdfCtrl.N
    N est égal à 1 pour la version 4, 5 pour la version 5, et 6 pour la version 6.
    La référence pour la version 7 est AcroPDF.PDF.1

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    VL_Objtest est un objet Automation dynamique
    VL_TableVersion est chaîne="pdf.pdfctrl.1;pdf.pdfctrl.5;pdf.pdfctrl.6;AcroPDF.PDF.1;"
    VL_Version est une chaîne
    VL_VersionTrouvee est une chaîne
    VL_i est entier
    TANTQUE SansEspace(VL_VersionTrouvee)=""
    	VL_i++
    	VL_Version=SansEspace(ExtraitChaîne(VL_TableVersion,VL_i,";"))
    	SI VL_Version=EOT ALORS
    		VL_VersionTrouvee="AUCUNE"
    	SINON
    		SI VL_Version<>"" ALORS
    			QUAND EXCEPTION DANS
    				VL_Objtest=allouer un objet Automation VL_Version
    			FAIRE
    				libérer VL_Objtest	
    			SINON
    				VL_VersionTrouvee=VL_Version
    				libérer VL_Objtest
    			FIN
    		FIN
    	FIN
    FIN
    Info(VL_VersionTrouvee)
    Je vais modifier la pièce jointe de mon précédent message pour tenir compte de ces dernières informations et améliorations.

    Cependant, ne connaissant pas le ProgID des versions 8 et suivantes, je demande à toute personne de bonne volonté de bien vouloir m'aider à les trouver. Ainsi, nous serons plus exhaustifs.

    Merci.
    _

  17. #17
    Membre averti

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2010
    Messages
    125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2010
    Messages : 125
    Points : 399
    Points
    399
    Par défaut Contribution Conversion et impression PDF avec PDF Creator
    Suite à ce fil de discussion et à quelques MP de certains membres de ce forum, j'ai mis à disposition un petit topo dans le sous forum Contribuez présentant une technique de mise en oeuvre de PDF Creator depuis WinDev...

    Voila le lien :
    http://www.developpez.net/forums/d86...f-pdf-creator/

    Je suis disponible pour toutes questions ou suggestions...

    Cordialement,

    Laurent.

Discussions similaires

  1. solution native pour imprimer un pdf sur une imprimante en Java
    Par thierry_b dans le forum API standards et tierces
    Réponses: 6
    Dernier message: 04/05/2014, 03h00
  2. [WD15] Imprimer un PDF (sur imprimante physique)
    Par Bowen dans le forum WinDev
    Réponses: 5
    Dernier message: 08/07/2011, 17h18
  3. [WD15] Imprimer fichier PDF sur imprimante spécifiée
    Par alf666666 dans le forum WinDev
    Réponses: 6
    Dernier message: 12/11/2010, 09h57
  4. imprimer un PDF sur une imprimante non par défaut
    Par bremer dans le forum Langage
    Réponses: 5
    Dernier message: 25/12/2007, 22h46
  5. Imprimer des pdf sur plusieurs imprimantes
    Par Peyotte dans le forum Delphi
    Réponses: 9
    Dernier message: 16/08/2006, 09h17

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo