abracadabraPDF › Forums › PDF – Général › Centrage automatique d’un champ
Étiqueté : i
- Ce sujet contient 9 réponses, 3 participants et a été mis à jour pour la dernière fois par
michel c., le il y a 10 mois et 2 semaines.
- CréateurSujet
- 1 juin 2024 à 17:07 #74326
michel c.
ParticipantBonjour, 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
- CréateurSujet
- AuteurRéponses
- 1 juin 2024 à 19:08 #74327
bebarth
Maître des clésbonjour,
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 !@+
😎3 juin 2024 à 18:25 #74329bebarth
Maître des clésbonjour,
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);
@+
😎3 juin 2024 à 21:23 #74330michel c.
ParticipantBonjour, 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 10 mois et 2 semaines par
michel c..
Attachments:
You must be logged in to view attached files.3 juin 2024 à 22:13 #74333michel c.
ParticipantJ’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.3 juin 2024 à 22:46 #74335bebarth
Maître des clésC’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 10 mois et 2 semaines par
bebarth.
Attachments:
You must be logged in to view attached files.4 juin 2024 à 12:42 #74338Merlin
Maître des clésMoi 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 !
4 juin 2024 à 13:43 #74339michel c.
ParticipantBonjour, ça marche parfaitement ! Merci
4 juin 2024 à 17:01 #74340bebarth
Maître des clésJ’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 !
@+
😎4 juin 2024 à 20:32 #74341michel c.
ParticipantOui, tout fonctionne super bien .
- Cette réponse a été modifiée le il y a 10 mois et 2 semaines par
- AuteurRéponses
- Vous devez être connecté pour répondre à ce sujet.