formateur informatique

Importer les données de fichiers PDF en VBA Word

Accueil  >  Bureautique  >  Word  >  Word VBA  >  Importer les données de fichiers PDF en VBA Word
Livres à télécharger


Pour partager cette vidéo sur les réseaux sociaux ou sur un site, voici son url :


Inscription Newsletter    Abonner à Youtube    Vidéos astuces Instagram
Sujets que vous pourriez aussi aimer :


Importer et convertir les PDF

Les fichiers PDF sont une vue figée d'un document ou d'une présentation. Leur vocation est d'offrir une mise en page qui reste fidèle quel que soit l'environnement. Mais sans outil dédié, il n'est pas possible d'intervenir dans la conception pour apporter des modifications ou améliorations. Pourtant, lorsque vous détenez des archives inscrites uniquement dans ce format, l'enjeu consiste tôt ou tard à pouvoir récupérer les contenus pour les faire évoluer. Cette nouvelle astuce VBA Word montre comment importer les données de fichiers PDF tout en les convertissant pour pouvoir les manipuler en conception et récupérer les attributs de mise en forme.

Le bouton de Macro
Une fois n'est pas coutume, nous proposons de commencer par configurer l'environnement de travail. Cette nouvelle fonctionnalité d'importation est intéressante. Nous suggérons donc d'enregistrer le code VBA Word dans le modèle (Normal.dotm) et de l'associer à un bouton permanent à greffer dans une section d'un ruban personnalisé.
  • Démarrer Word et créer un nouveau document vierge,
  • Réaliser le raccourci clavier ALT + F11 pour basculer dans l'éditeur VBA Word,
  • Dans l'explorateur de projet sur la gauche, sélectionner l'élément Normal,
  • En haut de l'éditeur, cliquer sur le menu Insertion,
  • Dans les propositions, choisir la commande Module,
Un nouveau Module apparaît dans l'arborescence du dossier Modules pour le projet associé au modèle Word (Normal). Sa feuille de code se rend disponible au centre de l'écran. Elle est vierge pour l'instant.
  • Avec la fenêtre Propriétés, renommer ce module sous l'intitulé Importation,
Nouveau module VBA pour importer des données PDF dans Word

La fenêtre propriétés est accessible par le biais du menu Affichage en choisissant la commande Fenêtre Propriétés.
  • Dans la feuille de code, créer la procédure importPDF,
Bien que vide, la procédure de code VBA existe désormais. Nous proposons de l'associer à un bouton de macro. Dès lors, nous pourrons nous concentrer sur le développement du code.
  • Revenir sur le document Word (ALT + Tab),
  • Cliquer droit n'importe où sur le ruban actif,
  • Dans le menu contextuel, choisir la commande Personnaliser le ruban,
  • Dans la liste de droite, cliquer sur le symbole Plus (+) du ruban Outils,
Il s'agit d'un ruban que nous avons créé à l'occasion de précédentes astuces. Si vous ne le possédez pas, vous pouvez le créer en cliquant sur le bouton Nouvel onglet en bas de la boîte de dialogue.
  • En bas de la boîte de dialogue, cliquer sur le bouton Nouveau groupe,
  • Puis, cliquer sur le bouton Renommer,
  • Dans la boîte de dialogue qui suit, taper l'intitulé : Données externes,
Créer un nouveau groupe dans un ruban personnalisé VBA Word

Nous créons ainsi une nouvelle section dans ce ruban personnalisé. Elle est destinée à accueillir toutes les fonctionnalités que nous concevrons pour manipuler les informations de fichiers externes.
  • Cliquer sur le bouton Ok pour valider ce nom,
  • Déployer alors la zone déroulante au-dessus de la liste de gauche,
  • Dans les propositions, choisir la catégorie Macros,
  • Dès lors, glisser la macro importPDF dans le nouveau groupe créé précédemment,
Placer le bouton de macro VBA Word dans le nouveau groupe du ruban personnalisé

  • Cliquer sur le bouton Renommer en bas de la boîte de dialogue,
  • Dans celle qui suit, taper l'intitulé : Import1PDF,
Le chiffre 1 permettra de différencier d'autres solutions que nous apporterons, notamment pour réaliser une conversion de masse des fichiers PDF dans un dossier.
  • Cliquer alors sur une icône représentative pour le décrire explicitement,
Choisir une icône graphique pour un bouton de macro VBA Word

  • Cliquer sur le bouton Ok pour valider ces réglages,
  • Cliquer sur le bouton Ok de la première boîte de dialogue pour revenir sur le document Word,
Désormais, si vous activez l'onglet Outils, vous avez le plaisir de constater la présence du nouveau bouton d'importation dans sa nouvelle section. Il ne nous reste plus qu'à développer son code VBA.

