Donnez vie à vos documents numériques !
 

Recréer des champs correctement nommés après détection automatique

abracadabraPDF Forums PDF – Général Recréer des champs correctement nommés après détection automatique

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

    Salut à tous,

    j’ai essayé de trouver une solution pour ne plus à avoir a renommer un par un les champs après la reconnaissance automatique par acrobat.

    J’ai créé un script (il ne traite pour l’instant que les champs text et checkbox) qui va stocker dans un array le nom, le type, la page et les coordonnées de chaque champ page par page.

    L’array est trié en fonction des coordonnées des champs : du plus haut au plus bas et de gauche à droite.

    Ensuite dans l’ordre de l’array trié, il va recréer des champs “par dessus”, du même type, au même endroit mais en les nommant avec le numéro de la page, un nom, le type et un numéro.

    Le nom sera celui du champ d’origine mais sans accent, sans espace et la première lettre de chaque mot commence par une majuscule sauf la première lettre du premier mot qui commence par une lettre minuscule.(Lower Camel Case).

    Ensuite pour finir le travail, il faut cliquer sur trier les champs par ordre alphabétiques dans acrobat et supprimer tous champs du bas qui commence par une lettre.

    En pièce jointe un exemple.

    Voilà le script, il a besoin d’une bonne amélioration :

    Code:
    // regex contient àçéèêîïùô ,.;?!:’
    var regex =
    {
    a: /[u00e0]/gi,
    c: /[u00e7]/gi,
    e: /[u00e9u00e8u00ea]/gi,
    i: /[u00eeu00ef]/gi,
    u: /[u00fb]/gi,
    o: /[u00f4]/gi,
    “”: /[su003Fu0021u003Au002Eu002Cu0027u003B]/g
    };

    // Pour chaque page du document
    for(p = 0; p // Tableau des champs avec leur nom, type, numéro de page et coordonnées
    var tabChamp = new Array();

    // Compteur de champ (Pour éviter une ligne vide dans l’array tabChamp si le champ N°0 est un bouton)
    var numChamp = 0;

    for(var i = 0; i var nomChamp = this.getNthFieldName(i);

    var f = this.getField(nomChamp);

    var typeChamp = f.type;

    var pageChamp = f.page

    if(f.page == p && (f.type == “text” || f.type == “checkbox”)){
    // console.println(“Ligne N°” + i);
    // Créer un array de 7 éléments par champ
    tabChamp[numChamp] = new Array(7);
    // Le nom
    tabChamp[numChamp][0] = f.name;
    // Le type
    tabChamp[numChamp][1] = f.type;
    // La page
    tabChamp[numChamp][2] = f.page;
    var coordChamp = f.rect;
    // Coordonées sur x
    tabChamp[numChamp][3] = coordChamp[0];
    // Coordonées sur y
    tabChamp[numChamp][4] = coordChamp[1];
    // Coordonées sur x + longueur
    tabChamp[numChamp][5] = coordChamp[2];
    // Coordonées sur y + hauteur
    tabChamp[numChamp][6] = coordChamp[3];

    numChamp++;
    }
    }

    // console.println(“Avant triage : ” + tabChamp + “n”);

    // Trier l’array en fonction de la hauteur des champs et de leur position sur x
    tabChamp.sort(function(a, b){
    // S’ils sont à la même hauteur
    if (a[4] == b[4]){
    // Les trier par rapport à leur position sur x du plus prés du bord gauche de la feuille au plus éloigné
    return a[3] – b[3];
    }
    // Trier du plus haut au plus bas
    return b[4] – a[4];
    });

    // console.println(“Après triage : ” + tabChamp + “n”);

    // console.println(“Longueur tableau ” + tabChamp.length + “n”);

    // console.println(tabChamp[0][0] + “n”);
    // console.println(tabChamp[0][1] + “n”);
    // console.println(tabChamp[0][2] + “n”);
    // console.println(tabChamp[0][3] + “n”);
    // console.println(tabChamp[0][4] + “n”);
    // console.println(tabChamp[0][5] + “n”);
    // console.println(tabChamp[0][6] + “n”);

    // Compteur de champ text et champ checkbox
    var nbText = 0;
    var nbCheckbox = 0;
    // Pour tous les champs
    for (i = 0; i // Retirer les apostrophes du nom
    tabChamp[0] = tabChamp[0].replace(“‘”, ” “);
    // Séparer tous les mots du nom du champ
    motDuChamp = tabChamp[0].split(” “);
    // Créer array pour stocker chaque mot du nom du champs
    var mot = new Array();
    // Mettre le premier mot du nom du champ dans l’array en minuscule
    mot.push(motDuChamp[0].toLowerCase());
    var k = 1;
    // Pour tous les autres mots du nom du champ
    for(var j = 0; j // Si le mot est défini
    if(motDuChamp[k] != undefined){
    // Mettre la première lettre en majuscule et le reste en minuscule
    motM = motDuChamp[k].charAt(0).toUpperCase() + motDuChamp[k].substring(1).toLowerCase();
    // Mettre le mot dans l’array nom
    mot.push(motM);
    }
    k++;
    }
    // Joindre tous les mots
    nomConstitue = mot.join(“”);
    // Retirer tous les accents et caractères spéciaux du regex
    for(var r in regex) nomConstitue = nomConstitue.replace(regex[r], r);

    // Numéro suivant le type de champ
    if(tabChamp[1] == “text”){
    var numChamp = nbText;
    }else if(tabChamp[1] == “checkbox”){
    var numChamp = nbCheckbox;
    }

    // Le nouveau nom du champ = numPage.nomChamp.typeChamp.numChamp
    var nouveauNom = tabChamp[2] + “.” + nomConstitue + “.” + tabChamp[1] + “.” + numChamp;

    // console.println(“nouveauNom : ” + nouveauNom);
    // console.println(“type : ” + tabChamp[1]);
    // console.println(“numPage : ” + tabChamp[2]);

    // Créer les champs
    this.addField
    (
    nouveauNom,
    tabChamp[1],
    tabChamp[2],
    [
    tabChamp[3],
    tabChamp[4],
    tabChamp[5],
    tabChamp[6]
    ]
    );

    // Incrémenter le numéro des champs suivants en fonction du type
    if(tabChamp[1] == “text”){
    nbText++;
    }else if(tabChamp[1] == “checkbox”){
    nbCheckbox++;
    }
    }
    }

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

    bonjour,
    Dans le principe c’est ce qu’il faut faire !
    Après une première lecture, j’ai quelques remarques à te faire :

    • Ton script ne fonctionne pas si le champ comporte des “widgets” (différents éléments) comme les boutons radio par exemple. Il faut tester f.page ! Si c’est une valeur cela signifie qu’il n’y a qu’un seul élément, si c’est une table, la longueur de cette table donne le nombre d’éléments.
      https://help.adobe.com/en_US/acrobat/acrobat_dc_sdk/2015/HTMLHelp/index.html#t=Acro12_MasterBook%2FJS_API_AcroJS%2FField_versus_widget_attributes.htm
    • Ligne 66 : Trier l’array en fonction de la hauteur des champs et de leur position sur x -> Le script est OK, mais est-ce vraiment utile ? (c’est un plus).
    • Ensuite pour finir le travail, il faut cliquer sur trier les champs par ordre alphabétiques dans acrobat et supprimer tous champs du bas qui commence par une lettre.
      -> Ça peut se faire automatiquement avec “removeField” et le nom original du champ
    • [/list]Je vais regarder ça dans la journée… en rassemblant différents scripts que j’ai déjà écrits.
      @+
      :bonjour:

    #67219
    _seb_
    Participant

    Salut bebarth,

    Ligne 66 : Trier l’array en fonction de la hauteur des champs et de leur position sur x -> Le script est OK, mais est-ce vraiment utile ? (c’est un plus).

    C’est une préférence perso, une numérotation sur la largeur plutôt qu’en hauteur, comme on complète généralement un document du haut vers le bas.

    Ensuite pour finir le travail, il faut cliquer sur trier les champs par ordre alphabétiques dans acrobat et supprimer tous champs du bas qui commence par une lettre.
    Ça peut se faire automatiquement avec “removeField” et le nom original du champ

    Je ne connaissais pas. Merci  :bonjour: :PouceHaut:

    #67220
    Merlin
    Maître des clés

    Je persiste à croire que la création manuelle associée à une bonne utilisation des fonctions de duplication et de nommage d’Acrobat est plus rapide, et en tout cas plus facile.
    D’autant que ce n’est que le premier formulaire qui coûte, à partir du deuxième c’est surtout du copier-coller.
    :geek:

    #67221
    _seb_
    Participant

    Bonjour Merlin,

    Comment t’y prends-tu pour créer tes formulaires, avec quel logiciel ?
    Si j’ai bien compris, tu n’utilises pas du tout la détection de champ de formulaire.
    Pour la duplication, comment fais-tu ? Quand tu crées ton premier champ les duplications porteront le même nom avec un chiffre. Tu renommes tous les champs un par un ?

    J’utilise Word pour créer le support, texte et tableaux, lignes, cercles, carrés pour faciliter la détection des champs de formulaire.
    Ensuite je créé le formulaire en laissant Acrobat détecter les champs, puis je renomme un par un.
    Je n’arrive pas à faire des documents propres en faisant moi même les champs. Ce n’est jamais bien aligné. Je passe beaucoup trop de temps à essayer d’aligner les champs avec le texte. J’ai hâte qu’Acrobat sache faire ça, à la manière de Writer.

    _seb_

    #67222
    bebarth
    Maître des clés

    bonjour,
    Je laisserai Merlin te répondre plus précisément, mais je voudrais te soumettre déjà 3 liens utiles :
    https://www.abracadabrapdf.net/ressources-et-tutos/js-et-formulaires-ressources/duplication-rapide-de-champs-de-formulaire/
    https://www.abracadabrapdf.net/ressources-et-tutos/js-et-formulaires-ressources/dupliquer-des-champs-sur-plusieurs-pages/
    https://www.abracadabrapdf.net/ressources-et-tutos/js-et-formulaires-ressources/dupliquer-dynamiquement-des-pages-dans-un-pdf/
    Sinon, avec la combinaison de touches “cmd alt” (sur Mac, donc je suppose “ctrl alt” sur PC) tu peux dupliquer aisément un champ ! Le copier/coller fonctionne également.
    L’application Acrobat offre aussi pas mal de possibilités pour avoir des champs alignés, répartis ou centrés…
    J’en profite pour partager une action qui renomme un champ, que j’avais écrite pour un ancien post (que je n’ai pas retrouvé). Je l’ai juste mis dans une belle boite de dialogue !
    @+
    :bonjour:

    #67223
    Merlin
    Maître des clés

    Comment t’y prends-tu pour créer tes formulaires, avec quel logiciel ?

    Je t’ai déjà expliqué pourquoi je n’ai pas besoin de les renommer, dans le neuvième message de ce sujet : https://abracadabrapdf.net/forum/index.php/topic,3895.0.html
    :Smiley15:

    Je laisserai Merlin te répondre plus précisément, mais je voudrais te soumettre déjà 3 liens utiles :
    https://www.abracadabrapdf.net/ressources-et-tutos/js-et-formulaires-ressources/duplication-rapide-de-champs-de-formulaire/
    https://www.abracadabrapdf.net/ressources-et-tutos/js-et-formulaires-ressources/dupliquer-des-champs-sur-plusieurs-pages/
    https://www.abracadabrapdf.net/ressources-et-tutos/js-et-formulaires-ressources/dupliquer-dynamiquement-des-pages-dans-un-pdf/

    Je n’ai pas mieux !

    #67224
    Merlin
    Maître des clés

    Je crée rarement des formulaires, en général je dois faire avec ce qu’on me donne.
    Voici typiquement un formulaire à interactiver dans lequel la reconnaissance automatique des champs de formulaire fonctionne très mal et me ferait surtout perdre du temps : seules les cases à cocher sont correctement reconnues, le reste c’est n’importe quoi.
    Alors que des champs Non, Prénom, Adresse, etc. j’en ai déjà plein qui sont tout prêts, dans un document indispensable que j’ai créé et appelé “La banque du champ”.
    :geek:

    #67225
    _seb_
    Participant

    Bonjour, merci pour vos réponses. :bonjour:

    je suppose “ctrl alt” sur PC tu peux dupliquer aisément un champ !

    Oui c’est bien cette combinaison sur PC.

    L’application Acrobat offre aussi pas mal de possibilités pour avoir des champs alignés, répartis ou centrés…

    L’agencement des champs de formulaire entre eux ne me pose pas trop de problèmes. Acrobat c’est bien amélioré avec ALIGNER, CENTRER, CORRES. TAILLE et DISTRIBUER.
    Là où je trouve que c’est fastidieux, long et répétitif et c’est quand on doit les agencer par rapport à du texte. Ce qui me dérange beaucoup c’est qu’il n’y est pas d’accroche entre le texte et le champ.
    Par exemple quand j’utilise « Créer plusieurs copies… », comme les espacements entre les lignes de texte ne sont pas forcement uniformes, il faut déplacer manuellement les champs. Les remonter un peu, les descendre un peu les décaler un peu, les renommer par rubrique……….

    Je crée rarement des formulaires, en général je dois faire avec ce qu’on me donne.

    Ah ok, je comprends, tu dois « interactiver » des documents existants. Effectivement si la personne n’a pas tenu compte de la détection automatique elle doit être hasardeuse suivant l’agencement. :mur:

    Je pars d’une page blanche du coup, je peux me préparer un formulaire qui permettra une bonne détection des champs.
    J’ai changé mon gabarit de document depuis notre conversation. Maintenant, la détection automatique est nickel.
    J’utilise Word avec des tableaux sans bordure pour le texte et avec bordure pour les champs.
    Du coup, je peux facilement espacer les lignes de texte et les uniformiser, puis centrer horizontalement et verticalement mon texte. Le champ est détecté juste en face. Plus besoin de duplication.
    Un exemple en pièce jointe. Ça peut peut-être intéresser du monde.

    “La banque du champ”.

    On doit avoir la même, enfin à quelque chose près. :Smiley03:

    Merci encore.
    _seb_

    #67226
    Merlin
    Maître des clés

    donc je suppose “ctrl alt” sur PC

    Presque, en fait c’est “alt gr”
    :Smiley03:

    #67227
    Merlin
    Maître des clés

    Acrobat c’est bien amélioré avec ALIGNER, CENTRER, CORRES. TAILLE et DISTRIBUER.

    C’est vrai que ça date d’Acrobat 6 soit à peine 20 ans !
    :Smiley08:

    Par exemple quand j’utilise « Créer plusieurs copies… », comme les espacements entre les lignes de texte ne sont pas forcement uniformes, il faut déplacer manuellement les champs. Les remonter un peu, les descendre un peu les décaler un peu, les renommer par rubrique

    Moi je peste contre les graphistes qui les ont fait, mais si c’est toi qui fait le formulaire et que les espacements ne sont pas réguliers il ne faut t’en prendre qu’à toi-même.
    :Smiley03:

    Mais je trouve que dans l’ensemble ton formulaire va bien, démonstration :

    #67228
    _seb_
    Participant

    Presque, en fait c’est “alt gr”

    J’ai remarqué que ça fonctionne également avec la touche Ctrl toute seule.

    Moi je peste contre les graphistes qui les ont fait,

    J’imagine trop bien  :Smiley08:

    mais si c’est toi qui fait le formulaire et que les espacements ne sont pas réguliers il ne faut t’en prendre qu’à toi-même.

    Oui mais ça, c’était avant  :Smiley08: , maintenant je sais faire.

    Mais je trouve que dans l’ensemble ton formulaire va bien, démonstration :

    Ah ben celui-là, j’espère bien, je l’ai conçu en me soucient tout particulièrement de la mise en place des champs, tout est bien aligné et les espacements sont identiques, si on utilise la détection automatique, les 118 champs sont tous détectés, il n’y en a pas un de plus.

    #67229
    Merlin
    Maître des clés

    J’ai remarqué que ça fonctionne également avec la touche Ctrl toute seul

    Je le note !
    Parce-qu’avec alt-gr il faut traverser le clavier et ce n’est pas pratique.

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