Exctration données PDF par power query sur Excel

Bonjour,

J'ai plein de fichier PDF de ce genre dans un dossier avec la même structure et je voudrais extraire les données suivantes :

Numéro de facture : 2026-07-6562
Date d'émission facture initiale / facture rectificative : 01/07/2026
Montant à payer montant brut 302,40
livraison/réalisation de prestation : ANGERS

pour tous les PDF

J'ai commencé un code mais cela ne fonctionne pas

let
    // 1. Récupération du chemin du dossier depuis votre cellule Excel
    CheminDossier = Excel.CurrentWorkbook(){[Name="Fichier.xml"]}[Content]{0}[Column1],
    Source = Folder.Files(CheminDossier),

    // 2. Filtrage pour ne garder que les fichiers PDF
    FiltrePDF = Table.SelectRows(Source, each [Extension] = ".pdf"),

     // 3. Fonction personnalisée intégrée pour extraire et nettoyer le texte de TOUTES les pages du PDF
    ExtraireTextePDF = Table.AddColumn(FiltrePDF, "TexteBrut", each 
        let
            // Extraction des données de toutes les pages du PDF
            PagesPdf = Pdf.Tables([Content], [Implementation="1.3"]),
            // On garde toutes les pages, pas seulement les tables
            FiltrerPages = Table.SelectRows(PagesPdf, each [Kind] = "Page"),
            // Fusion de toutes les pages en un seul gros bloc textuel
            CombinerTexte = Text.Combine(
                List.Transform(
                    FiltrerPages[Data], 
                    each Text.Combine(List.Transform(Table.ToList(_), each Text.From(_)), " ")
                ), 
                " "
            )
        in
            if Text.Length(CombinerTexte) = 0 then 
                "Aucune donnée trouvée" 
            else 
                CombinerTexte
    ),

    // 4. Extraction chirurgicale des 4 données recherchées via des fonctions de texte
    ExtractionDonnees = Table.AddColumn(ExtraireTextePDF, "InfosFacture", each 
        let
            Texte = [TexteBrut],

            // A. Extraction du Numéro de facture
            PosNum = Text.PositionOf(Texte, "Numéro de facture"),
            NumFacture = if PosNum = -1 then null else 
                Text.Middle(Texte, PosNum + Text.Length("Numéro de facture"), 30),
            NumNettoye = Text.Trim(Text.Select(NumFacture, {"0".."9", "-", "/"})),

            // B. Extraction de la Date d'émission
            PosDate = Text.PositionOf(Texte, "ve :,"),
            DateFacture = if PosDate = -1 then null else 
                Text.Middle(Texte, PosDate + Text.Length("ve :,"), 10),
            DateNettoyee = Text.Trim(Text.Select(DateFacture, {"0".."9", "/"})),

            // C. Extraction du Montant à payer (Brut)
            PosMt = Text.PositionOf(Texte, "Montant à payer"),
            MontantBrut = if PosMt = -1 then null else 
                Text.Middle(Texte, PosMt + Text.Length("montant brut"), 20),
            MtNettoye = Text.Trim(Text.Select(MontantBrut, {"0".."9", ",", "."})),

            // D. Extraction du Lieu de livraison
            PosLiv = Text.PositionOf(Texte, "Localité Adresse de livraison"),
            LieuLiv = if PosLiv = -1 then null else 
                Text.Middle(Texte, PosLiv + Text.Length("Localité Adresse de livraison/réalisation de prestation :"), 40),
            // On récupère le premier mot qui suit)
            LieuNettoye = Text.Start(Text.Trim(LieuLiv), Text.PositionOf(Text.Trim(LieuLiv), " "))
        in
            [Num = NumNettoye, Date = DateNettoyee, Total = MtNettoye, Ville = LieuNettoye]
    )
in
    ExtractionDonnees

Le problème je pense est à l'étape 3 il n'extrait pas tout le document mais qu'une partie

Si quelqu'un pourrais regarder ou apporté sa propre solution ce serait cool

