abracadabraPDF › Forums › PDF – Général › Propriété d’un champ
- Ce sujet contient 56 réponses, 3 participants et a été mis à jour pour la dernière fois par
bebarth, le il y a 5 mois et 3 semaines.
-
CréateurSujet
-
29 janvier 2024 à 13:30 #73837
michel c.
ParticipantBonjour, est il possible de conditionner certaines propriétés d’un champ texte (multiligne et hauteur) au nombre de lignes du texte saisi?
Et si oui, comment faire.
Merci
-
CréateurSujet
-
AuteurRéponses
-
29 janvier 2024 à 15:03 #73838
Merlin
Maître des clésBonjour,
la réponse courte est non, mais on peut facilement faire l’inverse en utilisant le corps de texte automatique : c’est le texte qui s’ajuste au champ.
La réponse longue est oui, il faut compter le nombre de caractères saisis en temps réel et aussi ceux qui sont supprimés. Ça requiert donc une usine à gaz en JavaScript assez longue à développer et ça impose d’utiliser une police à chasse fixe (Courier), et dont le corps ne doit pas varier.
Mais comme le script ne peut servir qu’à étendre/réduire les dimensions du champ ça n’a qu’un intérêt très limité dans un document PDF, dont la dimension des pages est forcément fixe, puisqu’il faut de toute façon prévoir de la place libre pour agrandir le champ et prévoir comment ce sera le moins moche possible en cas de réduction.
Par opposition aux pages à redimensionnement dynamique, comme en HTML.29 janvier 2024 à 16:34 #73839michel c.
ParticipantMerci, je cherche une autre solution.
31 janvier 2024 à 19:24 #73842bebarth
Maître des clésbonjour,
J’avais écris un script il y a déjà quelques temps qui comptait le nombre de lignes d’un champ même si elles n’apparaissaient pas toutes :Compter des lignes dans un champ multignes sans caractères de retour à la ligne
Je m’en suis donc inspiré pour l’adapter et pouvoir redimensionner le champ.
La réponse longue est oui, il faut compter le nombre de caractères saisis en temps réel et aussi ceux qui sont supprimés. Ça requiert donc une usine à gaz en JavaScript assez longue à développer et ça impose d’utiliser une police à chasse fixe (Courier), et dont le corps ne doit pas varier.
C’est effectivement une usine à gaz, mais de cette manière mais la police n’a pas besoin d’une chasse fixe !
Et voici le script à exécuter depuis la console ou en action (également en pièce jointe dans le fichier) :
console.show();
console.clear();
// Variables
var p=this.numPages;
var g=this.getField("champTexte");
var gRect=g.rect;
var hautChamp=gRect[1];
var basChamp=gRect[3];
var paragraphes=g.value.split("\r");
var nbParagraphes=paragraphes.length;
var toutLeTexte=g.value;
var nbCaracteres=toutLeTexte.length;
var texteEntier=g.value;
var nbLignesTexte=0;
var nbLignes=0;
var deltaLignes=0;
var aRect=this.getPageBox("Crop");
var laPage=0;
// Fonction
function calculMots(lesMots) {
var lesMots=lesMots.replace(/[\'\-\’]/g, " ");
var lesMots=lesMots.replace(/[\"\”\*\_\,\.\;\:\!\?\(\)\{\}\[\]\«\»]/g, "");
var lesMots=lesMots.replace(/\s+/g, " ");
var lesMots=lesMots.replace(/^\s+|\s+$/g, "");
var lesMots=lesMots.replace(/\s+/g, " ");
var enTable=lesMots.split(" ");
motsParagraphe.push(enTable.length);
}
var motsParagraphe=[];
for (var i=0; i<nbParagraphes; i++) calculMots(paragraphes);
if (paragraphes[0].length) {
// Boucle si texte débordant de la page
while (toutLeTexte.length) {
// Nouvelle page
this.newPage(p, aRect[2], aRect[1]);
var basMot=hautChamp;
// Copie du champ
var f=this.addField("autreChamp", "text", p, g.rect);
for (var j in g) {
try {
if (typeof g[j]!="function" && j!="name" && j!="type" && j!="page" && j!="rect") f[j]=g[j];
} catch(e) {}
}
f.value=toutLeTexte;
// Aplatissement
this.flattenPages(p);
// Nombre de mots
var nbMots=this.getPageNumWords(p);
for (var i=0; i<nbMots; i++) {
var leMot=this.getPageNthWord(p, i, true);
var q=this.getPageNthWordQuads(p, i);
m=(new Matrix2D).fromRotated(this,p);
mInv=m.invert();
r=mInv.transform(q);
r=r.toString();
r=r.split(",");
if (Number(r[5])>basChamp) {
if (Number(r[5])<basMot) {
var basMot=Number(r[5]);
if (!laPage) nbLignesTexte++;
nbLignes++;
}
if (!laPage) {
if (i==0) {
var hautTexte=Number(r[1]);
var premiereLigne=basMot;
var deltaV=hautChamp-hautTexte;
}
if (nbLignes==2 && !deltaLignes) var deltaLignes=premiereLigne-Number(r[5]);
}
var toutLeTexte=toutLeTexte.substr(toutLeTexte.indexOf(leMot)+leMot.length)
var toutLeTexte=toutLeTexte.replace(/[\"\”\*\-\_\,\.\;\:!?\'\(\)\{\}\[\]\«\»]$/, "").replace(/^\s+$/, "");
} else break;
}
laPage++;
this.deletePages(p);
}
// Redimensionnement
var champBas=premiereLigne-(deltaLignes*(nbLignes-1))-deltaV;
if (champBas<=0) var champBas=0;
gRect[3]=champBas;
g.rect=gRect;
g.value=texteEntier;
// Texte Alerte et Console
var leTexte="Le texte du champ \""+this.getField("champTexte").name+"\" est écrit sur "+nbLignes+" ligne";
if (nbLignes>1) leTexte+="s";
leTexte+=". ";
var nbMots=0;
for (var i=0; i<motsParagraphe.length; i++) nbMots+=motsParagraphe;
leTexte+="Il est composé de "+nbMots+" mot";
if (nbMots>1) leTexte+="s";
if (nbParagraphes>1) leTexte+=" et divisé";
if (nbMots>1) {
leTexte+=" en "+nbParagraphes+" paragraphe";
if (nbParagraphes>1) leTexte+="s";
}
leTexte+=".\nIl y a "+nbCaracteres+" caractères au total.";
if (nbParagraphes>1) {
for (var i=0; i<motsParagraphe.length; i++) {
leTexte+="\n• Paragraphe "+(i+1)+" : "+motsParagraphe+" mot";
if (motsParagraphe>1) leTexte+="s";
leTexte+=" ("+paragraphes.length+" caractères).";
}
}
if (champBas!=basChamp) leTexte+="\r\rLe champ a été redimensionné.\rIl comportait "+nbLignesTexte+" lignes visibles entièrement.";
if (champBas<basChamp) {
if (champBas>0) leTexte+="\r\rToutes les lignes sont maintenant visibles.";
else leTexte+="\r\rLe champ n'est pas assez haut pour afficher tout le texte avec ce corps.";
}
console.println(leTexte);
app.alert(leTexte,3);
console.hide();
//this.dirty=false;
} else {
app.alert("Il faut écrire un texte dans ce champ pour en connaître les détails !",3);
}
@+
😎Attachments:
You must be logged in to view attached files.1 février 2024 à 09:36 #73844Merlin
Maître des clésSalut bebarth
Ça ne fonctionne pas :
TypeError: lesMots.replace is not a function
21:Field:ValidatePar ailleurs je n’ai jamais compris pourquoi Acrobat autorise l’ajout des pièces jointes .zip ou .js tout en interdisant leur extraction. À croire que ses développeurs viennent tous de l’Absurdistan.
😉
1 février 2024 à 10:02 #73845bebarth
Maître des clésÇa ne fonctionne pas : TypeError: lesMots.replace is not a function 21:Field:Validate
Ah !!! J’ai pourtant vérifié plusieurs fois avant de partager…
Je vérifie cet après-midi !@+
😎1 février 2024 à 12:49 #73846bebarth
Maître des clésEffectivement, le script collé dans le post ne fonctionne pas, mais celui en pièce attaché au fichier est correct !
Je donne ici le script qui marche. Je vous invite à modifier les dimensions du champ ou la taille des caractères pour voir la différence.console.show();
console.clear();
// Variables
...
} else {
app.alert("Il faut écrire un texte dans ce champ pour en connaître les détails !",3);
}
@+
😎-
Cette réponse a été modifiée le il y a 6 mois et 2 semaines par
bebarth.
Attachments:
You must be logged in to view attached files.1 février 2024 à 13:57 #73848michel c.
ParticipantBonjour, de mon côté lorsque j’exécute ce script depuis la console, j’ai une erreur :
Console:Exec:21: TypeError: lesMots.replace is not a function
1 février 2024 à 14:29 #73849bebarth
Maître des clésIdem que Merlin ! …et avec celui de la pièce attachée au fichier, c’est pareil ???
Effectivement lorsqu’on copie/colle le script du post, cela ne fonctionne plus !!!
@+
😎1 février 2024 à 14:34 #73850Merlin
Maître des clésbebarth : on ne peut ni lire ni extraire la pièce jointe, c’est un fichier .js !
1 février 2024 à 14:34 #73851michel c.
ParticipantJe ne suis pas sous adobe et je n’ai pas encore trouvé comment ouvrir les fichiers attachés?
Est il possible d’exécuter ce script grâce à un bouton?
Merci
1 février 2024 à 14:48 #73852bebarth
Maître des clésbebarth : on ne peut ni lire ni extraire la pièce jointe, c’est un fichier .js !
J’ai changé la pièce jointe en .txt, je joints également le fichier.
C’est étrange car avec mes Mac je peux ouvrir les fichiers .js attachés !Est il possible d’exécuter ce script grâce à un bouton?
Pour que ça fonctionne depuis un bouton il faut mettre un script d’application pour Acrobat, avec ton logiciel je ne sais pas !
@+
😎Attachments:
You must be logged in to view attached files.1 février 2024 à 18:43 #73855Merlin
Maître des clésJ’ai essayé avec les deux et ça ne fonctionne pas, le champ ne se redimensionne pas.
J’ai placé le script en Format perso et en Validation.
Et avec ton texte d’origine qui déborde largement ça retourne ce message d’erreur :
NotAllowedError: Security settings prevent access to this property or method.
Doc.newPage:35:Field champTexte:FormatVoudrais tu donner raison à ma première réponse ?
😉
1 février 2024 à 18:44 #73856Merlin
Maître des clésC’est étrange car avec mes Mac je peux ouvrir les fichiers .js attachés !
Je suppose que tu as débloqué les paramètres de Sécurite et de Sécurité avancée ?
1 février 2024 à 19:17 #73858bebarth
Maître des clésEt avec ton texte d’origine qui déborde largement ça retourne ce message d’erreur : NotAllowedError: Security settings prevent access to this property or method. Doc.newPage:35:Field champTexte:Format Voudrais tu donner raison à ma première réponse ?
Je ne comprends pas, moi ça fonctionne sur mes 2 Mac ?
Je vais essayer de trouver un PC pour essayer le script !@+
😎Attachments:
You must be logged in to view attached files.2 février 2024 à 08:18 #73861michel c.
ParticipantDe mon coté, le script fonctionne depuis la console, mais je n’arrive pas à le faire tourner à partir d’un bouton.
Erreur :
Doc:Open:46: TypeError: f is null
Attachments:
You must be logged in to view attached files.2 février 2024 à 09:51 #73863bebarth
Maître des clésbonjour,
De mon coté, le script fonctionne depuis la console
Ça me réconforte de savoir que ça ne fonctionne pas uniquement chez moi !
mais je n’arrive pas à le faire tourner à partir d’un bouton
Comme je l’ai dis précédemment il n’est possible d’exécuter ce script à partir d’un bouton uniquement si le (ou une partie du) script est placé en script d’application. Avec Acrobat il y a un répertoire JavaScript où l’on place ces scripts qui sont exécutés à l’ouverture d’Acrobat.
A mon avis, il doit y avoir aussi un répertoire JavaSript pour ton logiciel (lequel est-ce déjà ?).
Tu mes dis !
@+
😎2 février 2024 à 10:51 #73864Merlin
Maître des clésJ’avais essayé de le placer en script de Validation, de Format, etc. dans le champ concerné mais ça fonctionne effectivement bien mieux depuis la Console !
Par-contre même depuis la Console il n’ajoute pas de page, mais sans retourner de message d’erreur, et le message de résultat précise bien que tout le texte n’est pas affiché.
Je vais tester plus avant.
2 février 2024 à 10:55 #73865michel c.
ParticipantJ’ai placé ce script en script de document au départ, dans une fonction que j’ai appelé Redim et que j’appelle via un bouton par la commande Redim(); et ça ne fonctionne pas.
Sinon, je peux exécuter des scripts lors d’actions :
- Avant la fermeture du document
- Avant la sauvegarde du document
- Avant l’impression
- Après l’impression
Je viens d’essayer de le placer avant la sauvegarde et j’ai un message d’erreur lors de la sauvegarde : Doc:WillSave:44: TypeError: f is null
Le logiciel que j’utilise est PDF XChange editor plus
-
Cette réponse a été modifiée le il y a 6 mois et 2 semaines par
michel c..
-
Cette réponse a été modifiée le il y a 6 mois et 2 semaines par
michel c..
Attachments:
You must be logged in to view attached files.2 février 2024 à 12:25 #73869bebarth
Maître des clésJ’ai placé ce script en script de document au départ, dans une fonction que j’ai appelé Redim et que j’appelle via un bouton par la commande Redim(); et ça ne fonctionne pas.
Ce n’est pas en script de document mais en script d’Application qu’il faut le placer !
PDF : les différents niveaux d’utilisation des scripts JavaScript
Je regarde pour ton logiciel plus tard…
@+
😎-
Cette réponse a été modifiée le il y a 6 mois et 2 semaines par
bebarth.
2 février 2024 à 12:27 #73871bebarth
Maître des clésPar-contre même depuis la Console il n’ajoute pas de page, mais sans retourner de message d’erreur, et le message de résultat précise bien que tout le texte n’est pas affiché.
…du coup ça ne fonctionne pas ???
@+
😎2 février 2024 à 15:04 #73872bebarth
Maître des clésJ’ai réussi à faire fonctionner le script via un émulateur PC sur Acrobat et PDF XChange editor.
Sur PDF XChange editor l’espace en bas de champ est un peu plus important… Je n’ai pas trouvé où on pouvait placer des scripts d’application !
S’il y a un support client ou un forum tu peux peut-être te renseigner, mais je n’ai pas l’impression que c’est possible ! Idem pour les actions…@+
😎-
Cette réponse a été modifiée le il y a 6 mois et 2 semaines par
bebarth.
-
Cette réponse a été modifiée le il y a 6 mois et 2 semaines par
bebarth.
Attachments:
You must be logged in to view attached files.2 février 2024 à 17:46 #73877bebarth
Maître des clésLorsque tu auras trouvé si on peut placer des scripts d’application, voici un nouveau fichier qui devrait fonctionner avec un bouton.
J’ai supprimé le calcul des nombres de paragraphes, mots et caractères et le script est en pièce jointe au fichier au format txt.// En script d'application (extension du fichier .js)
if (app.formsVersion>=8) {
ajoutPage=app.trustedFunction(function(cettePage,largeur,hauteur) {
app.beginPriv();
this.newPage(cettePage,largeur,hauteur);
app.endPriv();
});
suppressionPage=app.trustedFunction(function(cettePage) {
app.beginPriv();
this.deletePages(cettePage);
app.endPriv();
});
}
// En script de calcul du bouton
console.show();
console.clear();
// Variables
var p=this.numPages;
var g=this.getField("champTexte");
var gRect=g.rect;
var hautChamp=gRect[1];
var basChamp=gRect[3];
var paragraphes=g.value.split("\r");
var nbParagraphes=paragraphes.length;
var toutLeTexte=g.value;
var nbCaracteres=toutLeTexte.length;
var texteEntier=g.value;
var nbLignesTexte=0;
var nbLignes=0;
var deltaLignes=0;
var aRect=this.getPageBox("Crop");
var laPage=0;
if (toutLeTexte.length) {
// Boucle si texte débordant de la page
while (toutLeTexte.length) {
// Nouvelle page
ajoutPage(p, aRect[2], aRect[1]);
//this.newPage(p, aRect[2], aRect[1]);
var basMot=hautChamp;
// Copie du champ
var f=this.addField("autreChamp", "text", p, g.rect);
for (var j in g) {
try {
if (typeof g[j]!="function" && j!="name" && j!="type" && j!="page" && j!="rect") f[j]=g[j];
} catch(e) {}
}
f.value=toutLeTexte;
// Aplatissement
this.flattenPages(p);
// Nombre de mots
var nbMots=this.getPageNumWords(p);
for (var i=0; i<nbMots; i++) {
var leMot=this.getPageNthWord(p, i, true);
var q=this.getPageNthWordQuads(p, i);
m=(new Matrix2D).fromRotated(this,p);
mInv=m.invert();
r=mInv.transform(q);
r=r.toString();
r=r.split(",");
if (Number(r[5])>basChamp) {
if (Number(r[5])<basMot) {
var basMot=Number(r[5]);
if (!laPage) nbLignesTexte++;
nbLignes++;
}
if (!laPage) {
if (i==0) {
var hautTexte=Number(r[1]);
var premiereLigne=basMot;
var deltaV=hautChamp-hautTexte;
}
if (nbLignes==2 && !deltaLignes) var deltaLignes=premiereLigne-Number(r[5]);
}
var toutLeTexte=toutLeTexte.substr(toutLeTexte.indexOf(leMot)+leMot.length)
var toutLeTexte=toutLeTexte.replace(/[\"\”\*\-\_\,\.\;\:!?\'\(\)\{\}\[\]\«\»]$/, "").replace(/\s+$/, "");
} else break;
}
laPage++;
suppressionPage(p);
//this.deletePages(p);
}
// Redimensionnement
var champBas=premiereLigne-(deltaLignes*(nbLignes-1))-deltaV;
if (champBas<=0) var champBas=0;
gRect[3]=champBas;
g.rect=gRect;
g.value=texteEntier;
// Texte Alerte et Console
var leTexte="Le texte du champ \""+this.getField("champTexte").name+"\" est écrit sur "+nbLignes+" ligne";
if (nbLignes>1) leTexte+="s";
leTexte+=". ";
if (champBas!=basChamp) leTexte+="\r\rLe champ a été redimensionné.\rIl comportait "+nbLignesTexte+" lignes visibles entièrement.";
if (champBas<basChamp) {
if (champBas>0) leTexte+="\r\rToutes les lignes sont maintenant visibles.";
else leTexte+="\r\rLe champ n'est pas assez haut pour afficher tout le texte avec ce corps.";
}
console.println(leTexte);
app.alert(leTexte,3);
console.hide();
//this.dirty=false;
} else {
app.alert("Il faut écrire un texte dans ce champ pour pouvoir le redimensionner !",3);
}
@+
😎-
Cette réponse a été modifiée le il y a 6 mois et 2 semaines par
bebarth.
Attachments:
You must be logged in to view attached files.3 février 2024 à 09:28 #73897michel c.
ParticipantMerci, j’ai testé, il y a une erreur à la ligne 23 :
Field:Mouse Up:23: ReferenceError: ajoutPage is not defined
J’ai essayé de remplacer
ajoutPage(p, aRect[2], aRect[1]);
par :this.newPage(p, aRect[2], aRect[1]);
J’ai ensuite une erreur à la ligne 33 :
Field:Mouse Up:33: TypeError: f is null
Et là, je ne comprend pas car la variable f est bien déclarée à la ligne 27.
Attachments:
You must be logged in to view attached files.3 février 2024 à 09:52 #73899bebarth
Maître des clésbonjour,
// En script d'application (extension du fichier .js)
if (app.formsVersion>=8) {
ajoutPage=app.trustedFunction(function(cettePage,largeur,hauteur) {
app.beginPriv();
this.newPage(cettePage,largeur,hauteur);
app.endPriv();
});
suppressionPage=app.trustedFunction(function(cettePage) {
app.beginPriv();
this.deletePages(cettePage);
app.endPriv();
});
}
Comme indiqué, cette partie doit être placée en script d’application dans un fichier .js, mais avec PDF XChange editor je ne sais pas si c’est possible, et si ça l’est je ne sais pas ou il faut placer le fichier.
Sans les privilèges, tu ne pourras pas ajouter une page ou la supprimer depuis un script déclenché depuis un bouton ! Tu ne pourras le faire qu’à partir de la console ou d’une action.
@+
😎-
Cette réponse a été modifiée le il y a 6 mois et 1 semaine par
bebarth.
3 février 2024 à 19:40 #73901Merlin
Maître des clésbebarth tu as fait un vrai bon boulot qui devrait faire pâlir d’envie ce qu’on trouve sur le forum d’Adobe et d’autres. Je ne suis pas certain non plus que Chat GPT et consorts puisse générer un tel code.
Mais je crois que la propagation sur une autre page est un luxe car ce n’est pas utilisable avec Reader (qui ne peut pas ajouter de page).
À mon avis si ça ne rentre pas dans une seule page il faudrait soit activer le défilement dans le champ, soit prévenir l’utilisateur via une alerte, soit faire les deux.
Bravo en tout cas.
4 février 2024 à 17:37 #73914michel c.
ParticipantOui, je me demandais si ça pouvais marcher à partir d’un bouton en désactivant le code permettant de créer une nouvelle page.
Concernant le boulot que tu as fait, je rejoins Merlin, même si je n’arrive pas à me rendre compte de la difficulté. Il y a tant de choses que je ne maitrise pas dans ce code….
4 février 2024 à 19:56 #73915bebarth
Maître des clésbonjour & Merci pour tous ces compliments…
Quand on est passionné, on fait ça avec plaisir ! Je n’ai qu’un petit regret c’est qu’il n’y a pas plus de problèmes posés sur ce forum car ils sont généralement bien plus intéressants (JavaScriptement parlant :-)) que ceux posés sur le forum Adobe.Oui, je me demandais si ça pouvais marcher à partir d’un bouton en désactivant le code permettant de créer une nouvelle page.
Pour cela il faudrait connaitre le nombre de lignes et pour connaitre le nombre de lignes, la seule solution que j’ai trouvé est celle proposée avec ajout/suppression de pages.
@+
😎5 février 2024 à 09:53 #73917michel c.
ParticipantSinon, j’ai une autre solution pour arriver à mes fins c’est de mettre en vis à vis de chaque champ texte une liste déroulante dans laquelle je spécifierais le nombre de lignes que je veux dans mon champ. Si ça ne rentre pas, je met une ligne supplémentaire.
L’idée c’est de créer un fichier de base qui me permet de créer plus rapidement un document avec question (champ jaune) et réponse en dessous (champ vert)
Pour arriver à coder cette partie, j’ai besoin de connaître le bout de code qui permet d’indiquer si c’est mono-ligne ou multi-ligne et le bout de code pour donner la hauteur de ligne.
Je vais chercher un peu mais je pense y arriver.
Ensuite la partie plus complexe sera de décaler automatiquement les champs en dessous en fonction de la hauteur du champ au dessus. Mais je verrai ça dans un 2ème temps. Je pense qu’en connaissant le bout de code permettant d’indiquer la position en y d’un champ j’y arriverai aussi.
5 février 2024 à 10:50 #73919bebarth
Maître des clésbonjour,
Je ne suis pas dispo aujourd’hui, mais regarde si tu peux faire quelque chose avec la méthode fieldFull.@+
😎5 février 2024 à 10:55 #73920michel c.
Participant5 février 2024 à 19:39 #73925bebarth
Maître des clés…et si le ou les premiers champs ont beaucoup de lignes, que deviennent les derniers champs qui deviennent hors page ? Il sont supprimés ? Doit-il être possible de revenir en arrière en diminuant le nombre de lignes d’un champ ?
@+
😎5 février 2024 à 22:11 #73926michel c.
ParticipantSi les champs du dessus on trop de lignes, ceux du bas sont supprimés.
C’est pour me permettre de gagner du temps lors de la mise en page de documents qui sont standards. Supprimer des champs est rapide, par contre positionner en y des champs, les dimensionner pour optimiser l’espace entre les champs est assez long.
J’ai déjà réussi à faire en sorte de mettre un champ en monoligne ou multiligne en fonction du nombre de lignes spécifié dans la liste déroulante en vis à vis.
Demain j’essayerai de dimensionner les champs en fonction du nombre de ligne spécifié dans la liste déroulante.
-
Cette réponse a été modifiée le il y a 6 mois et 1 semaine par
michel c..
-
Cette réponse a été modifiée le il y a 6 mois et 1 semaine par
michel c..
-
Cette réponse a été modifiée le il y a 6 mois et 1 semaine par
michel c..
Attachments:
You must be logged in to view attached files.6 février 2024 à 17:51 #73931bebarth
Maître des clésbonjour,
Voici ce que je t’ai fait ! Les champs ne sont visibles que si la question et la réponse correspondante ne sont pas hors page.
Ce n’est pas très compliqué. Tu me dis ce que tu ne comprends pas.// Script de document
var hauteurChamp=7.5;
var corps=9.5;
var interligne=corps*1.16;
var margeBas=0;
var mm2pt=72/25.4;
margeBas*=mm2pt;
function reglage(champ,rect) {
champ.delay=true;
champ.rect=rect;
champ.delay=false;
}
function reglageChamps(ind) {
for (var i=ind; i<10; i++) {
var f=this.getField("question."+i);
var fRect=f.rect;
var haut=fRect[1];
var ff=this.getField("nbQ."+i);
var ffRect=ff.rect;
var g=this.getField("reponse."+i);
var gRect=g.rect;
var gg=this.getField("nbR."+i);
var ggRect=gg.rect;
if (i==ind) {
if (event.target.name.indexOf("nbQ")==0) {
var originale=fRect[3];
var finale=fRect[1]-hauteurChamp*mm2pt-(Number(event.changeEx)-1)*interligne;
} else {
var originale=gRect[3];
var finale=gRect[1]-hauteurChamp*mm2pt-(Number(event.changeEx)-1)*interligne;
}
var delta=originale-finale;
if (event.target.name.indexOf("nbQ")==0) {
fRect[3]=finale;
reglage(f,fRect);
gRect[1]-=delta;
ggRect[1]-=delta;
ggRect[3]-=delta;
}
gRect[3]-=delta;
var bas=gRect[3];
reglage(g,gRect);
reglage(gg,ggRect);
} else {
fRect[1]-=delta;
fRect[3]-=delta;
reglage(f,fRect);
ffRect[1]-=delta;
ffRect[3]-=delta;
reglage(ff,ffRect);
gRect[1]-=delta;
gRect[3]-=delta;
var bas=gRect[3];
reglage(g,gRect);
ggRect[1]-=delta;
ggRect[3]-=delta;
reglage(gg,ggRect);
}
if (haut>=margeBas && bas>=margeBas) {
f.display=display.visible;
ff.display=display.visible;
g.display=display.visible;
gg.display=display.visible;
} else {
f.display=display.hidden;
ff.display=display.hidden;
g.display=display.hidden;
gg.display=display.hidden;
}
}
}
// Script de touches personnalisé
if (!event.willCommit) {
reglageChamps(event.target.name.substring(event.target.name.lastIndexOf(".")+1));
}
@+
😎Attachments:
You must be logged in to view attached files.6 février 2024 à 18:33 #73933bebarth
Maître des clésVoici ce que je te disais avec la méthode fieldfull.
if (event.fieldFull) {
app.alert("Le champ texte est plein.\rNous allons augmenter sa hauteur pour pouvoir continuer à frapper.");
var nomChamp=event.target.name;
this.resetForm([nomChamp]); // Reset field to lose focus
var aRect=event.target.rect;
aRect[3]=aRect[3]-event.target.textSize*1.16;
event.target.rect=aRect;
event.change=event.changeEx;
this.getField(nomChamp).setFocus();
}
Par contre :
- Je n’arrive pas à re-frapper directement. Il faut re-cliquer dans le champ.
- Impossible de revenir directement à un champ plus petit si on supprime du texte.
@+
😎-
Cette réponse a été modifiée le il y a 6 mois et 1 semaine par
bebarth.
Attachments:
You must be logged in to view attached files.7 février 2024 à 10:39 #73937michel c.
ParticipantJe vais étudier ce script, j’ai fais beaucoup de recherches sur la fonction Rect pour apprendre comment spécifier les dimensions d’un champ sans comprendre pour le moment.
Je vais revenir poster quelques questions une fois que j’aurais cherché déjà à comprendre par moi-même.
En tout cas merci beaucoup pour ce script, tu n’imagines pas le temps que cela va me faire gagner pour l’édition de mes documents.
7 février 2024 à 13:00 #73938bebarth
Maître des clésbonjour,
https://opensource.adobe.com/dc-acrobat-sdk-docs/library/jsapiref/JS_API_AcroJS.html#id602
La position d’un champ est définie dans une table de 4 éléments qui indique les positions x et y dans la feuille du point supérieur gauche et du point inférieur droit [x supérieur gauche, y supérieur gauche, x inférieur droit, y inférieur droit].@+
😎7 février 2024 à 19:42 #73939Merlin
Maître des clésConcernant la position d’un champ, l’astuce c’est de le placer où il est besoin avec la souris et de copier ses coordonnées avec JavaScript. Ensuite il n’y a plus qu’à ajouter/retrancher.
😉
7 février 2024 à 21:08 #73940bebarth
Maître des clésJ’ai écris un utilitaire il y a quelques temps, mais il ne sera pas très utile à Michel car il se place en script d’application et je ne sais pas si et comment ça fonctionne avec son logiciel.
Je partage le fichier .txt (à renommer en .js) si ça intéresse quelqu’un.
@+
😎Attachments:
You must be logged in to view attached files.8 février 2024 à 08:43 #73943michel c.
ParticipantJe vais apporter une modification à ce document (la modif ne concerne pas le script que tu propose mais un autre que je vais faire pour apporter une fonctionnalité supplémentaire) et il y a un truc que je n’arrive pas à faire.
Dans le document il y a les champs nommés question.0 à question.9 et la même chose pour les champs réponses.
Mais il pourrait y avoir plus ou moins de champs.
J’aimerais faire une boucle for mais avant j’aimerais intégrer dans une variable l’indice le plus élevé de ces champs.
for (var a=0 ; a<=indMax ; a++) ….
Comment faire pour avoir l’indice max?
J’espère que ma question est assez claire?
Merci
-
Cette réponse a été modifiée le il y a 6 mois et 1 semaine par
michel c..
8 février 2024 à 09:45 #73945bebarth
Maître des clésbonjour,
Voici un script qui compte le nombre de chqmps dont le nom commence par “question.”.
var indMax=0;
for (var i=0; i<this.numFields; i++) {
if (this.getNthFieldName(i).indexOf("question.")==0) indMax++;
}
for (var a=0; a<indMax; a++) { // strictement inférieur
...
}
Avec ce script il faut que tous les indices soient consécutifs en partant de zéro sinon il faut mettre les noms des champs (ou juste les indices) dans une table et utiliser la longueur de la table en indMax;
@+
😎8 février 2024 à 13:36 #73946michel c.
ParticipantSuper, merci beaucoup.
Je suis en train de me faire un document avec des petits bouts de codes comme celui-ci qui me bloquent souvent.
Je m’aperçois que je reste cantonné à ce que je maîtrise et du coup je progresse peu.
Dans cette ligne, je ne comprend pas bien la condition:
if (this.getNthFieldName(i).indexOf("question.")==0) indMax++;
On incrémente la valeur indMax si …. et je ne comprend pas la suite….
-
Cette réponse a été modifiée le il y a 6 mois et 1 semaine par
michel c..
8 février 2024 à 14:28 #73948bebarth
Maître des clésVoici le script expliqué :
var indMax=0;
for (var i=0; i<this.numFields; i++) { // numFields = Nombre de champs dans le document
if (this.getNthFieldName(i).indexOf("question.")==0) indMax++; // Si le nom du champ commence par "question." on incrémente indMax
// this.getNthFieldName(i) = Nom du champ d'indice i
// indexOf("question.") = Recherche la chaine de caractères "question."
// si le résultat est -1 la chaine de caractères n'a pas été trouvée
// sinon indique la position de cette chaine de caractères
// donc ==0 signifie que le nom du champ commence par "question."
}
for (var a=0; a<indMax; a++) { // strictement inférieur car "question." basé sur 0
...
}
Tu devrais trouver beaucoup d’explication en consultant :
https://opensource.adobe.com/dc-acrobat-sdk-docs/library/jsapiref/JS_API_AcroJS.html
pour les propriétés ou méthodes, ou en anglais
https://www.w3schools.com/jsref/default.asp
ou en français
https://developer.mozilla.org/fr/docs/Web/JavaScript/Guide/Introduction
pour le JavaSCript@+
😎12 février 2024 à 13:56 #73951michel c.
ParticipantMerci beaucoup.
Encore une petite question : comment modifier cette ligne :
for (var i=0; i<this.numFields; i++) { // numFields = Nombre de champs dans le document
Pour obtenir le nombre de champs dont le préfixe (les 3 premiers caractères) serait par exemple “ABC”
Merci
12 février 2024 à 17:27 #73952bebarth
Maître des clésbonjour,
2 façons de faire :for (var i=0; i<this.numFields; i++) {
if (this.getNthFieldName(i).indexOf("ABC")==0) {
...
}
}
ou
for (var i=0; i<this.numFields; i++) {
if (/^ABC/.test(this.getNthFieldName(i))) {
...
}
}
@+
😎13 février 2024 à 17:41 #73957michel c.
ParticipantMerci pour la réponse. Je viens essayer de mettre en application cela mais j’ai une erreur (dans le script de document CoulQ) : ce script devrait me permettre de choisir la couleur des champs question sur la 1ère page.
function CoulQ() {
var Coul=this.getField(“Menu.3″).value;
if (Coul==”Aucune”) {
for (var i=0; i<this.numFields; i++) {
if (this.getNthFieldName(i).indexOf(“question.”)==0) {this.getField(“question.”+i).fillColor = color.transparent;}
}
}if (Coul==”Jaune”) {
for (var i=0; i<this.numFields; i++) {
if (this.getNthFieldName(i).indexOf(“question.”)==0) {this.getField(“question.”+i).fillColor = color.yellow;}
}
}if (Coul==”Vert”) {
for (var i=0; i<this.numFields; i++) {
if (this.getNthFieldName(i).indexOf(“question.”)==0) {this.getField(“question.”+i).fillColor = color.green;}
}
}if (Coul==”Bleu”) {
for (var i=0; i<this.numFields; i++) {
if (this.getNthFieldName(i).indexOf(“question.”)==0) {this.getField(“question.”+i).fillColor = color.blue;}
}
}if (Coul==”Rouge”) {
for (var i=0; i<this.numFields; i++) {
if (this.getNthFieldName(i).indexOf(“question.”)==0) {this.getField(“question.”+i).fillColor = color.red;}
}
}}
Attachments:
You must be logged in to view attached files.14 février 2024 à 10:49 #73959bebarth
Maître des clésbonjour,
je ne pourrai regarder que demain…
@+
😎14 février 2024 à 11:34 #73960Merlin
Maître des clésJe ne sais pas si ça vient du collage dans l’éditeur de texte du forum mais il y a un problème avec les guillemets, JavaScript ne comprend que les guillemets droits.
Pour éviter toute erreur de format avec l’éditeur de texte il faut sélectionner le script et sélectionner “Code” dans le menu “Format”.
Par ailleurs tu devrais utiliser “else if” après le premier “if”, ça évite au script de tester inutilement toutes les conditions et donc ça devrait accélérer son exécution.
function CoulQ() {
var Coul=this.getField("Menu.3").value;
if (Coul=="Aucune") {
for (var i=0; i<this.numFields; i++) {
if (this.getNthFieldName(i).indexOf("question.")==0) {this.getField("question."+i).fillColor = color.transparent;}
}
}
else if (Coul=="Jaune") {
for (var i=0; i<this.numFields; i++) {
if (this.getNthFieldName(i).indexOf("question.")==0) {this.getField("question."+i).fillColor = color.yellow;}
}
}
else if (Coul=="Vert") {
for (var i=0; i<this.numFields; i++) {
if (this.getNthFieldName(i).indexOf("question.")==0) {this.getField("question."+i).fillColor = color.green;}
}
}
else if (Coul=="Bleu") {
for (var i=0; i<this.numFields; i++) {
if (this.getNthFieldName(i).indexOf("question.")==0) {this.getField("question."+i).fillColor = color.blue;}
}
}
else if (Coul=="Rouge") {
for (var i=0; i<this.numFields; i++) {
if (this.getNthFieldName(i).indexOf("question.")==0) {this.getField("question."+i).fillColor = color.red;}
}
}
}
Attachments:
You must be logged in to view attached files.14 février 2024 à 12:37 #73962michel c.
ParticipantMerci pour la réponse, je viens de tester mais j’ai toujours la même erreur dans ce script. Cela concerne les conditions je pense :
else if (Coul==”Bleu”) {
for (var i=0; i<this.numFields; i++) {
if (this.getNthFieldName(i).indexOf(“question.”)==0) {this.getField(“question.”+i).fillColor = color.blue;}
}
}L’erreur renvoyée :
Doc:Open:25: TypeError: this.getField(...) is null
Un problème je pense sur la numérotation des champs avec la variable i qui doit fournir une valeur hors n° de mes champs
question.
Merci
-
Cette réponse a été modifiée le il y a 6 mois par
michel c..
Attachments:
You must be logged in to view attached files.14 février 2024 à 19:42 #73965Merlin
Maître des clésEncore une fois l’expérience montre qu’il vaut mieux poster un exemple de ce qu’on veut obtenir que juste un script, du coup j’ai capté immédiatement comment simplifier.
Donc je ne sais pas pourquoi ton script ne fonctionne pas mais on s’en fiche.
En fait on peut simplifier le script et s’éviter bien des complications en utilisant la convention de dénomination des champs de formulaire (voir : https://www.abracadabrapdf.net/?p=525 ).
Au lieu de placer la référence au numéro de page avant le nom il faut la placer après et la séparer par un point, et ensuite placer la numérotation du champ dans la page après un autre point.
Ce qui nous donne :
question.P1.0
question.P1.1
question.P2.0
question.P2.1
etc.
Ainsi avec JavaScript pour par exemple modifier tous les champs “question” dans toutes les pages il suffit de s’adresser au champ parent “question“.
Et, autre exemple, pour modifier tous les champs “question” de la page 2 il suffit de s’adresser au champ parent “question.P2“.
Ce qui évite de devoir écrire des boucles et/ou de devoir détecter des caractères dans les noms des champs.
Ci-dessous le script que j’ai placé dans l’exemple ci-joint, je te laisse t’occuper des champs réponses.
function CoulQ() {
var Coul=this.getField("Menu.3").value;
if (Coul=="Aucune") {this.getField("question").fillColor = color.transparent;}
else if (Coul=="Jaune") {this.getField("question").fillColor = color.yellow;}
else if (Coul=="Vert") {this.getField("question").fillColor = color.green;}
else if (Coul=="Bleu") {this.getField("question").fillColor = color.blue;}
else if (Coul=="Rouge") {this.getField("question").fillColor = color.red;}
}
Attachments:
You must be logged in to view attached files.14 février 2024 à 19:57 #73967michel c.
ParticipantMerci, j’avais pensé à faire cela mais je craignais que cela interfère avec un autre script (que BB m’a proposé dans son post du 6 février 2024 à 17:51) qui permet de spécifier la hauteur d’un champ par une liste déroulante et de décaler les positions des champs qui sont en dessous.
Comme ce script ne fonctionne me semble-t-il que sur une page, j’ai dupliqué ce script de document pour qu’il n’y en ait qu’un par page.
Mais je vais quand même essayer ça demain.
15 février 2024 à 13:40 #73968bebarth
Maître des clésbonjour,
Comme ce script ne fonctionne me semble-t-il que sur une page,
Le script est effectivement écrit pour fonctionner sur une seule page. On pourrait l’adapter pour une utilisation sur plusieurs pages mais il faut définir avant ce que l’on veut exactement car ça complique un peu…
@+
😎16 février 2024 à 11:09 #73969michel c.
ParticipantJe viens de réussir :
function CoulQ() {
var Coul=this.getField("Menu.3").value;
if (Coul=="Aucune") {this.getField("question.").fillColor = color.transparent;
for (var i=2 ; i<6 ; i++) {this.getField(i+"question.").fillColor = color.transparent;}
}
else if (Coul=="Jaune") {this.getField("question.").fillColor = color.yellow;
for (var i=2 ; i<6 ; i++) {this.getField(i+"question.").fillColor = color.yellow;}
}
else if (Coul=="Vert") {this.getField("question.").fillColor = color.green;
for (var i=2 ; i<6 ; i++) {this.getField(i+"question.").fillColor = color.green;}
}
else if (Coul=="Bleu") {this.getField("question.").fillColor = color.blue;
for (var i=2 ; i<6 ; i++) {this.getField(i+"question.").fillColor = color.blue;}
}
else if (Coul=="Rouge") {this.getField("question.").fillColor = color.red;
for (var i=2 ; i<6 ; i++) {this.getField(i+"question.").fillColor = color.red;}
}
}
Attachments:
You must be logged in to view attached files.16 février 2024 à 14:22 #73971Merlin
Maître des clés+
18 février 2024 à 10:40 #73972bebarth
Maître des clésbonjour,
Voici une version pour “simplifier” l’écriture du script :
function CoulQ() {
switch (this.getField("Menu.3").value) {
case "Jaune":
var Coul=color.yellow;
break;
case "Vert":
var Coul=color.green;
break;
case "Bleu":
var Coul=color.blue;
break;
case "Rouge":
var Coul=color.red;
break;
default:
var Coul=color.transparent;
}
for (var i=2; i<6; i++) this.getField(i+"question.").fillColor=Coul;
}
Juste une question : dans la boucle finale, la position de la variable “i” me parait étrange ! Ne serait-ce pas plutôt :
... this.getField("question."+i).fillColor ...
@+
😎19 février 2024 à 14:41 #73973michel c.
ParticipantBonjour et merci pour la proposition.
J’ai testé et ce script en le mettant en script de document pour les champs question et les champs réponse.
Curieusement il fonctionne pour les champs réponse mais ne fonctionne pas pour les champs question (sans que la console ne renvoie d’erreur).
Pour l’indice i placé devant question, c’est lié au script que tu m’as proposé il y a quelques jours (reglageChamps) que j’ai dupliqué pour qu’il y ait un script par page.
Pour la numérotation des champs, je trouvais plus simple comme ça plutôt qu’avoir 2 indices en fin de nom de champ
Merci
19 février 2024 à 16:33 #73974bebarth
Maître des clésbonjour,
Curieusement il fonctionne pour les champs réponse mais ne fonctionne pas pour les champs question (sans que la console ne renvoie d’erreur).
Ça fait un peu juste pour trouver le pourquoi ça ne fonctionne pas !
Pour la numérotation des champs, je trouvais plus simple comme ça plutôt qu’avoir 2 indices en fin de nom de champ
OK ! Pour moi i était l’indice du champ et pour modifier tous les champs on ne devait pas mettre le point (par exemple this.getField(“question”).fillColor pour modifier tous les champs de même nom sans indiquer les indices) mais je viens de vérifier et avec le point ça fonctionne également…
@+
😎 -
Cette réponse a été modifiée le il y a 6 mois et 2 semaines par
-
AuteurRéponses
- Vous devez être connecté pour répondre à ce sujet.