Donnez vie à vos documents numériques !
 

Multiliste déroulante

abracadabraPDF Forums PDF – Général Multiliste déroulante

  • Créateur
    Sujet
  • #74372
    Berbyc
    Participant

    Bonjour à tous,

    Comme je suis débutant et que je n’ai aucune expérience, aidez-moi s’il vous plaît.
    J’ai un formulaire contenant 39 listes déroulantes et un fichier Excel, et j’aimerais faire une synchronisation entre les deux fichiers PDF et Excel via JavaScript comme suit :

    Une synchronisation entre les deux fichiers PDF et Excel, comme suit:
    1. Je souhaite que les menus déroulants Chez moi/Absent soient inactifs, sauf si une chaîne est sélectionnée dans le menu déroulant Chaîne.
    2. Chaque canal possède sa propre liste d’accueil/retour selon le deuxième tableau Excel

    Cordialement.

     

    Attachments:
    You must be logged in to view attached files.
Affichage de 13 réponses de 1 à 13 (sur un total de 13)
  • Auteur
    Réponses
  • #74377
    Berbyc
    Participant

    Et serait-il possible que la deuxième page PDF soit masquée au besoin via une case à cocher non imprimable ?

    Merci

    #74380
    Merlin
    Maître des clés

    Bonjour et bienvenue

     

    Il n’y a qu’un seul PDF en pièce jointe, et dedans il n’y a pas de menu déroulant “Chez moi/absent” ni de menu déroulant “chaîne”, ça n’aide pas à la compréhension de ce que tu veux faire.

     

    Dans un PDF plusieurs champs qui ont exactement le même nom partagent leurs données. En clair ils affichent la même chose et en modifier un seul revient à les modifier tous en même temps.

    Donc en fait ton PDF ne contient que 3 champs : canal, départ et arrivée.

     

    Pour remplir de nombreux champs automatiquement avec un script il faut qu’ils utilisent une règle de nommage cohérente pour qu’une boucle puisse fonctionner. Par exemple : canal.0, canal.1, canal.2, canal.3, etc.

    En général dans les PDF on utilise le point comme séparateur dans le nom des champs pour les raisons qui sont expliquées ici, ainsi que la méthode la plus simple pour les créer : https://www.abracadabrapdf.net/ressources-et-tutos/js-et-formulaires-ressources/duplication-rapide-de-champs-de-formulaire/

     

    Si tu veux que tes champs fonctionne correctement il faut les nommer en respectant la syntaxe web : pas de slash, pas d’accent, pas d’espace, ni aucun caractère spécial.

     

    Concernant la deuxième question, c’est possible mais ce n’est pas quelque chose de simple à faire pour un débutant. D’autant que ton PDF contient 3 pages.

    Fait une recherche sur “template” et sur “page modèle” dans ce forum pour bien comprendre de quoi il s’agit.

     

    #74393
    bebarth
    Maître des clés

    bonjour,
    Moi je veux bien aider, mais il faudrait m’expliquer car je n’ai rien compris à ce que tu voulais faire…

    @+
    😎

    #74394
    Berbyc
    Participant

    Bonjour à tous,

    J’ai deux fichiers, un PDF et l’autre en Excel, ce que je veux c’est :

    Une synchronisation entre les deux fichiers, c’est-à-dire que les listes déroulantes dans le fichier PDF seront alimentées depuis les données du fichier Excel comme suit :

    La liste déroulante canal de la première page du PDF sera alimentée par la colonne canal dans la première feuille Excel, et chaque canal répertorie plusieurs départs (feuille Départ Excel)

    La liste déroulante Départ PDF sera alimentée par la colonne départ de la feuille2 Départ Arrivée de Excel, et chaque Départ regroupe plusieurs arrivées selon les données dans feuille2 Départ Arrivées de Excel

    Le reste des listes déroulantes de la page 2 du PDF seront alimentées séparément quand on sélectionnera un choix, et non pas toutes à la fois avec le même choix.

    Et serait-il possible que la deuxième page PDF soit masquée au besoin via une case à cocher non imprimable ?

    Merci.

     

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

    Je regarde ça dès que possible.

    @+
    😎

    #74398
    bebarth
    Maître des clés

    bonjour,
    Voici déjà un fichier pour la première partie. Les données doivent être en pièces jointes du fichier .pdf au format .csv. Il n’est donc pas possible d’avoir des onglets et il faut donc joindre 2 fichiers séparés.
    Et les scripts utilisés dans ce fichier :
    // Script de document
    //
    var fichier=this.getDataObjectContents("Départ.csv");
    var donnees=util.stringFromStream(fichier);
    var lignes=donnees.split("\r\n");
    var colonnes=new Array();
    for (var i=0 ; i<lignes.length ; i++) colonnes=lignes.split(";");
    var colonne0=[];
    for (var j=0 ; j<colonnes.length ; j++) {
    if (colonnes[j][0]) colonne0.push([colonnes[j][0]]);
    }
    for (var i=1; i<=colonne0.length; i++) {
    eval("var colonne"+(i+1)+"=[];");
    for (var j=0 ; j<colonnes.length ; j++) {
    if (colonnes[j]) eval("colonne"+(i+1)).push(colonnes[j]);
    }
    }
    colonne0[0].push(0);
    for (var i=1; i<colonne0.length; i++) {
    colonne0.push(eval("colonne"+(i+1)))
    }
    //
    var fichier1=this.getDataObjectContents("Départ Arrivée.csv");
    var donnees1=util.stringFromStream(fichier1);
    var lignes1=donnees1.split("\r\n");
    var colonnes1=new Array();
    for (var i=0 ; i<lignes1.length ; i++) colonnes1=lignes1.split(";");
    for (var i=1; i<=colonnes1[0].length; i++) {
    eval("var colonne"+(i+1)+"1=[\"- Sélectionnez -\"];");
    for (var j=1 ; j<colonnes1.length ; j++) {
    if (colonnes1[j]) eval("colonne"+(i+1)+"1").push(colonnes1[j]);
    }
    }
    //
    var leCanal=this.getField("Canal").value;
    this.getField("Canal").clearItems();
    this.getField("Canal").setItems(colonne0);
    this.getField("Canal").value=leCanal;

    // Script de touches personnalisé Menu "Canal"
    if (!event.willCommit) {
    this.getField("Départ").clearItems();
    this.getField("Arrivée").clearItems();
    if (event.changeEx!=0) {
    var leMenu=event.changeEx.split(",");
    var ind=leMenu[0].substr("Canal ".length);
    leMenu[0]=["- Sélectionnez -",0];
    for (var i=1; i<leMenu.length; i++) {
    leMenu=[leMenu,eval("colonne"+(i+1)+"1")];
    }
    this.getField("Départ").clearItems();
    this.getField("Départ").setItems(leMenu);
    }
    }

    // Script de touches personnalisé Menu "Départ"
    if (!event.willCommit) {
    this.getField("Arrivée").clearItems();
    if (event.changeEx!=0) {
    this.getField("Arrivée").clearItems();
    this.getField("Arrivée").setItems(event.changeEx.split(","));
    }
    }

    Le reste des listes déroulantes de la page 2 du PDF seront alimentées séparément quand on sélectionnera un choix, et non pas toutes à la fois avec le même choix. Et serait-il possible que la deuxième page PDF soit masquée au besoin via une case à cocher non imprimable ?

    Pour ça il me faudra quelques explications car je n’ai pas compris…

    @+
    😎

    Attachments:
    You must be logged in to view attached files.
    #74400
    Berbyc
    Participant

    Bonjour Bebarth, bonjour à tous,

    Merci Bebarth pour votre réponse et pour votre effort.

    Pour ça il me faudra quelques explications car je n’ai pas compris…

    On peut pas dupliquer le même choix de la liste déroulante (Départ) ou bien (Arrivée) de la page 1 sur les autre listes déroulante de la page 2.
    C’est-à-dire, si on sélectionne un choix (Départ et Arrivée) sur la page 1 pdf , les autres listes déroulantes de page 2 sera vide, afin qu’on aura la possibilité de sélectionner un autre choix diffèrent sur chaque liste déroulante (Départ et Arrivée) page2.

    (page 2 c’est une page supplémentaire, c’est pour cela que je voudrais que cette page soit masquer et elle sera afficher si besoin via case à cocher non imprimable).

    Et serait-il possible que la deuxième page PDF soit masquée au besoin via une case à cocher non imprimable ?

    D’autre question s’ils vous plait, serait-il possible masquer les pièces jointes (excel.csv) pour que les autres utilisateurs de ce fichier pdf ne pourront pas accéder au pièces jointes, et ils n’auront donc pas la possibilité de les modifier?

    • Cette réponse a été modifiée le il y a 1 semaine et 1 jour par Berbyc.
    • Cette réponse a été modifiée le il y a 1 semaine et 1 jour par Berbyc.
    • Cette réponse a été modifiée le il y a 1 semaine et 1 jour par Berbyc.
    #74404
    bebarth
    Maître des clés

    On peut pas dupliquer le même choix de la liste déroulante (Départ) ou bien (Arrivée) de la page 1 sur les autre listes déroulante de la page 2. C’est-à-dire, si on sélectionne un choix (Départ et Arrivée) sur la page 1 pdf , les autres listes déroulantes de page 2 sera vide, afin qu’on aura la possibilité de sélectionner un autre choix diffèrent sur chaque liste déroulante (Départ et Arrivée) page2.

    Ça demande réflexion… une chose est sûre c’est que ce n’est pas simple et que les différents noms de champs ne peuvent pas être identiques à ceux de la page 1.  Je regarderai ça jeudi.

    (page 2 c’est une page supplémentaire, c’est pour cela que je voudrais que cette page soit masquer et elle sera afficher si besoin via case à cocher non imprimable).

    Pages 2 et 3 donc ! Ça ne devrait pas être compliqué, dès que le problème précédent sera résolu.

    D’autre question s’ils vous plait, serait-il possible masquer les pièces jointes (excel.csv) pour que les autres utilisateurs de ce fichier pdf ne pourront pas accéder au pièces jointes, et ils n’auront donc pas la possibilité de les modifier?

    Ça c’est une bonne question dont je n’ai pas encore la réponse. On pourra peut-être caché ce panneau pour les utilisateurs de Reader, par exemple… Faut essayer.

    @Merlin
    : Tu as une idée ???

    @+
    😎

    #74406
    Merlin
    Maître des clés

    “D’autre question s’ils vous plait, serait-il possible masquer les pièces jointes (excel.csv) pour que les autres utilisateurs de ce fichier pdf ne pourront pas accéder au pièces jointes, et ils n’auront donc pas la possibilité de les modifier?”

    La réponse est non.

    Sécurité oblige, si c’était possible tous les antivirus rejetteraient le fichier car il serait soupçonné d’être malicieux.

    #74409
    Berbyc
    Participant

    Merci @Merlin pour votre réponse, @bebarth merci pour votre support

     

    • Cette réponse a été modifiée le il y a 1 semaine par Berbyc.
    #74412
    Merlin
    Maître des clés

    Il est possible de placer les données dans le code JavaScript mais ça les rendrait difficilement actualisables.

    On peut éventuellement chiffrer le code JavaScript mais ça dépend à qui le document est destiné car on retombe dans le problème évoqué ci-dessus : un PDF contenant du code chiffré est systématiquement rejeté par les antivirus, qui empêchent donc son ouverture ou son téléchargement.

    #74413
    Berbyc
    Participant

    L’antivirus est déjà installé sur toutes les machines des utilisateurs de ce fichier

    • Cette réponse a été modifiée le il y a 6 jours et 13 heures par Berbyc.
    #74415
    bebarth
    Maître des clés

    bonjour,
    Voici ce que j’ai fait aujourd’hui. J’espère que cela te convient. Pour cacher les fichiers attaché on pourrait faire une tempo toutes les secondes par exemple, mais ça veut dire que le fichier est perpétuellement en calcul !

    Voici tous les scripts que j’ai utilisé. Si tu es débutant ça va peut-être un peu compliqué pour toi à comprendre : Il y a des scripts de document, des fonctions, une page modèle…

    // Script de document
    //
    var nbDepart=0;
    for (var i=0; i<this.numFields; i++) {
    if (/^Départ\.\d+/.test(this.getNthFieldName(i))) nbDepart++;
    }
    var fichier=this.getDataObjectContents("Départ.csv");
    var donnees=util.stringFromStream(fichier);
    var lignes=donnees.split("\r\n");
    var colonnes=new Array();
    for (var i=0 ; i<lignes.length ; i++) colonnes=lignes.split(";");
    var colonne0=[];
    for (var j=0 ; j<colonnes.length ; j++) {
    if (colonnes[j][0]) colonne0.push([colonnes[j][0]]);
    }
    for (var i=1; i<=colonne0.length; i++) {
    eval("var colonne"+(i+1)+"=[];");
    for (var j=0 ; j<colonnes.length ; j++) {
    if (colonnes[j]) eval("colonne"+(i+1)).push(colonnes[j]);
    }
    }
    colonne0[0].push(0);
    for (var i=1; i<colonne0.length; i++) {
    colonne0.push(eval("colonne"+(i+1)))
    }
    // Fichier "Départ Arrivée.csv"
    var fichierDA=this.getDataObjectContents("Départ Arrivée.csv");
    var donneesDA=util.stringFromStream(fichierDA);
    var lignesDA=donneesDA.split("\r\n");
    var colonnesDA=new Array();
    for (var i=0 ; i<lignesDA.length ; i++) colonnesDA=lignesDA.split(";");
    for (var i=1; i<=colonnesDA[0].length; i++) {
    eval("var colonne"+(i+1)+"DA=[\"- Sélectionnez -\"];");
    for (var j=1 ; j<colonnesDA.length ; j++) {
    if (colonnesDA[j]) eval("colonne"+(i+1)+"DA").push(colonnesDA[j]);
    }
    }
    //
    var leCanal=this.getField("Canal").value;
    this.getField("Canal").clearItems();
    this.getField("Canal").setItems(colonne0);
    this.getField("Canal").value=leCanal;
    //
    function menuCanal(laValeur) {
    try {
    for (var i=0; i<nbDepart; i++) {
    this.getField("Départ."+i).clearItems();
    this.getField("Arrivée."+i).clearItems();
    }
    if (laValeur!=0) {
    var leMenu=laValeur.split(",");
    var ind=leMenu[0].substr("Canal ".length);
    leMenu[0]=["- Sélectionnez -",0];
    for (var i=1; i<leMenu.length; i++) {
    leMenu=[leMenu,eval("colonne"+(i+1)+"DA")];
    }
    for (var i=0; i<nbDepart; i++) {
    this.getField("Départ."+i).clearItems();
    this.getField("Départ."+i).setItems(leMenu);
    }
    }
    } catch(e) {}
    }
    //
    function menuDepart(ind,laValeur) {
    this.getField("Arrivée."+ind).clearItems();
    this.getField("Arrivée."+ind).setItems(laValeur.split(","));
    }
    function menuArrivee(leChamp) {
    try {
    var ind=leChamp.name.substring(leChamp.name.indexOf(".")+1);
    var laTable=this.getField("Départ."+ind).value.split(",");
    for (var i=0; i<nbDepart; i++) {
    if (i==ind) continue;
    for (j=0; j<leChamp.numItems; j++) {
    if (this.getField("Départ."+i).getItemAt(this.getField("Départ."+i).currentValueIndices,false)==this.getField("Départ."+ind).getItemAt(this.getField("Départ."+ind).currentValueIndices,false) && this.getField("Arrivée."+i).value==laTable[j]) laTable.splice(j,1);
    }
    }
    var lArrivee=leChamp.value;
    leChamp.clearItems();
    leChamp.setItems(laTable);
    leChamp.value=lArrivee;
    } catch(e) {}
    }

    // Script de touches personnalisé Menu "Canal"
    if (!event.willCommit) menuCanal(event.changeEx);

    // Script de touches personnalisé Menu "Départ"
    if (!event.willCommit) menuDepart(event.target.name.substring(event.target.name.indexOf(".")+1),event.changeEx);

    // Ajout Script de touches personnalisé de tous les Menus "Départ"
    for (var i=0; i<30; i++) {
    this.getField("Départ."+i).setAction("Keystroke","if (!event.willCommit) menuDepart(event.target.name.substring(event.target.name.indexOf(\".\")+1),event.changeEx);");
    }

    // Souris entrée de tous les Menus "Arrivée"
    menuArrivee(event.target);

    // Ajout Script Souris entrée de tous les Menus "Arrivée"
    for (var i=0; i<30; i++) {
    this.getField("Arrivée."+i).setAction("MouseEnter","menuArrivee(event.target);");
    }

    // Script d'ouverture de page
    if (app.viewerType!="Exchange-Pro") this.viewState={overViewMode:2};
    this.viewState={overViewMode:5}

    // Script Affichage Page 2
    var modeles=this.templates;
    for (i=0; i<modeles.length; i++) {
    if (modeles.name=="page2") {
    modeles.hidden=(event.target.value=="Off");
    break;
    }
    }
    this.pageNum=0;

    @+
    😎

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