La déclaration des variables
Pour débuter, nous devons tout d'abord déclarer les variables nécessaires aux traitements. Une boîte de dialogue est notamment nécessaire pour pointer sur le fichier PDF à importer et convertir.
  • Revenir dans l'éditeur VBA Word (ALT + F11),
  • Entre les bornes de la procédure importPDF, ajouter les quatre déclarations suivantes :
Sub importPDF()
Dim boite As FileDialog: Dim chemin As String
Dim instanceW As Object: Dim docPDF As Object


End Sub


Nousl'avons annoncé, nous déclarons tout d'abord une variable objet nommée boite que nous typons comme un objet de type boîte de dialogue. La variable chemin, typée comme un texte (String) doit servir à mémoriser le chemin d'accès au fichier PDF désigné par l'utilisateur par le biais de la boîte de dialogue. C'est ainsi que nous pourrons accéder à son contenu par le code VBA. Ensuite, la variable instanceW, typée comme un objet au sens large, est un peu particulière. Elle doit servir à créer une nouvelle instance d'une application Word. Elle va ainsi livrer des propriétés et méthodes pour permettre à l'autre objet (docPDF) de prendre le contrôle sur le fichier PDF distant.

La boîte de dialogue des fichiers
Maintenant, nous devons créer cette boîte de dialogue d'ouverture de fichiers pour l'afficher ensuite à l'écran. C'est donc notre variable objet boite qui doit être initialisée.
  • A la suite du code de la procédure, ajouter les deux instructions VBA suivantes :
...
Set boite = Application.FileDialog(msoFileDialogFilePicker)
If boite.Show Then chemin = boite.SelectedItems(1)
...


C'est la méthode FileDialog de l'objet Application qui permet d'initialiser cette boîte de dialogue. Avec la valeur msoFileDialogFilePicker passée en paramètre et proposée par IntelliSense, nous définissons une boîte de dialogue pour ouvrir des fichiers. Dès lors, la variable boite hérite des propriétés et méthodes instanciées de cette classe. La méthode Show permet d'afficher la boîte de dialogue. La propriété SelectedItems renvoie une collection des fichiers sélectionnés par l'utilisateur. Comme nous ne l'avons pas définie pour une multi-sélection, nous savons que le fichier désigné se trouve sur la première rangée de cette collection (tableau).

Si vous exécutez le code à ce stade, la boîte de dialogue se déclenche en effet. Elle permet de pointer sur un dossier et de désigner un fichier.

Avant d'engager la suite des traitements, nous devons nous assurer que l'utilisateur a bien pointé sur un fichier et qu'il n'a pas cliqué sur le bouton Annuler. En d'autres termes, nous devons vérifier que la variable chemin n'est pas vide.
  • A la suite du code, créer l'instruction conditionnelle suivante :
...
If chemin <> "" And Right(chemin, 4) = ".pdf" Then

Else
MsgBox "traitement abandonné"
End If
...


C'est donc un double critère que nous vérifions. Le chemin ne doit pas être vide et dans le même temps, nous nous assurons que l'extension du fichier est bien celle d'un fichier pdf. Grâce à la fonction VBA Right, nous prélevons les quatre derniers caractères de la chaîne que nous comparons avec l'extension attendue. Dans le cas où cette double condition n'est pas honorée (Else), nous mettons fin au traitement puisque nous déroutons l'exécution du code dans une autre branche. Et nous en informons l'utilisateur avec une boîte de message (MsgBox).

Instance d'une application Word
Il est maintenant question de créer l'instance de l'application Word. Ses propriétés et méthodes permettront de pointer sur le fichier PDF dont le chemin d'accès est emmagasiné dans la variable chemin.
  • Dans l'instruction conditionnelle, ajouter tout d'abord les deux lignes VBA suivantes :
...
Set instanceW = CreateObject("Word.Application")
instanceW.Visible = False
...


Nous l'avons déjà exploitée à maintes reprises dans nos développements VBA, notamment avec Excel, c'est la fonction CreateObject qui permet d'instancier une classe. Avec la valeur Word.Application en paramètre, nous créons donc une nouvelle instance de Word. Dès lors, la propriété hérité Visible de l'objet instanceW ainsi affecté, permet de réaliser un traitement en tâche de fond, donc sans que la nouvelle instance de l'application n'apparaisse.

Copier le contenu du PDF distant
Cette nouvelle instance va maintenant nous permettre d'accéder au fichier PDF précédemment désigné par le biais de la boîte de dialogue. C'est bien en tâche de fond qu'elle doit sélectionner et copier en mémoire tout le contenu de ce document PDF.
  • A la suite du code, toujours dans l'instruction conditionnelle, ajouter les lignes VBA suivantes :
