Donnez vie à vos documents numériques !
 

Parcourir le contenu des zones de texte dans un ordre précis

abracadabraPDF Forums PDF – Général Parcourir le contenu des zones de texte dans un ordre précis

  • Ce sujet est vide.
  • Créateur
    Sujet
  • #46254
    _seb_
    Participant

    Salut à tout le forum, j’ai besoin de votre aide.

    J’ai créé un formulaire depuis un fichier Word, la détection des champs est parfaite (voir ici), 121 champs bien positionnés.
    Par contre le nom des champs correspond au mot qui le précède et je souhaite corriger le formulaire automatiquement à l’appui sur un bouton.
    J’ai stocké les bonnes réponses dans un array :

    Code:
    var reponse =
    [
          « 3 »,
            « 5 »,
            « 2
    ];

    Maintenant je voudrais parcourir les champs avec une boucle for et comparer leur contenu avec mon array

    Code:
    function verifierReponse (){

                    // Parcourir l’array reponse
                    for(var i = 0; i                               // La réponse correspond au contenu de l’array (correct)
                                  if(XXXXXXXXXXXX.value == reponse ){
                                                  // Mettre le champ en vert
                                                  XXXXXXXXXXXX.fillColor = color.green;
                                  }
                                  // Si la réponse est incorrect
                                  else{
                                                  // Mettre le champ en rouge
                                                  XXXXXXXXXXXX.fillColor = color.red;
                                  }
                    }
    }

    Par quoi remplacer les XXXXXXXXXXXX sans avoir à changer tous les noms des champs ?
    Peut-on parcourir les champs par leur ordre de tabulation ou d’apparition sur le document ?
    Peut-on faire en sorte que lors de la détection des champs ils soient nommés avec un numéro ?
    Merci pour votre aide.
    _seb_

