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

www.vbfrance.com/code.aspx?ID=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

Installation. 1

Documentation. 2

Convertir plusieurs documents en même temps. 2

Pdf2Doc : est-il possible de convertir du Pdf vers Word ?. 2

Installation automatique de l'imprimante PostScript 3

Faire un Pdf cliquable. 3

GhostView.. 3

Gestion des macros sous Word 2007. 3

Imprimer en recto verso. 3

Arrêter une impression en cours. 4

Historique des versions. 4

Version 2.01 du 14/08/2009 en DotNet 4

Version 1.03 du 14/08/2009. 4

Version 1.02 du 25/03/2006. 4

Version 1.01 du 27/02/2005. 4

Version 1.00 du 20/02/2005 : Première version. 5

Liens. 5

CutePdf like. 5

Pdf2Doc. 5

Pdf en DotNet 5

Base de registre. 6

Imprimante. 6

Automation, DDE, ... 6

 

 

Installation

 

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

 

 

Documentation

 

- 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 ;

 

Convertir plusieurs documents en même temps

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) ;

 

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/KB/string/pdf2text.aspx

 

Note : l'impression sur l'imprimante générique texte ne donne rien

Voir aussi les liens : Pdf2Doc

 

Installation automatique de l'imprimante PostScript

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"

 

Faire un Pdf cliquable

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

 

GhostView

- 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

 

Gestion des macros sous Word 2007

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).

 

Imprimer en recto verso

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).

 

Arrêter une impression en cours

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

 

 

Historique des versions

 

Version 2.01 du 14/08/2009 en DotNet

- 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 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 1.03 du 14/08/2009

- 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.

 

Version 1.02 du 25/03/2006

- 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.

 

Version 1.01 du 27/02/2005

- 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.

 

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

 

 

Liens

 

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

 

CutePdf like

www.pdf995.com (VBA possible, mais il y a de la publicité)

www.win2pdf.com

 

Pdf2Doc

- 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 en DotNet

- 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

 

Base de registre

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

 

Imprimante

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

 

Automation, DDE, ...

- 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