Convertir/exporter les données du formulaire PDF vers CSV  (Lu 631 fois) Partager ce sujet Imprimer

1 2 B


bebarth  13 mars 2019 : 15:46

Voici un script spécialement adapté pour ton fichier.
var Chemin=this.path;
var donneesCSV=this.getDataObjectContents("test.csv");
var lesDonnees=util.stringFromStream(donneesCSV);
var lesLignes=lesDonnees.split("\r");
var laLigne1=lesLignes[0].split(";");
var laLigne2=lesLignes[1].split(";");
for (var i=0; i<laLigne1.length; i++) {
    var n=laLigne2[i].charCodeAt(0);
    if (n==10) laLigne2[i]=laLigne2[i].substring(1); // Spécialement pour fichier csv fourni ???
    if (laLigne1[i]=="Rfrence") laLigne1[i]="Référence";
    if (laLigne1[i]=="Site de lincident ->Nom complet") laLigne1[i]="Site de l’incident ->Nom complet";
    this.getField(laLigne1[i]).value=laLigne2[i];
}
this.removeDataObject("test.csv");
this.saveAs(Chemin.substring(0,Chemin.length-4)+" ("+this.getField("Client->Nom organisation").value+").pdf");
Les caracères non reconnus sont "é" dans Référence et l'apostrophe dans "Site de l’incident..."
@+
 :bonjour:

IP archivée


Merlin  13 mars 2019 : 16:56

 :bravo:

IP archivée


iRaJaaa  13 mars 2019 : 17:39

Merci beaucoup bebarth et Merlin , grâce aux "If", cela fonctionne parfaitement ! Cela me permet d'avoir un exemple de comment contourner les problèmes de syntaxe pour les prochaines fois.

Pour étudier les différentes cas de figure, je souhaite mettre en place une condition qui dit en français "Si le champ du fichier CSV (ligne 1) n'est pas présent dans le formulaire, alors ignorer/continuer". En effet, j'ai remarqué que si il y a une erreur lors d'un n-ième champs, les suivant ne se complète pas.

Je pensais à mettre une condition "If" après le premier :
if (n==10) laLigne2=laLigne2.substring(1);
if (laLigne1=! **********) continue; (ou sinon avec un else)

Je ne connais pas la syntaxe qui permet de complété les *, mais cela devrait correspondre aux champs de manière général du formulaire courant (this.getField ?)

IP archivée


bebarth  13 mars 2019 : 18:55

Il faut plutôt utiliser "try & catch" :...
try {
this.getField(laLigne1[i]).value=laLigne2[i];
} catch(e) {}
...
@+
 :bonjour:

IP archivée


iRaJaaa  14 mars 2019 : 17:09

Bonjour,

Merci cette solution fonctionne à merveille!

IP archivée


iRaJaaa  14 mars 2019 : 17:37

Je viens tout juste de mettre à jour ma version vers "Adobe Acrobat XI Pro".

Si vous avez des solutions supplémentaires, ou fonctionnalités avec cette version, qui correspond à mon besoin, je suis intéressé par curiosité

IP archivée


Merlin  14 mars 2019 : 19:09

Voilà trois bons tutos/articles pour Acrobat Pro (vs Acrobat Standard) :
- https://www.abracadabrapdf.net/ressources-et-tutos/acrobat-reader/acrobat-11-nouveautes/
- https://www.abracadabrapdf.net/ressources-et-tutos/js-et-formulaires-ressources/les-differents-niveaux-dutilisation-des-scripts-javascript/
- https://www.abracadabrapdf.net/ressources-et-tutos/js-et-formulaires-ressources/lediteur-de-formulaire-dacrobat/

Concernant AcroForms et JavaScript il n'y pas eu d'évolution majeure depuis Acrobat X(10), et même si ça trouve pas d'évolution du tout (à part les mises à jour du "moteur" JavaScript).

IP archivée


bebarth  15 mars 2019 : 11:54

