Donnez vie à vos documents numériques !
 

Champs adresses remplis après sélection nom dans liste

abracadabraPDF Forums PDF – Général Champs adresses remplis après sélection nom dans liste

Étiqueté : 

  • Créateur
    Sujet
  • #73421
    ced2001
    Participant

    Bonjour, je souhaiterais modifier un formulaire PDF avec des champs Adresse, NPA, Ville, Tel, Mail, … Se remplissent automatiquement en fonction d’un nom sélectionné dans un champ liste.

    Idéalement les données seraient stockées dans un fichier Exel, CVS, joint au formulaire et caché ou directement dans un script.

    Merci d’avance pour votre aide

Affichage de 32 réponses de 1 à 32 (sur un total de 32)
  • Auteur
    Réponses
  • #73422
    bebarth
    Maître des clés

    bonsoir,
    Le sujet a déjà été traité plusieurs fois, dont :

    Importation des données à partir d’un fichier texte.


    et ci-joint le script associé :
    // Importation de l'unique pièce jointe sans la nommer
    var pj=this.getDataObject(this.dataObjects[0].name);
    var fichier=this.getDataObjectContents(pj.name);
    var donnees=util.stringFromStream(fichier);
    // Suppression du fichier
    this.removeDataObject(pj.name);
    // Suppression du champ "script"
    this.removeField("script");
    // Séparation des lignes de la feuille de calcul (saut de ligne)
    var lignes=donnees.split("\r\n");
    // Séparation des cellules de chaque ligne de la feuille de calcul (TAB)
    cellules=new Array();
    for (var i=1; i<lignes.length; i++) {
    // i est le numéro de la ligne et on commence par la deuxième ligne : i=1
    cellules=lignes.split(";");
    this.getField("Nom").value=cellules[0]; // Cellule 0 de la ligne i, donc Nom
    this.getField("Prenom").value=cellules[1]; // Cellule 1 de la ligne i, donc Prénom
    this.getField("Adresse").value=cellules[2]; // etc.
    this.getField("Telephone").value=cellules[3];
    this.getField("e-mail").value=cellules[4];
    var nomFichier="Fichier "+cellules[0]+" "+cellules[1]+".pdf";
    if (i!=lignes.length-1) this.saveAs({cPath: nomFichier,bCopy: true});
    else this.saveAs({cPath: nomFichier});
    }

    …et le fichier en pièce jointe.

    @+

    Attachments:
    You must be logged in to view attached files.
    #73435
    ced2001
    Participant

    Bonjour

    Merci pour votre réponse.

    Je pense que je n’ai pas bien expliqué se que j’aimerais…

    J’ai un formulaire type contrat à compléter et une dizaine d’adresse revienne régulièrement

    je souhaite joindre un XLSX,CVS ou autre base de donnée comme Access qui contient les nom, adresse, N°, ….

    Dans mon formulaire un champ liste déroulante permet de choisir le nom et j’aimerais que les autre champs texte se remplisse lors de la sélection, lâché de souris ou sortie du champ….

    Je ne suis vraiment pas expert mais voici les script que j’ai essayé de faire fonctionner :

     

     

    var excelFilePath = “/chemin/fichier.xlsx”; //

    var selectedName = this.getField(“nomMenuDeroulant”).value;
    var excelData = app.Excel.importDataObjects(excelFilePath);

    for (var i = 0; i < excelData.length; i++) {
    if (excelData[“11 Nom_2”] === selectedName) {
    this.getField(“12 Adresse_2”).value = excelData[“12 Adresse_2”];
    this.getField(“13 NPA_2”).value = excelData[“13 NPA_2”];
    this.getField(“14 Ville_2”).value = excelData[“14 Ville_2”];
    this.getField(“15 Téléphone_2”).value = excelData[“15 Téléphone_2”];
    this.getField(“16 E-Mail_2”).value = excelData[“16 E-Mail_2”];
    break;
    }
    }

     

    Y compris en adaptant le votre

     

    // Importation de l’unique pièce jointe sans la nommer
    var pj = this.getDataObject(this.dataObjects[0].name);
    var fichier = this.getDataObjectContents(pj.name);
    var donnees = util.stringFromStream(fichier);

    // Séparation des lignes de la feuille de calcul (saut de ligne)
    var lignes = donnees.split(“\r\n”);

    // Séparation des cellules de chaque ligne de la feuille de calcul (TAB)
    cellules = new Array();
    for (var i = 1; i < lignes.length; i++) {
    // i est le numéro de la ligne et on commence par la deuxième ligne : i=1
    cellules = lignes.split(“;”);

    // Si le nom dans la cellule correspond au choix dans le champ “11 Nom_2”
    if (this.getField(“11 Nom_2”).value === cellules[0]) {
    // Remplir les champs du formulaire
    this.getField(“12 Adresse_2”).value = cellules[1]; // Adresse
    this.getField(“13 NPA_2”).value = cellules[2]; // NPA
    this.getField(“14 Ville_2”).value = cellules[3]; // Ville
    this.getField(“15 Téléphone_2”).value = cellules[4]; // Téléphone
    this.getField(“16 EMail_2”).value = cellules[5]; // EMail

    // … (code existant)

    break; // Terminer la boucle une fois que la correspondance est trouvée
    }
    }

    #73436
    bebarth
    Maître des clés
    bonjour,


    var excelFilePath = « /chemin/fichier.xlsx »; //
    var selectedName = this.getField(« nomMenuDeroulant »).value;
    var excelData = app.Excel.importDataObjects(excelFilePath);

    Ça ce n’est pas possible !
    Ton fichier .csv doit être en pièce jointe de ton pdf.

    @+

    #73437
    ced2001
    Participant

    Bonsoir

    Si le fichier est en pièce jointe c’est encore mieux. J’aurais meme envisager d’intégrer les adresse dans le script mais moins facile à mettre à jour …

    Par contre est-il possible d’utiliser un tableau .Xlsx au lieu du csv ? Et est-il possible de le cacher ?

    #73438
    bebarth
    Maître des clés

    Du coup, voici un script pour un autre post que j’avais écris il y a quelques années (déjà) !

    // Script de document
    var id=this.getField(“ID”).value;
    var studentName=this.getField(“Name”).value;
    var parentName=this.getField(“Parent_Name”).value;
    var address=this.getField(“Address”).value;
    var phoneNumber=this.getField(“Phone_Number”).value;
    var email=this.getField(“E-mail”).value;
    // Initialisation liste déroulante
    this.getField(“ID”).clearItems();
    // Importer l’unique PJ sans la nommer
    var p=this.getDataObject(this.dataObjects[0].name);
    var fichier=this.getDataObjectContents(p.name);
    var donnees=util.stringFromStream(fichier);
    // Séparation des rangées (saut de ligne)
    var rangees=donnees.split(“\n”);
    // Séparation des colonnes (TAB)
    var colonnes=new Array();
    for (var i=0; i<rangees.length; i++) colonnes=rangees.split(“;”);
    var cellule=new Array();
    for (var j=0; j<colonnes.length; j++) cellule[j]=[colonnes[j][0], j];
    // Remplissage de la liste déroulante
    this.getField(“ID”).setItems(cellule); // champ liste déroulante
    // Re-remplissage des champs
    this.getField(“ID”).value=id;
    this.getField(“Name”).value=studentName;
    this.getField(“Parent_Name”).value=parentName;
    this.getField(“Address”).value=address;
    this.getField(“Phone_Number”).value=phoneNumber;
    this.getField(“E-mail”).value=email;

    // Script de touches personnalisé du menu déroulant
    if (!event.willCommit) {
    try {
    var studentName=colonnes[event.changeEx][1];
    } catch(e) {
    var studentName=””;
    }
    try {
    var parentName=colonnes[event.changeEx][2];
    } catch(e) {
    var parentName=””;
    }
    try {
    var address=colonnes[event.changeEx][3];
    } catch(e) {
    var address=””;
    }
    try {
    var phoneNumber=colonnes[event.changeEx][4];
    } catch(e) {
    var phoneNumber=””;
    }
    try {
    var email=colonnes[event.changeEx][5];
    } catch(e) {
    var email=””;
    }
    this.getField(“Name”).value=studentName;
    this.getField(“Parent_Name”).value=parentName;
    this.getField(“Address”).value=address;
    this.getField(“Phone_Number”).value=phoneNumber;
    this.getField(“E-mail”).value=email;
    }

    @+

    Attachments:
    You must be logged in to view attached files.
    #73440
    ced2001
    Participant

    Bonjour

    C’est exactement le principe ! Merci beaucoup !

    Comme expliqué dans mon 1er message, je ne suis vraiment pas un expert …

    Pouvez-vous m’expliquer comment le mettre en place dans le formulaire (Est-ce dans action  du champ liste ?)

    Est-ce que le fichier Excel peut-être masqué ou invisible pour les utilisateur ?

    Est-ce que le système marchera avec le lecteur pdf ou uniquement la version pro ?

    #73441
    bebarth
    Maître des clés

    bonjour,

    Pouvez-vous m’expliquer comment le mettre en place dans le formulaire (Est-ce dans action du champ liste ?)

    Le code est placé en “Script de touches personnalisé” du menu déroulant (cf. copie d’écran).

    Est-ce que le fichier Excel peut-être masqué ou invisible pour les utilisateur ?

    Le fichier Excel peut-être masqué si on cache les volets de navigation… On peut peut-être essayer qu’il ne soit pas possible à afficher !

    Est-ce que le système marchera avec le lecteur pdf ou uniquement la version pro ?

    Ça fonctionnera sur ordinateur PC/Mac avec Acrobat Reader ou Pro (ou autres lecteurs pdf) mais pas avec les téléphones et tablettes dont les readers sont allergiques au JavaScript.

    Si tu veux plus d’aide, merci de partager un fichier (en messagerie privée si tu le souhaites).

    @+

    Attachments:
    You must be logged in to view attached files.
    #73443
    ced2001
    Participant

    Merci beaucoup pour ton aide !

    J’ai regardé et il me semblait qu’il y avait aussi un script à la base du document qui allait prendre les ID pour mettre à jour la liste …

    Je veux bien un coup de pouce, c’ai du déjà passé une vingtaine d’heure juste sur cette partie !

     

    Après je veux faire qqch pour lier les champs ville et npa mais apparemment c’est plus simple !

    #73444
    ced2001
    Participant

    Je n’arrive pas à envoyer mon pdf en MP.

    Je ne trouves rien sur le forum …. Voici la 1ere page du formulaire, rien de confidentiel !

    • Cette réponse a été modifiée le il y a 5 mois et 3 semaines par ced2001.
    Attachments:
    You must be logged in to view attached files.
    #73452
    bebarth
    Maître des clés

    bonjour,
    Voici les scripts à indiquer :
    // Script de document
    this.getField("nomCabinet").clearItems();
    var p=this.getDataObject(this.dataObjects[0].name);
    var fichier=this.getDataObjectContents(p.name);
    var donnees=util.stringFromStream(fichier);
    var rangees=donnees.split("\n");
    var colonnes=new Array();
    for (var i=0; i<rangees.length; i++) colonnes=rangees.split(";");
    var cellule=new Array();
    for (var j=0; j<colonnes.length; j++) cellule[j]=[colonnes[j][0],j];
    cellule[0][0]="";
    this.getField("nomCabinet").setItems(cellule);

    // Script de touches personnalisé du menu déroulant
    if (!event.willCommit) {
    if (event.changeEx!=0) {
    this.getField("adresseCabinet").value=colonnes[event.changeEx][1];
    this.getField("npaCabinet").value=colonnes[event.changeEx][2];
    this.getField("villeCabinet").value=colonnes[event.changeEx][3];
    this.getField("telephoneCabinet").value=colonnes[event.changeEx][4];
    this.getField("emailCabinet").value=colonnes[event.changeEx][5];
    } else {
    this.getField("adresseCabinet").value="";
    this.getField("npaCabinet").value="";
    this.getField("villeCabinet").value="";
    this.getField("telephoneCabinet").value="";
    this.getField("emailCabinet").value="";
    }
    }

    …et si tu as des caractères accentués, il faut absolument enregistrer ton fichier .csv en UTF-8.

    @+

    • Cette réponse a été modifiée le il y a 5 mois et 3 semaines par bebarth.
    Attachments:
    You must be logged in to view attached files.
    #73455
    ced2001
    Participant

    Excellent !! Merci beaucoup !

    Si je fais la même chose avec ville et NPA. J’utilise seulement le script de touche ? Je peux mettre en relation deux cases texte sans menu déroulant afin que l’une ou l’autre reprenne le texte de l’autre ?

    #73456
    bebarth
    Maître des clés

    ??? Je ne comprends pas les questions !
    Tu veux un menu déroulant pour “ville” et “NPA” ?

    @+

    #73457
    ced2001
    Participant

    A désolé je ne sais pas comment expliquer

    Non pas forcément besoins de liste déroulante (sauf si c’est plus simple) mais juste des champs textes.

    Je voudrais juste lier les champs Fille et NPA via un csv. Si je tape le NPA la ville se remplit et si je tape la ville le NPA se remplit cette fonction est dispo sur beaucoup de formulaire internet

    #73458
    bebarth
    Maître des clés

    Tu peux écrire ceci :
    // Script champ "npaCabinet" désactivé
    for (var i=0; i<colonnes.length; i++) {
    if (event.value==colonnes[2]) {
    this.getField("villeCabinet").value=colonnes[3];
    break;
    }
    }
    // Script champ "villeCabinet" désactivé
    for (var i=0; i<colonnes.length; i++) {
    if (event.value==colonnes[3]) {
    this.getField("npaCabinet").value=colonnes[2];
    break;
    }
    }

    @+

    Attachments:
    You must be logged in to view attached files.
    #73460
    ced2001
    Participant

    Oui c’est exactement ça ! C’est plus qu’un coup de main là !!! Merci beaucoup !

    C’est possible d’avoir deux fichier csv par document ? J’en ai fait un avec le NPA qui ne changera jamais (celui des vetos aura des mises à jour)

    Du coup il faut copier le script dans les scripts de touches des champs NPA et Ville ? Si j’ai plusieurs champs NPA et ville dans mon formulaire, je peux utiliser le même script ?

    Attachments:
    You must be logged in to view attached files.
    #73486
    bebarth
    Maître des clés

    bonjour,
    C’est possible ! Il faut donc appeler chaque fichier csv plutôt par son nom que sa position…

    ...
    //
    var fichier=this.getDataObjectContents("NPA.csv");
    var donnees=util.stringFromStream(fichier).replace(/\r/g,"");
    var rangees=donnees.split("\n");
    var NPA=new Array();
    for (var i=0; i<rangees.length; i++) NPA=rangees.split(";");

    // Script champ "npaCabinet" désactivé
    if (event.value) {
    for (var i=0; i<NPA.length; i++) {
    if (event.value==NPA[1]) {
    this.getField("villeCabinet").value=NPA[0];
    break;
    }
    this.getField("villeCabinet").value="";
    }
    } else this.getField("villeCabinet").value="";
    // Script champ "villeCabinet" désactivé
    if (event.value) {
    for (var i=0; i<NPA.length; i++) {
    if (event.value.toUpperCase()==NPA[0].toUpperCase()) {
    this.getField("npaCabinet").value=NPA[1];
    event.target.value=NPA[0];
    break;
    }
    this.getField("npaCabinet").value=""
    }
    } else this.getField("npaCabinet").value="";

    @+
    😎

    • Cette réponse a été modifiée le il y a 5 mois et 2 semaines par bebarth.
    #73509
    daninet
    Participant

    Bonjour (Salve)

    Je m’excuse si je l’écris ici, est-il possible de mettre à jour la pièce jointe Excel des listes Veto à partir du fichier PDF ? insérer de nouvelles données ? qu’ils sont toujours mis à jour ?

    #73510
    bebarth
    Maître des clés

    bonjour,
    Si je comprends bien, tu veux alimenter le fichier .csv à partir de données entrées dans le pdf !
    Si c’est cela, il y a un post où j’avais répondu :

    Problème d’ouverture d’un fichier


    …et le fichier correspondant en pièce jointe.

    N’hésite pas à demander pour des informations complémentaires.

    @+
    😎

    Attachments:
    You must be logged in to view attached files.
    #73512
    ced2001
    Participant

    Bonjour Bebarth

    J’ai réussi à importé et modifier les scripts avec adresses sans problème

    par contre pour les NPA j’ai qqch qui beug ! Même en reprenant le NPA du fichier avec les adresses afin d’avoir qu’un seul csv …

    Une case efface l’autre !?

    Je souhaite utiliser le script dans chaque case du formulaire avec ville et adresse  il me suffit de copier ton script dans les actions des cases en question  ?

    for (var i=0; i<colonnes.length; i++) {
    if (event.value==colonnes[3]) {
    this.getField(“npaCabinet”).value=colonnes[2];
    break;
    }
    }

    J’ai loupé qqch ? Il me semple que c’est les colonnes 3 et 4 Non ? Pas 2 et 3 ?

    J’ai essayé de remplacer “npaCabinet” par “06 NPA” et villeCabinet par “07 ville” qui corresponde au champs de mon document mais cela ne fonctionne pas

     

    Je souhaite aussi ajouter une colonne  dans mon csv ( N°7 frais de déplacements) avec un montant

    et  le reprendre dans une case plus loin dans le formulaire en fonction en fonction du NPA ajouté dans le champs  ” 06 NPA”

     

    #73513
    daninet
    Participant

    Salut,

    en faisant les tests j’ai vu que ça marche sur Acrobat 2020 (je mets à jour le livre)

    alors qu’avec le lecteur Adobe gratuit, ça ne marche pas. (il ne le met pas à jour pour moi)

    Existe-t-il un moyen pour que le lecteur gratuit mette à jour le fichier Excel ?
    Merci

    #73515
    bebarth
    Maître des clés

    Salut, en faisant les tests j’ai vu que ça marche sur Acrobat 2020 (je mets à jour le livre) alors qu’avec le lecteur Adobe gratuit, ça ne marche pas. (il ne le met pas à jour pour moi) Existe-t-il un moyen pour que le lecteur gratuit mette à jour le fichier Excel ? Merci

    Le message retourné par la console avec Adobe Reader est :

    NotAllowedError: Les paramètres de protection interdisent l’accès à cette propriété ou à cette méthode.
    Doc.setDataObjectContents:27:Field addAbook.4:Mouse Up

    Donc pas possible…

    @+
    😎

    #73516
    bebarth
    Maître des clés

    Bonjour Bebarth J’ai réussi à importé et modifier les scripts avec adresses sans problème par contre pour les NPA j’ai qqch qui beug ! Même en reprenant le NPA du fichier avec les adresses afin d’avoir qu’un seul csv … Une case efface l’autre !? Je souhaite utiliser le script dans chaque case du formulaire avec ville et adresse il me suffit de copier ton script dans les actions des cases en question ? for (var i=0; i<colonnes.length; i++) { if (event.value==colonnes[3]) { this.getField(“npaCabinet”).value=colonnes[2]; break; } } J’ai loupé qqch ? Il me semple que c’est les colonnes 3 et 4 Non ? Pas 2 et 3 ? J’ai essayé de remplacer “npaCabinet” par “06 NPA” et villeCabinet par “07 ville” qui corresponde au champs de mon document mais cela ne fonctionne pas Je souhaite aussi ajouter une colonne dans mon csv ( N°7 frais de déplacements) avec un montant et le reprendre dans une case plus loin dans le formulaire en fonction en fonction du NPA ajouté dans le champs ” 06 NPA”

    Il faudrait partager ton fichier car comme ça je ne comprends pas !

    @+
    😎

    #73517
    daninet
    Participant

    Désolé, existe-t-il une autre méthode que vous pouvez utiliser pour saisir et mettre à jour des données avec le lecteur gratuit ?

    peccato, nessun altro metodo da poter utilizzare per inserire e aggiornare dati con il lettore gratuito?

    #73519
    ced2001
    Participant

    Merci pour ta réponse ! C’est ok mais j’ai un problème avec mon dernier script

    for (var i = 0; i < colonnes.length; i++) {
    if (event.value == colonnes[2]) {
    this.getField(“43 Deplacement”).value = colonnes[6];
    break;
    }
    }

    j’ai un message d’erreur car le format du champ 43 est nombre monétaire

     

    Attachments:
    You must be logged in to view attached files.
    #73522
    bebarth
    Maître des clés

    Désolé, existe-t-il une autre méthode que vous pouvez utiliser pour saisir et mettre à jour des données avec le lecteur gratuit ? peccato, nessun altro metodo da poter utilizzare per inserire e aggiornare dati con il lettore gratuito?

    Je ne pense pas !

    @+
    😎

    #73523
    bebarth
    Maître des clés

    Merci pour ta réponse ! C’est ok mais j’ai un problème avec mon dernier script for (var i = 0; i < colonnes.length; i++) { if (event.value == colonnes[2]) { this.getField(“43 Deplacement”).value = colonnes[6]; break; } } j’ai un message d’erreur car le format du champ 43 est nombre monétaire

    Essaye :
    ...
    this.getField("43 Deplacement").value = Number(colonnes[6]);
    ...

    En supposant que “colonnes[6]” (la septième colonne numérotée basée sur 0) est bien un nombre !

    @+
    😎

    • Cette réponse a été modifiée le il y a 5 mois et 2 semaines par bebarth.
    #73525
    ced2001
    Participant

    J’ai essayé de modifier, malheureusement toujours le même message

    je suis bien en nombre dans ma colonne 7

    Attachments:
    You must be logged in to view attached files.
    #73528
    ced2001
    Participant

    J’ai aussi essayer ça

    for (var i = 0; i < colonnes.length; i++) { if (event.value == colonnes[2]) { this.getField(“43 Deplacement”).value = Number(colonnes[6]); break; } }

    #73529
    ced2001
    Participant

    Voila, celui-ci fonctionne !

    Merci encor pour ton aide !

    for (var i = 0; i < colonnes.length; i++) { if (event.value == colonnes[2]) { var montant = parseFloat(colonnes[6].replace(/[^\d]/g, ”)); if (!isNaN(montant)) { this.getField(“43 Deplacement”).value = montant.toFixed(0); } break; } }

    • Cette réponse a été modifiée le il y a 5 mois et 2 semaines par ced2001.
    #73531
    Merlin
    Maître des clés

    “j’ai un message d’erreur car le format du champ 43 est nombre monétaire”

     

    Bonjour

     

    Par principe un champ qui est en lecture seule et qui est rempli programmatiquement ne devrait pas avoir de “Format”.

    En général c’est contre-productif, comme dans ce cas.

    #73532
    ced2001
    Participant

    Bonsoir

    Désolé de revenir vers toi,  j’ai un problème avec le  script  “veto”

    le nom du veto disparaît lors de l’enregistrement du document

    Moins grave,  si je veux ajouter une info après le cabinet sélectionné comme (un nom par exemple), l’adresse  s’efface …

    As-tu une idée ?

    #73567
    bebarth
    Maître des clés

    bonjour,
    Désolé pour cette réponse tardive, je pensais avoir répondu !

    j’ai un problème avec le script “veto” le nom du veto disparaît lors de l’enregistrement du document

    Ça ce n’est pas compliqué, il suffit de récupérer la valeur du menu déroulant à l’ouverture du document et de redonner cette valeur après lecture des données de la pièce jointe dans le script de document.
    var leCabinet=this.getField("nomCabinet").value;
    ...
    this.getField("nomCabinet").value=leCabinet;

    Moins grave, si je veux ajouter une info après le cabinet sélectionné comme (un nom par exemple), l’adresse s’efface … As-tu une idée ?

    Ça c’est plus compliqué et je ne sais pas si c’est une bonne idée… Je vais réfléchir !

    @+
    😎

    Attachments:
    You must be logged in to view attached files.
Affichage de 32 réponses de 1 à 32 (sur un total de 32)
  • Vous devez être connecté pour répondre à ce sujet.