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) :
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)
- 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/