Affichage de 23 réponses de 1 à 23 (sur un total de 23)
  • Auteur
    Réponses
  • #67120
    Merlin
    Maître des clés

    bebarth me détrompera peut-être mais il me semble que l’analyse des champs via JavaScript se fait toujours dans l’ordre numérique et ensuite alphabétique.

    Lister tous les champs et comparer leur valeur avec une variable je sais faire, mais pas avec une array.
    Alors je laisse le soin à quelqu’un d’autre de t’expliquer.
    :joker:

    #67121
    _seb_
    Participant

    Lister tous les champs et comparer leur valeur avec une variable je sais faire

    Quel que soit leur nom ?

    #67122
    bebarth
    Maître des clés

    bonsoir,
    Moi je mettrais la fonction en script de document, puis en script de calcul de chaque champ j’écrirais :

    Code:
    XXXXXXXXXXXX=this.getField(event.name);
    verifierReponse ();

    A vérifier !
    Je remplacerais aussi XXXXXXXXXXXX par un nom de variable moins long !  :geek:
    @+
    :bonjour:

    #67123
    bebarth
    Maître des clés

    …et pour écrire automatiquement ce script dans les 121 champs, il faut en écrire un autre.
    La complexité de ce dernier sera en fonction de la dénomination des champs à traiter !
    @+
    :bonjour:

    #67124
    _seb_
    Participant

    je mettrais la fonction en script de document, puis en script de calcul de chaque champ j’écrirais :

    Code:
    XXXXXXXXXXXX=this.getField(event.name);
    verifierReponse ();

    Bonsoir, j’ai pas tout compris. :Smiley11:  je voudrais parcourir les champs avec une boucle for et comparer leur contenu avec mon array.

    Si je fais :
    En script de calcul de chaque champ :

    Code:
    var nomChamp = event.target.name;
    verifierReponse();

    En script de document

    Code:
    function verifierReponse(){
          // Parcourir l’array reponse
          for(var i = 0; i             // La réponse correspond au contenu de l’array (correct)
                if(this.getField(nomChamp).value == tabReponse ){
                      // Mettre le champ en vert
                      this.getField(nomChamp).fillColor = color.green;
                }
                // Si la réponse est incorrect
                else{
                      // Mettre le champ en rouge
                    this.getField(nomChamp).fillColor = color.red;
                }
          }
    }

    Comment lister les champs et les comparer à mon array ?

    …et pour écrire automatiquement ce script dans les 121 champs, il faut en écrire un autre.
    La complexité de ce dernier sera en fonction de la dénomination des champs à traiter !

    @+

    Voilà mon problème, le nom des champs, ils sont nommés lors de leur détection et création par acrobat.

    #67125
    bebarth
    Maître des clés

    bonjour,
    Comme je l’avais écris, le script était « A vérifier ». Il faut écrire event.target.name, et il y avait également des erreurs dans les nom des variables.
    Dans le fichier joint j’ai créer un bouton qui écrit un script de calcul pour tous les champs « text » du document, mais on pourrait aussi limiter l’écriture du script à seulement certains…
    Le script de document a été écrit directement au bon endroit mais on aurait également pu dans le script du bouton.
    Suivant le nombre, on peut l’écrire dans tous les champs puis le retirer pour certains !
    Ou le laisser dans tous les champs et mettre des conditions dans la fonction… Il y a donc plusieurs possibilités selon ton fichier !
    N’hésite pas pour plus d’informations.
    @+
    :bonjour:

    #67126
    _seb_
    Participant

    Merci pour ton aide. :bonjour:

    j’ai regardé ton fichier et les champs passent en vert s’ils contiennent une des valeurs de l’array.

    Mon problème c’est que je souhaite que le champ passe en vert s’il contient la bonne réponse à la question.

    Je joint un fichier ça sera plus facile.

    Le nom des champs a été créé automatiquement lors de la détection.

    Dans les scripts du document :

    • dans _tabReponse, l’array avec les bonnes réponses dans l’ordre des questions.
    • la fonction verifierReponse doit vérifier que les champs contiennent la bonnes réponses, sans à avoir à changer le nom des champs sinon c’est pas drôle
    • [/list]
      Le bouton corriger lance la fonction verifierReponse

      Je voudrais ne pas à avoir à changer le nom des champs, j’en ai plus de 100 dans mon document.

      Merci

      _seb_

    #67127
    Merlin
    Maître des clés

    Je crois que tu n’as pas le choix :
    – soit il faut utiliser un script qui recense tous les noms de champs et qui les teste dans l’ordre de la liste, et donc utiliser un script qui contient le nom de tous les champs.
    – soit il faut renommer tous les champs et utiliser un script court qui peut boucler.

    La reconnaissance automatique des champs ça peut être pratique pour les formulaires basiques, mais comme ils sont nommés en dépit du bon sens, dès qu’on veut utiliser des scripts on se retrouve coincé.

    Je préfère toujours créer les champs moi-même, au final on gagne toujours du temps.
    Surtout qu’avec un peu de pratique et d’astuce ça va très vite.

    Par exemple, mes champs respectent toujours cette règle :

    01.rubrique.type

    Où :
    – 01 est le numéro de page
    – rubrique est le nom de la rubrique (identité,coordonnées, adresse1, adresse2, etc.)
    – type est le type du champ (text, bouton, case à cocher, bouton-radio, etc.)

    Ce qui donne après duplication :
    01.rubrique.type.0
    01.rubrique.type.1
    01.rubrique.type.2
    01.rubrique.type.3
    etc.

    Et c’est beaucoup plus facile à manipuler.
    Par exemple pour afficher tous les champs d’une rubrique une seule ligne suffit :

    Code:
    this.getField(« 01.rubrique »).display = display.visible;

    Dans la capture ci-dessous le numéro de page est remplacé par « master » car ce sont des champs qui apparaissent sur plusieurs pages et dont le contenu doit être répliqué, mais ça ne change pas le principe.

    #67128
    bebarth
    Maître des clés

    bonjours,
    La table donne l’ordre des réponses !!! J’avais pas compris…
    Je croyais aussi avoir compris qu’il n’y avait que des champs texte mais il y a aussi des boutons radio ! Il faut aussi vérifier d’autres types de champs ? Lesquels ?
    Y a-t-il des champs qui ne sont pas concernés ?
    Y a-t-il une seule question/réponse par ligne (une seule colonne).
    Il y a plusieurs pages a traiter sur le document ?

    Pour répondre à Merlin l’indexation des champs se fait dans l’ordre ascii des caractères, donc les chiffres, …, les lettres majuscules, …, puis des lettres minuscules !
    Il faut faut donc vérifier la positions des champs pour les reclasser !
    @+
    :bonjour:

    #67129
    bebarth
    Maître des clés

    Pour ton fichier, dans la console tu tappes :
    for (var i=0; iCe qui donne l’ordre des champs :
    0 : Capteurs
    1 : Dans le système A y atil des boutons poussoirs
    2 : Dans le système A y atil des voyants
    3 : Distributeurs
    4 : Vérins
    5 : corriger

    …et tu vois que le champ « corriger » est en dernier car il commence par une minuscule !
    @+
    :bonjour:

    #67130
    _seb_
    Participant

    Il faut aussi vérifier d’autres types de champs ? Lesquels ?

    Il peut y avoir tous les types de champs, mais si déjà c’est réalisable rien que sur les champs texte, c’est beaucoup.

    Y a-t-il des champs qui ne sont pas concernés ?

    Oui, il y aura au moins un champ pour le nom de la personne et un champ pour sa note.

    Y a-t-il une seule question/réponse par ligne (une seule colonne).

    Non pour l’instant, mais je peux faire mes futurs formulaires avec une seul colonne.

    Il y a plusieurs pages a traiter sur le document ?

    Oui, ça sera le cas quasiment à chaque fois.

    Pour ton fichier, dans la console tu tappes :
    for (var i=0; i

    J’ai rempli le formulaire, j’ai lancé :

    Code:
    for (var i=0; i

    Du coup j’obtiens :

    0 : Capteurs : 2
    1 : Dans le système A y atil des boutons poussoirs : Oui
    2 : Dans le système A y atil des voyants : Non
    3 : Distributeurs : 3
    4 : Vérins : 5
    5 : corriger :

    Donc maintenant j’ai le nom du champ avec la bonne réponse.

    Comment faire pour stocker dans deux array les résultats, un array pour le nom des champs et un array pour les réponses ?

    Merci.

    _seb_

    #67131
    bebarth
    Maître des clés

    Comme tu veux faire ici, tu n’aurais pas à faire 2 tables, une seule suffirait avec l’indice du champ.
    Je pense que constituer une table avec 120 éléments dans le désordre doit être fastidieux et source d’erreurs !
    N’as-tu pas penser à faire une copie remplie avec les bonne réponse qui serait ton fichier de contrôle, puis avec un script on vient comparer tous les champs du formulaire de l’élève.
    Une remarque, dans le script tu vérifies si la réponse est bonne, mais tu n’indiques pas la bonne réponse (si elle est fausse).
    Qu’en penses-tu car vérifier à partir d’une table ou d’un fichier correct n’est pas du tous le même script !
    @+
    :bonjour:

    #67132
    Merlin
    Maître des clés

    Je pense que constituer une table avec 120 éléments dans le désordre doit être fastidieux et source d’erreurs !

    Fastoche !
    Il faut remplir le formulaire avec les bonnes réponses et utiliser le script qui liste tous les champs avec leur valeur.
    0 : Capteurs : 2
    1 : Dans le système A y atil des boutons poussoirs : Oui
    2 : Dans le système A y atil des voyants : Non
    Etc.

    Ensuite copier-coller dans un traitement de texte, deux ou trois rechercher-remplacer et le tour est joué.
    :Smiley15:

    #67133
    _seb_
    Participant

    Bonsoir,
    voilà ce que j’ai prévu :

    • Création du support de formulaire avec Word
    • Création du formulaire avec Acrobat DC -> détection et création des champs
    • Remplissage du formulaire avec les bonnes réponses
    • Lancement du script pour récupérer les bonnes réponses dans l’ordre ascii des caractères des noms des champs
    • [/list]

      for (var i=0; i

    • Récupération des bonnes réponses dans la console :
    • [/list]« 5 »,
      « Non »,
      « Oui »,
      « 0 »,
      « 2 »,

    • Création de l’array reponse (enlever la dernière virgule)
    • [/list]

      Code:
      var reponse =
      [
          « 5 »,
          « Oui »,
          « Non »,
          « 0 »,
          « 2 »
      ];

    • En action pour mon bouton corriger, la fonction verifierReponse qui vérifie les réponses dans l’ordre ascii des caractères des noms des champs
    • [/list]

      Code:
      function verifierReponse() {
        var tabNomChamp = [];

        for (var i = 0; i     tabNomChamp.push(this.getNthFieldName(i));
        }

        for (var i = 0; i     // La réponse correspond au contenu de l’array (correct)
          if (this.getField(tabNomChamp).value == reponse) {
            // Mettre le champ en vert
            this.getField(tabNomChamp).fillColor = color.green;
          } else {
            // Si la réponse est incorrect
            // Mettre le champ en rouge
            this.getField(tabNomChamp).fillColor = color.red;
          }
        }
      }

      Qu’en pensez-vous ?

      Code:
      faire une copie remplie avec les bonnes réponses qui serait ton fichier de contrôle, puis avec un script on vient comparer tous les champs du formulaire de l’élève.

      TRÈS intéressé, on peut ouvrir 2 fichiers, dans 2 onglets différents et les comparer ?

      _seb_

    #67134
    bebarth
    Maître des clés

    bonjour,
    Je pense que c’est encore une solution semi-automatique !
    Il y a encore pas mal de chose à faire manuellement.
    Dans ta solution il n’y a pas besoin de créer une table avec les noms des champs.

    Code:
    this.getField(tabNomChamp) c’est la même chose que this.getField(this.getNthFieldName(i))

    Pour moi, la seule solution complètement automatisé est la comparaison de fichiers.
    J’essaye de te pososer quelque chose ce week-end.
    Je suppose que tu as plusieurs élèves à traiter.
    Tu mettras tous les formulaires à traiter dans un répertoire qui sera traité par lot et tous les formulaires corrigés seront dans un autre répertoire.
    @+
    :bonjour:

    #67135
    bebarth
    Maître des clés

    J’avoue, je me suis un peu laissé aller…
    Tu dézippes le fichier, puis tu installes l’action « Correction.sequ ».
    Tous les fichier à corriger sont dans le répertoire « Formulaires a traiter ».
    Tu peux lancer l’action fichier par fichier soit en indiquant Formulaires a traiter.
    Tous les fichiers corrigés se trouvent dans le répertoire « Formulaires corriges ».
    Il y a quelques explications dans le script.
    @+
    :bonjour:

    #67136
    bebarth
    Maître des clés

    Oups !
    J’ai oublié de changer les noms dans les formulaires 3 et 4…  :geek:
    @+
    :bonjour:

    #67137
    _seb_
    Participant

    Bravo :bravo: , merci beaucoup pour ce boulot, hallucinant. :PouceHaut:

    Je vais essayer de comprendre le code :Euuuh: , je risque de prendre pas mal de temps.  :Smiley08: 

    Je découvre addWatermarkFromText, je m’en resservirai.

    Merci encore.

    _seb_

    #67138
    bebarth
    Maître des clés

    J’ai essayé d’expliquer un peu le script.
    N’hésite pas à demander pendant que c’est encore frais dans ma tête…
    @+
    :bonjour:

    #67139
    _seb_
    Participant

    Bonsoir,

    je sèche sur ces lignes dans la partie Affichage des corrigés :

    Code:
          for(var j in g){
            try{
                if(typeof g[j] != « function » && j != « name » && j != « type » && j != « page » && j != « rect »){
                  h[j] = g[j];
                  h.fillColor = color.yellow;
                }
            }catch(e){}
          }

    Merci

    _seb_

    #67140
    Merlin
    Maître des clés

    Chapeau bebarth !
    :bravo:

    #67141
    bebarth
    Maître des clés

    bonjour,

    je sèche sur ces lignes dans la partie Affichage des corrigés :

    Code:
          for(var j in g){
            try{
                if(typeof g[j] != « function » && j != « name » && j != « type » && j != « page » && j != « rect »){
                  h[j] = g[j];
                  h.fillColor = color.yellow;
                }
            }catch(e){}
          }

    Ici, g est le champ comparé et h est le nouveau champ que l’on a créé avec les propriété « name », « type », « page » et « rect ».j représente chaque élément du champ.
    Si avec ton fichier original, tu lances de la console :

    Code:
    g=this.getField(« corriger »);
    for (var j in g) {
        try {
            console.println(j+ »OK est : « +g[j]);
        } catch(e) {}
    }

    Tu vas voir affiché tous les éléments du champ « corriger », et tu t’aperçois qu’il y a des fonctions et des propriétés.
    Donc :
    for (var j in g) -> pour chaque élément du champ g
    if (typeof g[j]!= »function » && j!= »name » && j!= »type » && j!= »page » && j!= »rect ») -> si le type de l’élément n’est pas une fonction et que la propriété n’est pas le nom, ni le type, ni la page, ni les coordonnées
    h[j]=g[j] -> l’élément udu champ h = celle du champ g
    h.fillColor=color.yellow; -> on met le fond du champ jaune
    try et catch(e) -> on essaye et ça ne plante pas s’il y a une erreur car on ne peut apparemment pas tout lire.
    Voilà, j’espère que c’est un peu plus compréhensible….
    @+
    :bonjour:

    #67142
    _seb_
    Participant

    Ok merci, je comprends un peu mieux. Dans quel cas est-ce important de faire cette vérification ?

    Je suis en train de modifier le code pour qu’il s’adapte à l’arborescence de mon disque dur. Je risque d’avoir besoin de toi.  :Smiley08:

  • Affichage de 23 réponses de 1 à 23 (sur un total de 23)
    • Vous devez être connecté pour répondre à ce sujet.