Générer un document pdf à partir d'un document doc

Soyez le premier à donner votre avis sur cette source.

Snippet vu 23 292 fois - Téléchargée 30 fois

Contenu du snippet

Attention, cette source necessite l'installation préalable d'Acrobat Writer !
Elle est adapté ici à Word, mais éventuellement toute application capable d'imprimer est susceptible d'être pilotée ainsi.
Bien sûr, vos propres applis vb peuvent imprimer en PDF de la même manière.
Pour que le code fonctionne correctement tel quel, il faut rajouter les référence à l'application Word dans le projet.

Source / Exemple :


Option Explicit

'Fonction qui permet de spécifier le fichier de sortie PDF
Private Declare Function PDFMonSetOutputFilename Lib "C:\Program Files\Adobe\Acrobat 4.0\Macros\Office95\PDFMon.dll" (ByVal FileName As String) As Long
'Fonction qui détecte la présence d'un PDF Writer
Private Declare Function IsPDFWriterInstalled Lib "C:\Program Files\Adobe\Acrobat 4.0\Macros\Office95\PDFMon.dll" (ByVal PDFWriterName As String, ByVal Port As String) As Long
'nettoyage de la mémoire après l'utilisation des librairies PDF
Private Declare Sub PDFMonCleanup Lib "C:\Program Files\Adobe\Acrobat 4.0\Macros\Office95\PDFMon.dll" ()

Private WordApp As Word.Application
Private Document As Word.Document

Sub CloseWord()
    Dim Doc As Word.Document
    'on ferme tous les documents ouverts
    For Each Doc In WordApp.Documents
        Doc.Close False
    Next
    Set Document = Nothing
    'on quitte word
    WordApp.Quit
End Sub

'Cas où on créé un fichier de toutes pièces
' ce cas sera utilisé si un utilisateur selectionne plusieurs informations en même temps
Sub CreateFile()
    Set WordApp = CreateObject("Word.application")
    Set Document = WordApp.Documents.Add
    
End Sub

'Ajoute un fichier à la fin du fichier courant
Sub AppendFile(FileName As String)
    Dim FileRange As Word.Range
    Set FileRange = Document.Range
    FileRange.Collapse wdCollapseEnd
    FileRange.InsertFile FileName, , False
End Sub

'cas où on trsforme un fichier complet, comme un document de synthèse
Sub OpenFile(FileName As String)
    Set WordApp = CreateObject("Word.application")
    Set Document = WordApp.Documents.Open(FileName, False, , False)
End Sub

'Génère le document PDF
' OutputFileName est le nom du fichier généré
Sub Doc2Pdf(OutputFileName As String)
    'on met à jour les champs du document
    'dans le corps
    Document.Fields.Update
    Dim Section As Word.Section, HeaderFooter As Word.HeaderFooter
    
    'dans les pieds de pages et les en-têtes
    For Each Section In Document.Sections
        On Error Resume Next
        For Each HeaderFooter In Section.Headers
            HeaderFooter.Range.Fields.Update
        Next
        For Each HeaderFooter In Section.Footers
            HeaderFooter.Range.Fields.Update
        Next
    Next
    'Dans les zones de texte flottantes
    Dim Shape As Word.Shape
    For Each Shape In Document.Shapes
        Shape.Select
        WordApp.Selection.Range.Fields.Update
    Next
    Err.Clear

    'Ces deux lignes sont nécessaires car sinon
    'il y a des pblms aléatoires dû au rafraichissement d'écran
    WordApp.Visible = False
    WordApp.ScreenUpdating = False
    'Définition de l'imprimante par défaut
    On Error GoTo 0
    Dim PDFWriterName As String, Port As String
    If EnsurePDFWriterIsInstalled(PDFWriterName, Port) Then
        Document.Activate
        'On indique à word d'utiliser l'imprimante Abcrobat distiller
        WordApp.ActivePrinter = PDFWriterName
        'on lui impose ensuite le nom de fichier
        PDFMonSetOutputFilename OutputFileName
        'Impression vers l'imprimante distiller
        WordApp.PrintOut
        'on nettoye le mémoire derrière nous
        'PDFMonCleanup
    End If
