Bonjour,
Suite à un fil de discussion sur le sujet sur ce forum, je vous propose une solution d'impression et de conversion de documents PDF à l'aide de PDF Creator
Tout d'abord, le lien vers la discussion qui m'a amené à vous proposer d'ajouter ma pierre à l'édifice :
http://www.developpez.net/forums/d86...mante-louvrir/
Cet outil est un freeware, donc pas de souci de licence. Vous pouvez le télécharger ici :
http://sourceforge.net/projects/pdfcreator/
PDF Creator dispose d'une interface COM qui permet de le piloter intégralement, donc depuis WinDev ou WebDev, pas de soucis particulier
Dans votre projet, vous devez commencer par déclarer les variables qui vous permettront d'instancier vos objets :
Ensuite vous instanciez les objets nécessaires :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 MonPDF est un objet OLE dynamique // Objet pilotant PDF Creator ErreurPDF est un objet OLE dynamique // Objet permettant de gérer les erreurs PDF Creator MesOptionsPDF est un objet OLE dynamique // Ojet permettant de piloter les options de PDF Creator DefaultPrinter est une chaîne
Les différentes fonctions utilisées sont très bien décrites dans l'aide de PDF Creator, et tout fonctionne tres bien.
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 SI PAS gbPdfCreatorDemarre ALORS //Allocation de l'objet PDFCreator : si il est déjà démarré, on l'utilise. MonPDF = ObjetActif("PDFCreator.clsPDFCreator") SI MonPDF=Null ALORS MonPDF=allouer un objet OLE "PDFCreator.clsPDFCreator" ErreurPDF = ObjetActif("PDFCreator.clsPDFCreatorError") // On alloue un objet pour gérer les erreurs. MesOptionsPDF =ObjetActif("PDFCreator.clsPDFCreatorOptions") // On alloue un objet pour gérer les options. AutomationEvénement(Eve_PDFCreator_eReady,MonPDF,"eReady") // Les deux procédures de gestion des évenements PDFCreator. -eReady = Pret et dispo pour doc suivant AutomationEvénement(Eve_PDFCreator_eError,MonPDF,"eError") // -eError = Probleme avec PDFCreator FIN FIN SI PAS MonPDF>>cProgramIsRunning ALORS SI MonPDF>>cStart("/NoProcessingAtStartup", Vrai) = Faux ALORS Erreur("Impossible d'initialiser PDFCreator.") RETOUR FIN gbPdfCreatorDemarre = Vrai SINON gbPdfCreatorDemarre = Vrai FIN
ATTENTION : dans mon code, j'utilise deux méthodes AUTOMATIOnEvenement, ceci avec un résultat mitigé : la méthode Eve_PDFCreator_eReady est censé renvoyé vrai quand le traitement en cours est terminé, mais je n'ai pas réussi à la faire fonctionner correctement. il faudra creuser ce point. Je m'y pencherai dès que j'aurais un peu de temps.
Ensuite il vous est possible de modifier différents parametres de PDF Creator, il y en a une quantité non négligeable, mais en gros, le principe est le meme :
Pour modifier l'imprimante en cours et la restaurer ensuite par exemple :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 MonPDF>>cVisible = Faux //Rend PDF Creator invisible MonPDF>>cOption("AutosaveFormat") = 0 //Format PDF MonPDF>>cOption("UseAutosave") = 1 //Sauvegarde automatique MonPDF>>cOption("UseAutosaveDirectory") = 1 //Utilisation du repertoire sauvegardé. MonPDF>>cDefaultprinter = "PDFCreator" //Affecte l'imprimante PDF comme imprimante par défaut MonPDF>>cClearCache
et à la fin du traitement, vous la restaurez.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 DefaultPrinter=iInfoImprimante(Faux) iConfigure("PDFCreator",Faux)
Ensuite exemple de traitement fichier par fichier, mais vous pouvez aussi envoyer toute une liste de fichier en file d'attente...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2MonPDF>>cDefaultprinter = DefaultPrinter
cPrinterStop permet de suspendre ou non la file d'attente d'impression... si il est à vrai , vous "empilez" vos fichiers dans le spooler jusqu'à ce que vous repassiez à Faux cPrinterStop...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 // Conversion PDF sNomCompletFichieraConvertir = sRepertoireNonPDFlocal+"\"+sNomCompletFichier SI PAS MonPDF>>cIsPrintable(sNomCompletFichieraConvertir) ALORS //Traitement erreur .... SINON MonPDF>>cPrinterStop = Faux MonPDF>>cOption("AutosaveDirectory") = sRepertoirePDFlocal MonPDF>>cOption("AutosaveFilename") = fExtraitChemin(sNomCompletFichieraConvertir,fFichier) MonPDF>>cPrintfile(sNomCompletFichieraConvertir) FIN
Voila, il est bien entendu possible d'affiner encore, mais cette méthode fonctionne bien et est en production actuellement, sans probleme particulier. Je précise, dans mon cas, il s'agit de convertir différents types de documents en PDF et de les stocker dans un répertoire mais le principe est exactement le même pour imprimer des PDF...
Voilà, en espérant vous avoir donné des pistes. J'ai utilisé cet outil après de nombreuses recherches sur les différents forums et pour rendre à César ce qui est à César , la base de ma procédure est largement inspirée d'un fil de discussion trouvé sur un forum. (je ferais une petite recherche pour faire apparaitre le nom de son auteur originel...)
Je suis bien entendu à votre disposition pour toutes suggestions ou discussions, débats, critiques....
Très cordialement,
Laurent.
Partager