Donnez vie à vos documents numériques !
 

Centrage automatique d’un champ

abracadabraPDF Forums PDF – Général Centrage automatique d’un champ

Étiqueté : 

  • Créateur
    Sujet
  • #74326
    michel c.
    Participant

    Bonjour, je voudrais savoir s’il serait possible de créer une commande permettant de centrer automatiquement un champ en fonction de la largeur de la page.

    L’idée serait de cliquer sur un bouton, une boite de dialogue demanderait de saisir le nom du champ (ça je pense savoir faire faire)

    Ensuite le script “récupèrerait” la largeur de la page (L) , la largeur du champ (LC) et positionnerait le champ au centre de la page

    (L-LC)/2

    C’est cette partie qui me pose problème.

    Merci

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

    bonjour,
    C’est possible, mais pour ma part la réponse sera lundi…
    On pourra même faire un menu déroulant avec la liste de tous les champs !

    @+
    😎

    #74329
    bebarth
    Maître des clés

    bonjour,
    Voici le script pour centrer un champ horizontalement en milieu de page.

    nbChamps=this.numFields;
    if (nbChamps) {
    var leChamp="- Liste des champs -";
    var listeChamps="var listeChamps \= \{\""+leChamp+"\": "+(nbChamps+1)+",";
    for (var i=0; i < nbChamps; i++) {
    var nomChamp=this.getNthFieldName(i);
    if (typeof this.getField(nomChamp).page!="object") {
    listeChamps+="\""+nomChamp+"\": "+(-1*(i+1)).toString()+",";
    } else {
    for (var j=0; j<this.getField(nomChamp).page.length; j++) listeChamps+="\""+nomChamp+"."+j+"\": "+(-1*(i+1)).toString()+",";
    }
    }
    var listeChamps=listeChamps.substring(0, listeChamps.length-1);
    listeChamps+="\}";
    eval(listeChamps);
    var bDialogue={
    initialize: function(bDialogue) {
    this.loadDefaults(bDialogue);
    },
    loadDefaults: function(bDialogue) {
    bDialogue.load({
    LCha: listeChamps,
    })
    },
    validate: app.trustedFunction(function(bDialogue) {
    app.beginPriv();
    var oRslt=bDialogue.store();
    var elements=bDialogue.store()["LCha"];
    var testOK=true;
    for (var i in elements) {
    if (elements>0) {
    valeurListe=listeChamps;
    nomListe=i;
    }
    }
    if (valeurListe>0 && (oRslt["nmCh"]=="" || (/^\s+|\s+$/gm).test(oRslt["nmCh"]))) {
    var txt="Veuillez sélectionner ou indiquer un nom de champ.";
    var testOK=false;
    } else {
    if (valeurListe>0) nmChamp=oRslt["nmCh"];
    else nmChamp=nomListe;
    try {
    laPage=getField(nmChamp).page;
    } catch(e) {
    var txt="Le champ \""+nmChamp+"\" n'existe pas.";
    var testOK=false;
    }
    }
    if (!testOK) app.alert(txt,3);
    return testOK;
    app.endPriv();
    }),
    description: {
    name: "Centrer un champ",
    elements: [
    {
    type: "view",
    elements: [
    {
    type: "view",
    alignment: "align_fill",
    elements: [
    {
    type: "static_text",
    name: "Nom du champ",
    font: "dialog",
    bold: true,
    },
    {
    type: "static_text",
    name: "Sélectionnez...",
    },
    {
    type: "popup",
    item_id: "LCha",
    width: 150,
    alignment: "align_fill",
    },
    {
    type: "static_text",
    name: "ou indiquez son nom :",
    },
    {
    type: "edit_text",
    item_id: "nmCh",
    height: 20,
    alignment: "align_fill",
    },
    ]
    },
    {
    type: "gap",
    height: 5
    },
    {
    type: "ok_cancel",
    },
    ]
    },
    ]
    }
    };
    if("ok"==app.execDialog(bDialogue)){
    var aRect=this.getField(nmChamp).rect;
    aRect[0]=(this.getPageBox()[2]/2)-(aRect[2]/2);
    aRect[2]=(this.getPageBox()[2]/2)+(aRect[2]/2);
    this.getField(nmChamp).rect=aRect;
    }
    } else app.alert("Il n'y a pas de champ dans ce document.",3);

    @+
    😎

    #74330
    michel c.
    Participant

    Bonjour, je viens de tester et j’ai eu 2 erreurs :

    Field:Mouse Up:36: ReferenceError: valeurListe is not defined

    Pour celle-ci j’ai modifié la ligne 32 : valeurListe=listeChamps;

    Que j’ai transformée comme ceci : var valeurListe=listeChamps;

    L’autre erreur : Field:Mouse Up:41: ReferenceError: nomListe is not defined

    Pour celle-ci j’ai modifié la ligne 33 : nomListe=i;    comme ceci : var nomListe=i;

    Et maintenant je n’ai plus d’erreur à la console mais la boite de dialogue m’envoie le message : le champ "undefined" n'existe pas

    Enfin ça marche si je donne au champ que je veux centrer le nom “undefined” ….

    Je cherche…

    • Cette réponse a été modifiée le il y a 2 semaines et 2 jours par michel c..
    Attachments:
    You must be logged in to view attached files.
    #74333
    michel c.
    Participant

    J’ai réussi en modifiant la ligne 41 : else nmChamp=nomListe;

    J’ai mis ceci à la place : else nmChamp=i;

    Là le script fonctionne, mais mal :

    S’il y a plusieurs champs, lors de la 2ème, 3ème… demande de centrage, ce sera toujours le champ de la 1ère demande de centrage (1ère exécution du script) qui sera effectuée.

    De plus, la largeur du champ se trouve modifiée pendant l’opération.

     

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

    C’est étrange !!!
    En fait, la façon de déclarer les variables définie le “niveau de portée” des variables.

    • Une variable déclarée par “var” (var x=”toto”) à une portée limitée à l’environnement ou est déclarée cette variable : une fenêtre de document, une boite de dialogue,…
    • Si il n’y a rien pour la déclarer (x=”toto”), sa portée est limitée à toutes les fenêtres ou boites de dialogue utilisées lors de l’exécution du script.
    • Si elle est déclarée de façon globale (global.x=”toto”), sa portée est l’environnement total d’Acrobat. On peut fermer un fichier et en ouvrir un autre, la variable n’est pas perdue tant qu’on ne quitte pas Acrobat.

    C’est pour cela que dans cet exemple, les variables qui seront utilisées lorsque la boite de dialogue est fermée doivent être déclarée sans “var”. D’où “le champ “undefined” n’existe pas”.

    Dans le script que j’ai écris, je ne pensais pas l’utiliser depuis un bouton. Je l’ai testé directement depuis la console et il fonctionne bien. Par contre, depuis un bouton il faut retirer les privilèges et trustedFunction qui ne fonctionnent pas à ce niveau.
    J’ai également modifié légèrement les lignes pour le repositionnement du champ qui ne fonctionnait pas bien avec ton document (pourquoi ???).

    Ci-joint un nouveau fichier qui fonctionne chez moi. Dis-moi si c’est OK pour toi.

    @+
    😎

    • Cette réponse a été modifiée le il y a 2 semaines et 2 jours par bebarth.
    Attachments:
    You must be logged in to view attached files.
    #74338
    Merlin
    Maître des clés

    Moi qui utilise une méthode rustique depuis des années pour centrer mes champs je vais m’empresser d’enregistrer ça en Action ou en outil rapide.

    Merci bebarth !

    #74339
    michel c.
    Participant

    Bonjour, ça marche parfaitement ! Merci

     

    #74340
    bebarth
    Maître des clés

    J’ai fait ça de tête pour l’explication de la déclaration des variables… C’est même un peu plus complexe mais il faudrait que je reprenne mes notes pour expliquer plus en détail ! Par contre je ne sais pas si ce qu’est valable pour Acrobat l’est également pour ton logiciel. J’espère que oui !

    @+
    😎

    #74341
    michel c.
    Participant

    Oui, tout fonctionne super bien .

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