bonjour,
Voici une version adaptée spécialement pour les fichiers que tu m'as fait parvenir. Je ne suis pas diplômé es .csv, et je ne pourrais donc pas t'expliquer le pourquoi mais avec tes fichiers UTF-8 on récupères également des guillemets et le retour ligne récupéré n'est pas \r. Par contre on récupère bien les caractères accentués, j'ai donc retiré les lignes pour renommer.
Il faut donc dans un premier temps trouver ce séparateur. Avec : if (lesDonnees.charCodeAt(i-1)==34 && lesDonnees.charCodeAt(i+1)==34 && lesDonnees.charCodeAt(i)!=59) var separateur=String.fromCharCode(lesDonnees.charCodeAt(i));
On vérifie donc le caractère situé entre 2 guillemets (34) et si ce n'est pas un point-virgule (59), c'est le retour ligne !
Ensuite on retire tous les guillements dans la chaine avec : lesDonnees.replace(/"/gi,""); -> ici le "i" n'est pas obligatoire car il est pour "insensitive case", on pourrait se contenter de : lesDonnees.replace(/"/g,"");
Ce qui donne au final :
var Chemin=this.path;
var donneesCSV=this.getDataObjectContents("fichierData.csv");
var lesDonnees=util.stringFromStream(donneesCSV);
for (var i=1; i<lesDonnees.length-1; i++) {
    if (lesDonnees.charCodeAt(i-1)==34 && lesDonnees.charCodeAt(i+1)==34 && lesDonnees.charCodeAt(i)!=59) var separateur=String.fromCharCode(lesDonnees.charCodeAt(i));
}
var lesDonnees=lesDonnees.replace(/"/gi,"");
var lesLignes=lesDonnees.split(separateur);
var laLigne1=lesLignes[0].split(";");
var laLigne2=lesLignes[1].split(";");
for (var i=0; i<laLigne1.length; i++) {
    try {
        this.getField(laLigne1[i]).value=laLigne2[i];
    } catch(e) {}
}
this.removeDataObject("fichierData.csv");
this.saveAs(Chemin.substring(0,Chemin.length-4)+" ("+this.getField("Client->Nom organisation").value+").pdf");
@+
 :bonjour:

IP archivée


iRaJaaa  15 mars 2019 : 14:49

J'ai bien compris où tu veux en venir, merci pour l'explication. Cependant, je viens de mettre à jour le script, et cela ne fonctionne pas.
Je travaille bien avec le fichier UTF-8. Si cela fonctionne de ton côté (sans avoir modifié le fichier CSV), cela doit venir de mon côté, mais je vois pas d'où ça provient.

Concernant le fichier avec l'autre norme, cela n'est pas possible ?

Lorsque j'ouvre le débogueur de Javascript, il m'indique : "TypeError: lesLignes is undefined 20:Page:Open", je ne sais pas si il s'agit de cette console que tu me parlais.

IP archivée


bebarth  15 mars 2019 : 15:02

Concernant le fichier avec l'autre norme, cela n'est pas possible ?

C'est possible, mais on ne récupère plus les caractères accentués !
Essaie ce script et donne-moi les résultats de la console.
console.show();
console.clear();
var Chemin=this.path;
var donneesCSV=this.getDataObjectContents("UTF-8.csv");
var lesDonnees=util.stringFromStream(donneesCSV);
console.println("lesDonnees : "+lesDonnees);
for (var i=1; i<lesDonnees.length-1; i++) {
    if (lesDonnees.charCodeAt(i-1)==34 && lesDonnees.charCodeAt(i+1)==34 && lesDonnees.charCodeAt(i)!=59) var separateur=String.fromCharCode(lesDonnees.charCodeAt(i));
}
console.println("lesDonnees 1 : "+lesDonnees);
var lesDonnees = lesDonnees.replace(/"/gi,"");
console.println("lesDonnees 2 : "+lesDonnees);
var lesLignes=lesDonnees.split(separateur);
console.println("lesLignes : "+lesLignes);
var laLigne1=lesLignes[0].split(";");
console.println("laLigne1 : "+laLigne1);
var laLigne2=lesLignes[1].split(";");
console.println("laLigne2 : "+laLigne2);
for (var i=0; i<laLigne1.length; i++) {
    console.println("i : "+i);
    console.println("laLigne1[i] : "+laLigne1[i]);
    console.println("laLigne2[i] : "+laLigne2[i]);   
    try {
        this.getField(laLigne1[i]).value=laLigne2[i];
    } catch(e) {}
}
this.removeDataObject("UTF-8.csv");
this.saveAs(Chemin.substring(0,Chemin.length-4)+" ("+this.getField("Client->Nom organisation").value+").pdf");
@+
 :bonjour:

IP archivée


iRaJaaa  15 mars 2019 : 16:04

Mais si on réutilise les conditions "If" que tu avais écrites, normalement c'est bon non ?
Je pensais que c'était le fichier CSV qui avait un format spécial. En effet, même si je prends le fichier CSV sous l'autre format que l'UTF-8, je rencontre le même problème (avec les conditions If.)

Voici le message de la console, je ne comprends pas pourquoi il indique que c'est pas défini, de ton côté cela fonctionne ? :

lesDonnees : "Titre";"Description";"Référence"
"Nouveau titre";"nouvelle description";"Ref1"

lesLignes 1 : undefined

TypeError: lesLignes is undefined
24:Page:Open

IP archivée


bebarth  15 mars 2019 : 17:27

Oups ! J'avais publié une mauvaise ligne de script (var lesLignes=lesLignes.replace(/"/gi,""); au lieu de var lesDonnees=lesDonnees.replace(/"/gi,"");).
Par contre, l'action postée et que je t'ai envoyé par mail est correcte.
J'ai modifié la ligne dans les 2 post précédents.
Tu me dis si tu as encore un message dans la console.
@+
 :bonjour:

IP archivée