Snap2Pdf : Imprimer un état Access en Pdf via un instantanée Snp et PostScript

Par Patrice Dargenton : patrice.dargenton@free.fr

http://patrice.dargenton.free.fr/index.html

http://patrice.dargenton.free.fr/CodesSources/index.html

http://patrice.dargenton.free.fr/CodesSources/Snap2Pdf.html

http://patrice.dargenton.free.fr/CodesSources/Snap2Pdf.vbp.html

https://codes-sources.commentcamarche.net/source/29813

Version 1.02 du 26/03/2006

Mise à jour de la doc. : 18/10/2008

L'interpréteur PostScript AFPL GhostScript (logiciel libre) permet de convertir en Pdf un fichier PostScript .ps résultant d'une impression sur un pilote d'imprimante PostScript quelconque. Un pilote tel que CutePdf utilise cet interpréteur PostScript en interne, mais on doit saisir un nom de fichier Pdf (et on ne peut pas le piloter en VBA, l'interpréteur PostScript n'est pas appelé dans ce cas, et le fichier reste en PostScript). Snap2Pdf automatise l'impression par le code d'un état Access en Pdf en évitant la boîte de dialogue pour saisir le chemin du fichier .ps. Comme je n'ai pas réussi à remplir automatiquement cette boîte de dialogue depuis Access, la solution est d'exporter un instantanée Access (une vue ou réplique à l'identique de l'état) sous forme de fichier .snp, qui peut ensuite être lu par la visionneuse autonome d'instantanée Access, le SnapShot Viewer. Le SnapShot Viewer comprend un exécutable pour visualiser et imprimer l'instantané, mais aussi et surtout un contrôle Active pilotable par le code : du coup, on peut complètement automatiser la conversion en Pdf depuis Access, en couleurs et avec les images, contrairement à tous les autres modes d'export d'état Access, qui sont tous plus ou moins limités (pour ne pas dire bogués même). Par exemple, l'export d'un état Access au format RTF n'exporte pas les images, et les champs peuvent être tronqués si on ne respecte pas une liste considérable de "Tips" ou précautions à prendre pour ne pas avoir de défauts !

 

Voici la procédure d'installation à respecter :

 

1°) Installer le pilote "Apple Color LaserWriter 12/600" (menu "Ajouter une imprimante")

      Choisir "Imprimante locale", ne pas cocher "Détection et installation automatique de l'imprimante Plug-and-Play".

2°) Configurer le pilote pour imprimer dans un fichier

      Utiliser le port suivant : "FILE: (Impression dans un fichier)".

3°) Optimiser son PostScript pour la portabilité

      Onglet Général : bouton "Options d'impression..." : Onglet Papier/qualité : bouton "Avancé..." : Options PostScript : Option de sortie PostScript : Optimiser la portabilité (et non la vitesse) ;

      Désactiver la gestion ICM des couleurs dans ce même onglet : Graphique : Gestion des couleurs de l'image : Méthode de CCI : ICM désactivé (au lieu de "ICM géré par le système hôte").

4°) Installer GhostScript (gs814w32.exe) dans \Program File\GhostScriptPdf

      www.cs.wisc.edu/~ghost/doc/AFPL/get814.htm

      ftp://mirror.cs.wisc.edu/pub/mirrors/ghost/AFPL/gs814/gs814w32.exe

5°) Installer le contrôle ActiveX "Snapshot Viewer"(snapview.ocx) pour Access 97/2000/2002 (1.7 Mo)

      Il est inclut dans le package de Snapshot Viewer :

      Snapshot Viewer vous permet d'afficher un instantané d'état sans avoir les versions standard ou d'exécution de Microsoft Access 97, Access 2000 ou Access 2002 (et 2003 aussi sans doute) :

      www.microsoft.com/downloads/details.aspx?displaylang=fr&FamilyID=b73df33f-6d74-423d-8274-8b7e6313edfb

      Vous pouvez aussi tenter d'enregistrer directement l'ocx que j'ai mis dans le zip (si vous pensez que le package précédent n'installera rien de plus que ce que vous avez déjà sur votre machine, hormis l'ocx à la bonne version et en français). Astuce : placer un raccourci vers Regsvr32.exe dans le menu SendTo pour enregistrer facilement un ocx ou une dll, via le menu contextuel "Envoyer vers".