Je met en PJ un fichier PDF que j'ai anonymiser met touts les éléments se retrouve

12test.pdf (86.93 Ko)

Hello,

le souci c'est que ton PDF ne comporte pas vraiment des tables et que Power Query "galère" à récupérer les données . En python, il existe un module qui est capable d'aller récupérer des blocs de texte dans un PDF d'après ses coordonnées pages (ce qui semble possible avec ton document) , il s'agit de pymupdf. Avec le module pywin32 , on peut faire facilement un serveur com que l'on peut contacter en vba. Donc en résumé , il faut un python installé sur le poste (facilement installable avec microsoft store) et importer les modules pymupdf et pywin32. Pour enregistrer le serveur com il faut être administrateur. Alors si tu es en entreprise je doute que tu ais ces possibilités. En tout cas voilà ce que cela donne dans Excel pour ton fichier de test :

extractpdf

Comme on peut le constater c'est très rapide . Le code VBA :

Sub ExtrairePDF()
    Dim obj As Object
    Dim resultat As Variant
    Range("B3:B6").ClearContents
    Set obj = CreateObject("Python.ExtractPDF")
    resultat = obj.extractPDF(Range("B1").Text)
    Range("B3") = resultat(0)
    Range("B4") = CDate(resultat(1))
    Range("B5") = CDbl(resultat(2))
    Range("B6") = resultat(3)
End Sub

Le script python avec le serveur com et l'extraction PDF fait 135 lignes.

Ami calmant, J.P

Bonjour,

Merci c'est cool je vais regarder ce que je peux faire sinon je le ferais manuellement puis c'est tout 😊
Merci encore pour c'est explication

Cordialement,

Hello,

sinon il y a Tabula un logiciel gratuit (un peu usine à gaz en java mais simple d'emploi) qui tourne dans un navigateur, qui permet de définir des zones dans un modèle et d'extraire les données qui se trouvent dans ces zones. Exemple :

1 - On importe le PDF :

tabula1

2 - Cliquer sur le bouton Extract Data

3 - On définit à la souris les zones pour l'extraction dans le modèle :

tabula2 tabula3 tabula4

4 - On sauvegarde le modèle qu'on pourra utiliser dans d'autres PDFs (Templates/Save Selections as Template)

Et voilà ce que cela donne pour l'extraction :

tabula5

Ami calmant, J.P

Finalement c'est faisable en Power Query avec expansion totale (pages et tables) et en se servant du numéro de ligne et de colonne pour cibler les données à extraire (en espérant que cela ne change pas suivant la facture ) :

let
    Source = Pdf.Tables(
        File.Contents(
            Excel.CurrentWorkbook(){[Name="Fichier"]}[Content][Column1]{0}
        )
    ),

    // Toutes les colonnes présentes dans toutes les pages
    Colonnes = List.Union(
        List.Transform(
            Source[Data],
            each Table.ColumnNames(_)
        )
    ),

    #"Data développé" = Table.ExpandTableColumn(
        Source,
        "Data",
        Colonnes,
        List.Transform(Colonnes, each "Data." & _)
    ),

    NumeroFacture = #"Data développé"{13}[Data.Column5],
    DateFacture = #"Data développé"{15}[Data.Column5],
    Montant = #"Data développé"{35}[Data.Column11],
    Ville = #"Data développé"{122}[Data.Column12],

    Resultat = #table(
        {"NumeroFacture", "Date", "Montant", "Ville"},
        {{
            NumeroFacture,
            DateFacture,
            Montant,
            Ville
        }}
    )

in
    Resultat
extractpdf

re,

vous avez tout les 2 la version 2016, mais à partir de 2019 (je pense), on a un outil (qui ne donne pas toujours une résultat satisfaisant) pour extraire un PDF et on peut utiliser VBA pour manipuler tout. Cela a l'air similaire à PQ

le résultat en PJ

2maverick.zip (223.12 Ko)

.

Rechercher des sujets similaires à "exctration donnees pdf power query"