Aller directement à la fin des métadonnées
Aller au début des métadonnées

Vous regardez une version antérieure (v. /wiki/spaces/PAI/pages/10796957697/Exemple+de+lecture+d+un+PDF+factur-x) de cette page.

afficher les différences afficher l'historique de la page

Vous regardez la version actuelle de cette page. (v. 1) Actuel »

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 
  • Aucune étiquette