Voici un exemple qui reprend les modules expliqués précédemment, illustrant la lecture d’un PDF au format factur-x
LectureErreur : boucle sur les dernières erreurs FacturX et les affiche
DecodeFichierFacturxXML : ouvre le fichier XML pour en lire les propriétés globales,notes, les lignes, les documents,…
DecodeFichierXML :
Création d’un fichier xml vide pour reçevoir les données
Extraction des métadonnées dans le fichier xml temporaire
procedure LectureErreur 1 txterreur S beginp do txterreur = FacturXGetErreur while txterreur <> " " display left(txterreur) wend endp procedure DecodeFichierFacturxXML(fic) 1 fic A 1 ii x = 1 1 iimax x = 1 1 titre 256 1 decalage 2,0 1 dictionary L = 0 1 retour S beginp retour = FacturXReadOpen(left(fic)) ;open du fichier if retour <> " " | display "erreur " & retour | LectureErreur |else | display "ok" | endif dictionary = 0 retour = FacturXGetGlobalProps(dictionary) ;read entete taxe etc SAUF lignes detail if retour = "1" and dictionary <> 0 decalage = 1 AfficheDictionary(dictionary,decalage,0,0) endif FacturXDictionaryDestroy ;supression des dictionnay crées par la fc FacturXGetGlobalProps ;optionnel, c'est si on veut traiter les notes de la facture dictionary = 0 retour = FacturXGetGlobalNotes(dictionary) ;read notes if retour = "1" and dictionary <> 0 decalage = 1 AfficheDictionary(dictionary,decalage,0,0) endif FacturXDictionaryDestroy ;optionnel, c'est si on veut traiter les documents joints de la facture dictionary = 0 retour = FacturXGetGlobalDocumentsInFiles(dictionary) ;read document if retour = "1" and dictionary <> 0 decalage = 1 AfficheDictionary(dictionary,decalage,1,0) endif FacturXDictionaryDestroy ;et on supprime les fichiers crées par la fc FacturXGetGlobalDocumentsInFiles et FacturXGetGlobalNotes FacturXDeleteTmpFiles do retour = FacturXGetLineProps(dictionary) ;lecture des lignes detail while retour = "1" and dictionary <> 0 decalage = 1 AfficheDictionary(dictionary,decalage,0,0) FacturXDictionaryDestroy ;optionnel, c'est si on veut traiter les notes sur les ligne retour = FacturXGetLineNotes(dictionary) ;lecture des notes de la ligne en cours if retour = "1" and dictionary <> 0 decalage = 2 AfficheDictionary(dictionary,decalage,0,0) FacturXDictionaryDestroy endif ;optionnel, c'est si on veut traiter les documents joints sur les ligne retour = FacturXGetLineDocumentsInFiles(dictionary) ;lecture des documents de la ligne en cours if retour = "1" and dictionary <> 0 decalage = 2 AfficheDictionary(dictionary,decalage,0,0) FacturXDictionaryDestroy endif ;et on supprime les fichiers crées par la fc FacturXGetLinesDocumentsInFiles et FacturXGetLignesNotes FacturXDeleteTmpFiles wend retour = FacturXReadClose() ;fermeture du fichier xml if retour <> " " | display "erreur " & retour | endif endp procedure DecodeFichierXML record * htdf tdfficeml record * htdf tdf 1 fichierxml 260 = " " 1 fichierxmltxt 260 = " " 1 fichiercopiepdf 260 = " " 1 txterr 4096 1 fic 260 1 fd L 1 listxml L 1 numerofic 1,0 1 st x 1 err x beginp ;on prend le fichier pdf qu'il faut mettre en mode local pour avoir un chemin widnows ;le mieux est de faire une copie du pdf vers un fichier temp tdf.name = "aaafacture_nebout_125e_du_09_12_2020.pdf" st = fopen(tdf,"P") if st <> 0 preturn endif fic = tdf.name fclose(tdf) Tmpfcreate (tdfficeml, 2, 0) fichiercopiepdf = GetSystemFileName(tdfficeml) fclose(tdfficeml) st = hcopyfile(left(fic),left(fichiercopiepdf),false,"P",false,numerofic) if st <> 0 if fichiercopiepdf <> " " si erreur alors delete du pdf de copie windeletefile(left(fichiercopiepdf)) endif preturn endif ;1- faturx il faut creer un fichier temporaire pour recevoir le fichier xml de la description de la facture Tmpfcreate (tdfficeml, 2, 0) fichierxml = GetSystemFileName(tdfficeml) fclose(tdfficeml) ;2- appeler la fc d'extraction du fichier factu-x.xml qui sera ecris dans le fichier temporaire ;le fichier temporaire est effacé dans la fonction , attention il peut etre vide au final si le pdf n'a pas de metadata factur-x ;c'est le cas si un fichier pdf a été mis dans la liste des pdf a traité par erreur err = MetaDataExtractFacturxToFile(left(fichiercopiepdf),left(fichierxml),txterr,"") if err <> 0 display left(txterr) else DecodeFichierFacturxXML(fichierxml) ;on peut lire le xml endif if fichierxml <> " " windeletefile(left(fichierxml)) endif if fichiercopiepdf <> " " windeletefile(left(fichiercopiepdf)) endif endp module "yPDFMetaData.dhop" main MetaDataOpen ;extraction factrux-x DecodeFichierXML MetaDataClose programexit