Message de rapport:
 

Explication : Imprimer par prog des PDF avec acrobat reader

Sujet: Explication : Imprimer par prog des PDF avec acrobat reader
par PopCorn sur 2/3/2005 11:13:59

Je poste ce topic non pas pour poser une question mais pour exposer la solution que j'ai trouvé pour imprimer des documents PDF par programmation via le logiciel acrobat reader.
Cela faisait plusieurs semaines que je planchais sur le problème et j'ai enfin trouvé cette solution qui me libère d'une tension certaine :)

Je souhaitais donc trouver une solution gratuite pour imprimer de manière "propre" des PDF. J'avais trouvé un petit utilitaire "GSPrint" qui permettait de faire cela mais l'installation n'était pas des plus simple et je rencontrais un soucis de temps en temps : si le document PDF n'avait pas une marge assez importante sur la gauche, à l'impression, celle-ci était tout simplement "mangée" par GSPrint qui nous sortait donc des documents incomplet. (il ne recadrait pas le PDF avant impression)

Je me suis donc penché vers des objet COM. Problème, et de taille, les objets COM ne sont utilisable qui si Adobe Acrobat (ne pas confondre avec acrobat reader) était installé (299$ quand même). Enfin,après téléchargement de la version trial, j'avais réussi à faire un petit code pour lancer une impression via ces objets.

oPDF est un objet Automation dynamique

oPDF = allouer un objet Automation("AcroExch.PDDoc")

oPDF>>open("C:\test.pdf")
//---La commande pour imprimer se manipule via un autre objet automation.
//---Désolé, je ne retrouve plus la portion de code pour imprimer
oPDF>>close()

libérer oPDF


Mais il y avait une chose à laquelle je n'avais pas pensé : Je devais pouvoir imprimer sur n'importe quelle imprimante déclarée sur mon ordinateur. Or les objets COM permettent uniquement d'imprimer sur la dernière imprimante utilisée par l'utilisateur sous acrobat. J'étais donc bloqué (299$ + ce problème de sélection d'imprimante)

Je me retourne a nouveau vers acrobat reader et je me penche vers une autres méthode : les liaisons DDE
Une liaison DDE permet de faire communiquer 2 applications entre elles. Après plusieurs jours de recherche, je suis tombé sur le document ultime qui me donnait toutes les commandes DDE disponibles. L'une d'entres elles me permet d'imprimer sur l'imprimante de mon choix. Voici donc une procédure qui prend en entrée le chemin vers l'exécutable de Acrobat Reader (qui peut aussi être récupérable dans la base de registre), l'imprimante de sortie souhaitée et le nom du fichier à imprimer.
Ce code a été testé sur Acrobat Reader 7 et fonctionne parfaitement

PROCEDURE ImprimePDF(AcrobatPath,Printer,PDF)

id est un entier

//---On boucle pour attendre le lancement de acrobat reader
TANTQUE ExeLancé(AcrobatPath) = Faux
	DDELance(AcrobatPath,DDEIconise,Faux)	
FIN

//---Connexion à la liaison DDE de acrobat
id = DDEConnecte("acroview","control")

//---Dans le cas où Acrobat n'avait pas terminé de charger ses plug-ins
TANTQUE id = 0
	id = DDEConnecte("acroview","control")
FIN

//---On sélectionne temporairement l'imprimante de notre choix
iConfigure(Printer,Vrai)

//---On ouvre le document à imprimer
DDEExécute(id,"[DocOpen("+Caract(34)+PDF+Caract(34)+")]")
//---On lance une impression silencieuse sur l'imprimant de notre choix
DDEExécute(id,"[FilePrintTo("+Caract(34)+PDF+Caract(34)+","+Caract(34)+iInfoImprimante(Vrai,iNomImprimante)+Caract(34)+","+Caract(34)+iInfoImprimante(Vrai,iNomDriver)+Caract(34)+","+Caract(34)+iInfoImprimante(Vrai,iNomPort)+Caract(34)+")]")
//---On ferme le document PDF
DDEExécute(id,"[DocClose("+Caract(34)+PDF+Caract(34)+")]")
//---On quitte acrobat reader
DDEExécute(id,"[AppExit()]")



Avantages :
- Gratuit (utilisation de Acrobat Reader)
- Impression très propre
- recadrage automatique des PDF

Inconvéniant :
- Lance la fenêtre de Acrobat Reader (donc pas totalement transparent) mais il doit y avoir un moyen via les API windows de "cacher" acrobat reader (Il y a une commande DDE pour masquer acrobat mais à l'ouverture d'un document, celui-ci réapparait). SI quelqu'un a une idée, je suis preneur.

Voilà, c'est peu de chose mais je me suis prit tellement la tête dessus que je poste ici si quelqu'un en a besoin un jour ;)

Note pour les admins : Ne sachant pas où aller pour proposer un article, je le postes ici. Si vous souhaitez le mettre en tant qu'article sur le site, j'ai le fichier PDF avec toutes les références des objet COM et commandes DDE disponibles, vous n'avez qu'à me contacter en privé.

Voilà, j'ai terminé mon roman, merci à tous :)
Connexion
Menu
Chercher WDForge
Chercher Web
Partenaires
Visualiser tous les Partenaires...
WinDev, WebDev, WinDev Mobile et HyperFile sont des marques déposées par PCSoft. |  Voter |  Legal |  Contact |   XOOPS 2.0.13.2