...
Set docPDF = instanceW.Documents.Open(chemin)
instanceW.Selection.WholeStory
instanceW.Selection.Copy
...


Sur cette nouvelle instance, c'est la méthode Open de la propriété Documents qui permet de pointer sur le fichier PDF dont l'accès est stocké dans la variable chemin. C'est une méthode qui propose de nombreux paramètres mais ils sont tous facultatifs hormis le premier pour le chemin du fichier. Ensuite la méthode WholeStory de l'objet Selection pour cette instance désigne l'intégralité du contenu du fichier PDF. Nous n'avons plus qu'à le prélever en mémoire pour ensuite pouvoir le restituer sur le nouveau document. C'est ce que nous faisons avec la méthode Copy de l'objet Selection.

Importer le PDF et sauvegarder
Il est maintenant temps de rapatrier l'intégralité du contenu mis en forme, non pas dans cette nouvelle instance mais sur le document vierge.
  • A la suite du code, ajouter les instructions VBA suivantes :
...
Selection.Paste
Selection.HomeKey wdStory
...


Cette fois donc, nous ne préfixons pas le code de l'instance pour agir. La méthode Paste de l'objet Selection permet de coller sur le document actif, le contenu stocké en mémoire. Ensuite, la méthode HomeKey avec le paramètre wdStory permet de replacer le pointeur de lecture au tout début du document.

Si vous exécutez le code VBA à ce stade, après avoir désigné un fichier PDF à importer et après avoir validé, le contenu PDF est parfaitement récupéré avec sa mise en forme. Nous recouvrons donc une version complètement modifiable à partir d'une vue originellement figée. Il est à noter que lors de la première exécution, une boîte de dialogue de confirmation se déclenche. Elle indique que Word va procéder à la conversion du fichier PDF. Il suffit de cocher la case "Ne plus afficher ce message" et de valider pour ne plus la voir apparaître à l'avenir.

Enregistrer et vider la mémoire
Pour parfaire la solution de ce volet, il convient de créer une copie sauvegardée de ce contenu PDF au format Word. Il ne faut pas oublier non plus de détruire les variables objets pour libérer la mémoire.
  • A la suite du code VBA, ajouter les dernières instructions suivantes :
...
ActiveDocument.SaveAs2 Replace(chemin, ".pdf", ""), wdFormatDocumentDefault

docPDF.Close
instanceW.Quit

Set docPDF = Nothing
Set instanceW = Nothing
...


Très simplement et nous le savons, c'est la méthode SaveAs de l'objet ActiveDocument qui permet d'engager la sauvegarde. En premier paramètre, nous désignons le chemin et le nom du fichier. Pour cela, nous utilisons la fonction Replace afin de supprimer l'extension PDF. Ensecond paramètre, c'est la valeur wdFormatDocumentDefault qui indique le format de sortie, le format Word classique. Dès lors, nous exploitons les méthodes respectives Close et Quit pour fermer les objets. Il ne nous reste plus qu'à les détruire en les réaffectant (Set) sur la valeur Nothing.

Si vous enregistrez les modifications, que vous basculez sur le document Word, que vous cliquez sur le bouton du ruban personnalisé, que vous sélectionnez un fichier PDF et que vous le validez, après un temps de traitement pour la conversion, non seulement vous constatez que le contenu PDF est récupéré mais aussi que sa version modifiable au format Word est enregistrée dans le dossier de l'application VBA Word.

Le code complet de la procédure d'importation PDF est le suivant :

Sub importPDF()
Dim boite As FileDialog: Dim chemin As String
Dim instanceW As Object: Dim docPDF As Object

Set boite = Application.FileDialog(msoFileDialogFilePicker)
If boite.Show Then chemin = boite.SelectedItems(1)

If chemin <> "" And Right(chemin, 4) = ".pdf" Then
Set instanceW = CreateObject("Word.Application")
instanceW.Visible = False

Set docPDF = instanceW.Documents.Open(chemin)
instanceW.Selection.WholeStory
instanceW.Selection.Copy

Selection.Paste
Selection.HomeKey wdStory

ActiveDocument.SaveAs2 Replace(chemin, ".pdf", ""), wdFormatDocumentDefault

docPDF.Close
instanceW.Quit

Set docPDF = Nothing
Set instanceW = Nothing
Else
MsgBox "traitement abandonné"
End If

End Sub


 
Sur Facebook
Sur Youtube
Les livres
Contact
Mentions légales



Abonnement à la chaîne Youtube
Partager la formation
Partager sur Facebook
Partager sur Twitter
Partager sur LinkedIn