6°) Lancer la démo sous Access : Snap2PdfDemo.mdb

 

 

Notes :

- Bien sûr, il n'est pas nécessaire d'avoir physiquement l'imprimante PostScript ("Acrobat Reader" n'a pas besoin non plus d'être installé) ;

- Le Copier/Coller à partir des fichiers Pdf générés ainsi via le PostScript ne fonctionne qu'avec des polices telles que "Courrier New" ; la résolution des fichiers sont en 300 dpi par défaut ;

- Pour imprimer dans un fichier Pdf depuis une application quelconque, utiliser le logiciel gratuit "Cute PDF Printer" (CuteWriter.exe) :

      www.01net.com/telecharger/windows/Bureautique/editeur_de_texte/fiches/27030.html

- Pour contrôler manuellement la conversion Pdf d'un fichier PostScript via une interface, utiliser GhostView (GSView) :

      www.cs.wisc.edu/~ghost/gsview/get46.htm

      ftp://mirror.cs.wisc.edu/pub/mirrors/ghost/ghostgum/gsv46w32.exe

- Sous Windows Vista, le pilote "Apple Color LaserWriter 12/600" est absent, on peut installer à la place le pilote "HP Color LaserJet 2800 Series PS" (vous pouvez renommez l'imprimante installée si vous ne voulez pas recompiler Snap2Pdf) : En VBA la ligne suivante est inutile (elle n'est utilisée qu'en VB6 dans Snap2Pdf.exe) : Public Const sPiloteImprimantePostScript$ = "Apple Color LaserWriter 12/600" ;

- Si vous obtenez l'erreur n°7 : "Mémoire insuffisante" au lancement de Snap2Pdf.exe, il y a deux solutions possibles : la première consiste à intégrer le code source VB6 de Snap2Pdf dans un formulaire VBA Access (pas de difficulté particulière). La seconde consiste à recompiler l'exécutable sur le poste sur lequel le bug se produit (il faut donc installer VB6 sur ce poste, cela ne marche pas si on recompile depuis un autre poste. Le fait d'installer VB6 ne corrige pas le problème pour l'exécutable d'origine, il faut le recompiler). Je n'ai pas trouvé la cause du problème, en tout cas cela remet sérieusement en cause la pérennité des applications VB6 : ou bien revenir à VBA ou bien passer à DotNet !

- Il y a parfois des difficultés à enregistrer le contrôle snapview.ocx en version française : dans un Windows XP tout neuf et patché, le package snpvw.exe s'emmêle parfois les pinceaux : c'est la version anglaise qui est alors installée ("snpvw.Snapshot Viewer Control.1" au lieu de "snpvw.Contrôle Snapshot Viewer.1", il faut dire aussi que c'était bête d'avoir traduit le ProgId en français avec un ô circonflexe en plus !). A la suite de plusieurs manipulations, on parvient à rétablir la version française requise, mais le problème c'est que je ne suis pas parvenu à savoir à quel moment cela a fonctionné à nouveau : réinstaller plusieurs fois le package ? ré-enregistrer plusieurs fois le contrôle ocx via RegSvr32.exe dans "\Program Files\Fichiers communs\Microsoft Shared\Snapshot Viewer\SNAPVIEW.OCX" ?

 

Version 1.02 du 26/03/2006

- Correction de la fermeture de handle mal placée : cela pouvait conduire à des fuites de mémoire ;

- Snap2PdfDemo.mdb : ShellWait avec une application associée à une extension de fichier : on peut maintenant attendre la fin par exemple de la consultation du document Pdf généré.

 

Version 1.01 du 05/03/2005 :

Bug corrigé : L'objet Printer n'existe pas sous Access 2000 : en fait, il n'est pas nécessaire de changer l'imprimante par défaut pour produire un instantanée .snp, on peut donc conserver l'imprimante par défaut. Le code correspondant a été retiré ;

- Fichier Pdf renommé à la fin ;

bIDE pour ne pas quitter l'IDE de VB6 lors de l'indication du code de retour (ExitCode) ;

- Dans le fichier Snap2Pdf.vbp, les références ne doivent pas indiquer de chemin absolu ou relatif par rapport à l'emplacement du projet, sinon on ne peut pas ouvrir le projet sur un autre poste sans provoquer une erreur (je ne comprend pas pourquoi VB6 resauve à chaque fois un chemin relatif, bug VB6 ???) ;

- Installation\TestDesinstSnapViewOCX.bat : pour tester la vérification de l'enregistrement de l'ocx.

 

Version 1.00 du 27/02/2005 : Première version

 

 

Voir aussi :

- Doc2Pdf : Convertir un document Word en Pdf via un pilote d'imprimante PostScript

      www.vbfrance.com/code.aspx?ID=29662

 

Snapshot Viewer for Access 2003, 2002, 2000, and 97 (attention, car la classe de l'ocx n'est pas la même que dans la version française, qui est celle utilisée par Snap2Pdf)

      www.microsoft.com/downloads/details.aspx?displaylang=en&FamilyID=b73df33f-6d74-423d-8274-8b7e6313edfb

 

PDFCreator est une alternative également en Visual Basic avec les sources, pour la génération de Pdf depuis un logiciel quelconque (pas seulement depuis Word) ; c'est un logiciel multilingue, qui installe apparemment tout ce qu'il faut, donc peut être plus simple du point de vue de l'installation, mais beaucoup plus complexe au niveau du code source (je n'ai même pas réussi à compiler, car il faut installer des trucs). Voir notamment l'instruction ExecuteAndWait qui permet de faire un Shell /print générique en ligne de commande :

      http://sourceforge.net/projects/pdfcreator

 

- Installation automatique de l'imprimante PostScript :

      rundll32 printui.dll,PrintUIEntry /if /b "Apple Color LaserWriter 12/600" /f %windir%\inf\ntprint.inf /r "FILE:" /m "Apple Color LaserWriter 12/600"

      Mais je n'ai toujours pas réussi à trouver comment faire pour configurer automatiquement l'option PostScript requise pour imprimer en couleur (Désactivation de la gestion ICM des couleurs), donc il n'y a toujours pas d'installation automatique pour Snap2Pdf (voir PDFCreator pour cela).

 

Documentation :

- Using Microsoft Access 97, Access 2000, or Access 2002 Report Snapshots and the Snapshot Viewer

      www.microsoft.com/AccessDev/Articles/snapshot.htm

 

SnapshotViewerControl reference for C# and VB.NET

      www.webtropy.com/articles/art14-2.asp?Interop=SnapshotViewerControl

 

- ACC: Tips to Design Reports for Output to RTF File

      http://support.microsoft.com/kb/130857/en-us

 

- ACC2000: Text in Saved Report File Is Wrapped Differently

      http://support.microsoft.com/kb/208875/en-us

 

- ACC97: Memo Field Exported to RTF Format May Be Truncated

      http://support.microsoft.com/kb/288877/en-us

 

- Pdf2Doc : Est-il possible de convertir du Pdf vers Word ?

      Avec un logiciel gratuit, ce n'est pas possible à ma connaissance, et pour ce qui concerne les logiciels payants, c'est possible, mais la mise en page est forcée selon celle d'origine, en utilisant des zones de texte dans Word. Impossible donc de changer la mise en page dans Word sans faire de nombreux copier/coller, impossible par exemple de visualiser correctement un eBook Pdf converti, pour le lire sur un PDA avec Pocket Word. L'autre solution étant de scanner son fichier Pdf avec un logiciel d'OCR, conçu pour reconnaître les caractères imprimés. Mais voir quand même l'article suivant :

      Converting PDF to Text in C# :

      www.codeproject.com/useritems/pdf2text.asp

 

- Détails de la conversion via le PostScript : http://sebsauvage.net/pdf/