Doc2Pdf : Convertir un document Word en Pdf via un pilote d'imprimante 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/Doc2Pdf.html
http://patrice.dargenton.free.fr/CodesSources/Doc2Pdf.vbproj.html Doc2Pdf.vbp.html
https://codes-sources.commentcamarche.net/source/29662
Version 2.01 du 14/08/2009
L'interpréteur PostScript AFPL GhostScript (logiciel libre) permet de convertir en Pdf un fichier PostScript (fichier .ps)
résultant d'une impression sur un pilote d'imprimante PostScript quelconque.
Par exemple CutePdf
est un de ces pilotes d'imprimante qui utilise cet interpréteur PostScript en
interne. Mais CutePdf a un défaut : on doit confirmer
le nom de fichier Pdf et on ne peut pas le piloter en
VBA pour éviter cette étape (sinon l'interpréteur PostScript n'est pas appelé
dans ce cas, et le fichier reste en PostScript). Doc2Pdf simplifie au maximum
la conversion d'un document Word en ajoutant un menu contextuel "Convertir
en Pdf" sur le bouton droit de la souris dans
l'explorateur de fichier : une fois que tout est configuré, on peut convertir
tout document Word en Pdf en deux clics de souris !
Table des matières
Convertir
plusieurs documents en même temps
Pdf2Doc
: est-il possible de convertir du Pdf vers Word ?
Installation
automatique de l'imprimante PostScript
Gestion
des macros sous Word 2007
Arrêter
une impression en cours
Version
2.01 du 14/08/2009 en DotNet
Version
1.00 du 20/02/2005 : Première version
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".
(Sous Windows Vista, ce pilote est absent,
on peut installer à la place le pilote "HP Color
LaserJet 2800 Series PS", mais il faut
recompiler Doc2Pdf pour changer le nom de l'imprimante : Public Const sPiloteImprimantePostScript$
= "Apple Color LaserWriter
12/600", ou sinon renommer l'imprimante installée, pour faire vite fait /
mal fait)
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 (gs870w32.exe) dans \Program File\GhostScriptPdf
(noter bien ce nom de dossier)
http://sourceforge.net/projects/ghostscript/
5°) Fusionner le fichier Doc2PdfWord.reg
Par défaut, le chemin indiqué pour Doc2Pdf
est "C:\Program Files\Doc2Pdf\Doc2Pdf.exe" (changer dans le fichier
.reg selon votre configuration).
Dans la version DotNet
(en VB 2008), il n'est plus besoin de fusionner un fichier .reg car il y a un
bouton pour ajouter le menu contextuel : il suffit de lancer Doc2Pdf (et
d'annuler le choix du fichier) puis de cliquer sur le bouton activé pour
installer ou désinstaller le(s) menu(s) contextuel(s).
6°) Dans l'explorateur de fichier, utiliser le menu
contextuel "Convertir en Pdf" pour les
documents Word
- 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 est en 300 dpi
(points par pouce) par défaut ;
- On
peut aussi activer le menu contextuel pour les fichiers .htm et .html : il
suffit de décommenter les lignes correspondantes dans
le fichier .reg (ou bien de cocher la case dans la version DotNet) ;
- Pour
retirer le menu contextuel lors d'une désinstallation de Doc2Pdf, fusionner le
fichier Doc2PdfWordDesinst.reg (ou bien cliquer sur le bouton dans la version DotNet) ;
- Si
le nom du fichier contient une virgule, le convertisseur ne fonctionne
pas ;
- 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
- On
doit pouvoir faire la même chose que Doc2Pdf pour Excel, via la commande oXL.ActiveWorkbook.PrintOut ;
- Doc2Pdf
a été testé avec succès pour Word 2000, XP, 2003 et 2007 sous Windows 2000, XP
et Vista ;
- Doc2Pdf
(version VB6) requiert le Runtime VB6 (Msvbvm60.dll),
qui est livré en standard avec Windows XP ;
On
peut convertir plusieurs fichiers Word à la fois, mais pas via le menu
contextuel "Convertir en Pdf" (car
plusieurs instances de Doc2Pdf seraient lancées simultanément et on pourrait
perdre alors les options d'impressions par défaut). Je ne sais pas s'il est
possible de récupérer la liste des fichiers dans une seule instance de Doc2Pdf
via le menu contextuel (apparemment
oui), mais il y a une autre méthode qui
fonctionne bien avec une sélection de fichiers : le menu contextuel
"Envoyer vers", il suffit pour cela de placer un raccourci vers
Doc2Pdf.exe dans le menu SendTo ("Documents and Settings\All Users\SendTo", et pour
Windows Vista : "Documents and Settings\All Users\Application
Data\Microsoft\Windows\SendTo" : on pourrait
créer automatiquement ce raccourci). Ce fonctionnement est assez surprenant
dans la mesure où au départ on a plusieurs instances de Doc2Pdf qui sont
lancées (il suffit de l'empêcher pour le vérifier), et lorsque l'on interroge
ensuite la ligne de commande, on a bien l'ensemble des fichiers qui sont
regroupés, dans une instance unique donc (il n'est pas sûr que ce système soit
fiable, par exemple avec un grand nombre de fichiers doc ou bien avec une
machine encombrée).
Note : dans la version VB6 on utilise la fonction GetPreviousWindow pour regrouper plusieurs instances en une
seule, mais cette fonction utilise des API qui recherche une fenêtre de type
VB6 seulement (ThunderRT6Main) : c'est sans doute un peu plus fiable en VB6
donc.
Sinon
on pourrait utiliser aussi la fonctionnalité multi-fichiers
de la boîte de dialogue de Doc2Pdf, mais il faudrait alors traiter la liste des
fichiers, qui apparaît différemment de celle de la ligne de commande (ce n'est
pas difficile à faire) ;
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/KB/string/pdf2text.aspx
Note : l'impression sur l'imprimante générique texte ne donne rien
Voir aussi les liens : Pdf2Doc
Projet : on pourrait automatiser l'installation, voici
quelques idées :
La
ligne de commande suivante installe automatiquement l'imprimante (merci Wildagger) :
rundll32 printui.dll,PrintUIEntry /if /b "Apple Color
LaserWriter 12/600" /f %windir%\inf\ntprint.inf
/r "FILE:" /m "Apple Color LaserWriter
12/600"
Il reste à 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 Doc2Pdf (voir PDFCreator pour cela).
Nouveau : grâce à l'utilitaire SpyReg, j'ai pu trouver
que la clé est ici :
[HKEY_CURRENT_USER\Printers\DevModePerUser]
"Apple
Color LaserWriter
12/600"=hex:...
Mais elle est codée en binaire hexadécimal
: il faut donc charger la structure DevMode correcte
pour pouvoir faire la modification automatiquement, c'est faisable (attention
car WinDiff
ne trouve pas la différence dans la série hexa, c'est un bug de WinDiff).
Voir peut être ici :
Printers and SafeHandles : Using SafeHandles to access PrinterInfo and DriverInfo structures
www.codeproject.com/csharp/qPrintComponent.asp
- Pour
information, chemins par défaut de Word (pas besoin ici à priori) :
2003 : "C:\Program
Files\Microsoft Office\OFFICE11\WINWORD.EXE"
2002/XP : "C:\Program Files\Microsoft
Office\Office10\WINWORD.EXE"
2000 : "C:\Program Files\Microsoft Office
2000\Office\WINWORD.EXE"
Pour
faire un Pdf cliquable, utilisez la version payante
d'Adobe-Acrobat pour cela (mais elle est moins fiable
pour la conservation de la mise en page, et plus lente ; sinon voir les autres liens ?).
Détail
de la conversion via le PostScript : http://sebsauvage.net/pdf
- 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
Pour
modifier les options de sécurité, le menu est dans "Centre de gestion de
la confidentialité" dans les "Options Word" : Paramètres du
centre... (le mieux est d'ajouter le répertoire d'installation de Doc2PdfVBA
comme source fiable de macro).
Pour
info., pour imprimer avec MS-Word
en recto verso sur une veille imprimante Canon Bubble-Jet
BJC-240, il faut simplement imprimer les pages impaires puis paires dans
l'ordre !
S'il
n'y a pas de risque de bourrage, on peut simplement retourner la pile à
imprimer, puis agrafer à la fin.
Cela
à l'air tout bête comme ça, mais en pratique, pour économiser pas mal de papier
avant de refaire des tests idiots, voici la configuration finale qui va bien :
- Boite
de dialogue "Imprimer" : ne pas cocher "Recto verso
manuel" ;
- Boite
de dialogue "Imprimer" : "Copies Assemblées" : pas de
rapport avec le recto verso ;
- Boite
de dialogue "Imprimer" : "Options..." : ne pas cocher
"Ordre inverse", ni les cases "Recto" et "Verso"
de la zone "Options d'impression recto verso" ;
- Boite
de dialogue "Imprimer" : Imprimante : Nom "Canon Bubble-Jet BJC-240" : "Propriétés..." :
"Disposition" : "Ordre des pages" : laisser "Dernière
à la première" (mais cela ne sera pas appliqué, et si on coche
"Première à la dernière" alors cela ré-active
les "Fonctionnalités d'impression avancées" ;
- Bouton
"Avancé..." de ce dernier panneau : "Options du document" :
"Fonctionnalités d'impression avancées" (notamment ordre des pages) :
Désactivées.
Moins
simple qu'il n'y parait donc... (en somme pour faire du recto verso il faut
décocher toutes les options de recto verso, il fallait y penser !)
Attention
car votre configuration peut revenir à la configuration par défaut de Windows à
chaque fois que votre Windows XP démarre mal (message système comme quoi une
ancienne configuration a due être rétablie).
Parfois
il faut se battre un peu pour arriver à stopper une impression en cours (pour
économiser du papier). Dans une "Invite de commandes" (accessoires de
Windows), tapez :
net
stop spooler
net start spooler
- Boutons
pour ajouter ou enlever les menus contextuels, avec ou sans les documents
Html ;
- Prise
en compte de Word 2007 : suite (sous XP notamment) : si l'option PrintBackground est activée et ne peut pas être désactivée,
alors choisir une solution alternative : attendre la fin de l'impression en
testant l'accessibilité du fichier .ps (pendant 2 mn max.) ; autre amélioration : vérification si
l'imprimante active peut être modifiée ;
- Passage
en VB 2008.
- Version
en VBA pour le débogage (éviter d'avoir à installer Visual
Basic sur un poste qui pose problème avec Doc2Pdf : Word 2007, Vista,
...) ;
- Prise
en compte de Word 2007 et Windows Vista : ouvrir le document Word en mode
lecture seule, vérifier les options Word qu'on peut lire ou écrire.
- Correction
de la fermeture de handle mal placée : cela pouvait
conduire à des fuites
de mémoire ;
- Correction
de l'analyseur d'argument en ligne de commande.
- Bug corrigé : Fichier Pdf vide sur certain poste (par exemple un nouveau profil sur le même poste) : la désactivation de l'option PrintBackground doit se faire impérativement avant d'imprimer (instruction PrintOut) ;
- Bug corrigé : Impression en noir & blanc au lieu
d'en couleurs : en utilisant le pilote "Apple Color
LaserWriter 12/600" on obtient des couleurs
parfaites (en désactivant la gestion ICM des couleurs, sinon les couleurs sont
fades), alors qu'en utilisant le pilote "Apple LaserWriter
12/640 PS", qui n'est finalement pas une imprimante couleur, l'impression
redevient définitivement en N&B au bout d'un moment ! (même en bidouillant
dans la base de registre) ;
- Le
format de fichier .reg de Windows 2000 fonctionne aussi pour XP, un seul
fichier .reg suffit. Par ailleurs, il suffit de mettre - devant HKEY_x pour enlever une clé de la base de registre, il y a
donc maintenant un fichier de désinstallation : Doc2PdfWordDesinst.reg ;
- Simplification
du code d'attente : utilisation d'une fonction Shell avec attente de fin de
processus ;
- Taille
plus grande de l'interface pour afficher des chemins en entier.
Voir
aussi :
- Snap2Pdf
: Imprimer un état Access en Pdf via un instantanée Snp et PostScript
www.vbfrance.com/code.aspx?ID=29813
- Doc2Pdf pour les pièces jointes de courriel,
avec le code source en C
http://doc2pdf.sourceforge.net
- Ancienne
version 8.14 de GhostScript (gs814w32.exe) :
www.cs.wisc.edu/~ghost/doc/AFPL/get814.htm
ftp://mirror.cs.wisc.edu/pub/mirrors/ghost/AFPL/gs814/gs814w32.exe
- PDFCreator est une alternative également en Visual Basic 6 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
- www.pdf995.com (VBA possible, mais il y a de
la publicité)
- Indexation des documents pdf (code source en C++ MFC)
Code to extract plain text from a PDF file
Source code that shows how to decompress and extract text from PDF documents
www.codeproject.com/KB/cpp/ExtractPDFText.aspx
Et en DotNet : Using the IFilter interface to extract text from various document types
www.codeproject.com/KB/cs/IFilter.aspx
- PDF Viewer Control Without Acrobat Reader Installed (supporte aussi les derniers pdf incompatibles avec Acrobat Reader 5)
www.codeproject.com/KB/applications/PDFViewerControl.aspx
- OpenPdf.Net : www.vbfrance.com/codes/OPENPDF-NET_46727.aspx
- Creating PDF with nFOP
www.codeproject.com/KB/dotnet/nfop.aspx
- Creating PDF Tables using C# (.NET 2.0) and iTextSharp
www.codeproject.com/KB/cs/iTextSharpPdfTables.aspx
http://downloads.sourceforge.net/itextsharp/itextsharp-4.0.2-dll.zip
- Tutorials on creating PDF files using C# (.NET 2.0)
www.codeproject.com/cs/library/iTextSharpTutorial.asp
- Convertisseur Pdf (images sur disque en Pdf)
www.csharpfr.com/codes/CONVERTISSEUR-PDF_37711.aspx
Et
en VB6 : Classe pdf pour images
www.vbfrance.com/code.aspx?ID=37946
- Digital Signatures and PDF Documents
www.codeproject.com/showcase/digitalsignatures.asp
- GIOS PDF Splitter and Merger
The first open source PDF splitter and merger tool written in C#
www.codeproject.com/KB/cs/giospdfsplittermerger.aspx
- Converting PDF to Text in C#
www.codeproject.com/KB/string/pdf2text.aspx
- Monitorer la BR (alternative à SpyReg ?)
www.cppfrance.com/codes/REGISTRY-GUARD-BETA_38646.aspx
- RegistryMonitor - a .NET wrapper class for RegNotifyChangeKeyValue
www.codeproject.com/KB/system/registrymonitor.aspx
- Print Using the Windows Fax and Picture Preview
Calling the Windows Print and Fax viewer from a shell command is an elegant way to solve most of your .NET image print issues
www.codeproject.com/KB/vb/Instant_bitmap_printing.aspx
- Extending C# PrintDialog Part II
www.codeproject.com/KB/printing/PrintOddEven.aspx
- www.codeproject.com/KB/cs/EscapePrintController.aspx
- www.codeproject.com/csharp/FormPrintPackage.asp
- Piloter Word en liaison dynamique en DotNet
www.codeproject.com/KB/cs/LateBindingHelper.aspx
- Ouvrir, imprimer... un ou plusieurs documents dans la même instance d'une application ouverte (ou fermée)
www.vbfrance.com/code.aspx?ID=41008