End Sub

'vérification de la présence d'acrobat sur la machine
'fonctions fournies par adobe
'modifiée par Olivier marty
Private Function EnsurePDFWriterIsInstalled(PDFWriterName As String, Port As String) As Boolean
    Dim found, starPos

    On Error GoTo -1: On Error GoTo EnsurePDFWriterIsInstalledError
    EnsurePDFWriterIsInstalled = False

    PDFWriterName = String(100, "*")
    Port = String(100, "*")

    found = IsPDFWriterInstalled(PDFWriterName, Port)
    If (found = 1) Then
        EnsurePDFWriterIsInstalled = True
        starPos = InStr(PDFWriterName, "*")
        PDFWriterName = Left$(PDFWriterName, starPos - 2)
        starPos = InStr(Port$, "*")
        Port = Left$(Port, starPos - 2)
    End If

EnsurePDFWriterIsInstalledError:

End Function

Conclusion :


Les fonctions PDF sont importantes si vous souhaiter ne plus afficher les boite de dialogue qui demande le nom des fichiers à ecrire.

A voir également

Ajouter un commentaire

Commentaires

hoeppe
Messages postés
56
Date d'inscription
mardi 20 mai 2003
Statut
Membre
Dernière intervention
10 juin 2005
-
ca me rapelle fortement mon premier transformateur doctoxml.

as tu rencontré des ennuis avec les bmp, jpg et autres graphiques (la taille du fichier xml généré etait accrue par les graphiques)?

Sinon, c'est vrai que les pilotages d'applications comme celui-ci peuvent etre utile.

merci.
cs_Warny
Messages postés
478
Date d'inscription
mercredi 7 août 2002
Statut
Membre
Dernière intervention
10 juin 2015
-
Hoeppe -> Pour les images, je n'ai pas d'ennuis, c'est le processeur PDF qui les gère. Il les transforme toutes en jpeg 75%.
J'avais fait aussi un transformateur doc2html (résultat visible sur www.uncdg.com), mais je ne gérais pas du tout les images.
cs_Mercury
Messages postés
329
Date d'inscription
jeudi 3 janvier 2002
Statut
Membre
Dernière intervention
7 octobre 2005
-
Dommage qu'il faille Acrobat Writer pour utiliser ton prog. D'ailleurs, si Acrobat Writer est installé, pourquoi utiliser autre chose ... Dommage :(
cs_Warny
Messages postés
478
Date d'inscription
mercredi 7 août 2002
Statut
Membre
Dernière intervention
10 juin 2015
-
Mercury -> il s'agit d'automatiser la production de documents PDF. J'utilise ce module dans un site web. Je trouve assez problématique qu'un utilisateur doive rester devant le serveur pour valider les boites de dialogue.
J'avais pensé, un temps, reprogrammer mon propre writer. Mais les specs d'Acrobat représentent un sacré pavé (document public dispo sur www.adobe.com). J'ai donc du chercher une solution viable pour produire des pdf en outrepassant la contrainte exposée précédement.
L'une des utilisations de la classe que j'expose peut-être de convertir TOUS les fichiers word d'un répertoire. Personnelement, je me vois mal les imprimer un par un ou tous les ouvrir d'un coup quand j'en ai une centaine !
premium0
Messages postés
9
Date d'inscription
jeudi 2 octobre 2003
Statut
Membre
Dernière intervention
1 juillet 2004
-
Ce source m'intéresse beaucoup. Aussi je voudrais savoir comment réaliser les mêmes actions avec la version 5 d'Acrobat Writer.
En effet, je ne trouve pas les DLL listées dans le projet.
Merci infiniment

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.