Donnez vie à vos documents numériques !
 

Propriété d’un champ

abracadabraPDF Forums PDF – Général Propriété d’un champ

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

    Bonjour, 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

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

    Bonjour,

    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.

     

    #73839
    michel c.
    Participant

    Merci, je cherche une autre solution.

    #73842
    bebarth
    Maître des clés

    bonjour,
    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.
    #73844
    Merlin
    Maître des clés

    Salut bebarth

    Ça ne fonctionne pas :

    TypeError: lesMots.replace is not a function
    21:Field:Validate

     

    Par 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.

    😉

    #73845
    bebarth
    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 !

    @+
    😎

    #73846
    bebarth
    Maître des clés

    Effectivement, 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 3 mois par bebarth.
    Attachments:
    You must be logged in to view attached files.
    #73848
    michel c.
    Participant

    Bonjour, 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

    #73849
    bebarth
    Maître des clés

    Idem 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 !!!

    @+
    😎

    #73850
    Merlin
    Maître des clés

    bebarth : on ne peut ni lire ni extraire la pièce jointe, c’est un fichier .js !

    #73851
    michel c.
    Participant

    Je 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

     

    #73852
    bebarth
    Maître des clés

    bebarth : 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.
    #73855
    Merlin
    Maître des clés

    J’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:Format

     

    Voudrais tu donner raison à ma première réponse ?

    😉

    #73856
    Merlin
    Maître des clés

    C’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 ?

    #73858
    bebarth
    Maître des clés

    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: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.
    #73861
    michel c.
    Participant

    De 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.
    #73863
    bebarth
    Maître des clés

    bonjour,

    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 !

    @+
    😎

    #73864
    Merlin
    Maître des clés

    J’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.

     

    #73865
    michel c.
    Participant

    J’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 2 mois et 4 semaines par michel c..
    • Cette réponse a été modifiée le il y a 2 mois et 4 semaines par michel c..
    Attachments:
    You must be logged in to view attached files.
    #73869
    bebarth
    Maître des clés

    J’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 2 mois et 4 semaines par bebarth.
    #73871
    bebarth
    Maître des clés

    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é.

    …du coup ça ne fonctionne pas ???

    @+
    😎

    #73872
    bebarth
    Maître des clés

    J’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 2 mois et 4 semaines par bebarth.
    • Cette réponse a été modifiée le il y a 2 mois et 4 semaines par bebarth.
    Attachments:
    You must be logged in to view attached files.
    #73877
    bebarth
    Maître des clés

    Lorsque 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 2 mois et 4 semaines par bebarth.
    Attachments:
    You must be logged in to view attached files.
    #73897
    michel c.
    Participant

    Merci, 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.
    #73899
    bebarth
    Maître des clés

    bonjour,

    // 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 2 mois et 4 semaines par bebarth.
    #73901
    Merlin
    Maître des clés

    bebarth 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.

    #73914
    michel c.
    Participant

    Oui, 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….

    #73915
    bebarth
    Maître des clés

    bonjour & 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.

    @+
    😎

    #73917
    michel c.
    Participant

    Sinon, 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.

     

    #73919
    bebarth
    Maître des clés

    bonjour,
    Je ne suis pas dispo aujourd’hui, mais regarde si tu peux faire quelque chose avec la méthode fieldFull.

    @+
    😎

    #73920
    michel c.
    Participant

    Je vais chercher de mon côté, l’algorithme commence à  s’organiser dans ma tête.

    Je remet ici la pièce jointe, je viens de faire une petite modif sur le fichier.

    • Cette réponse a été modifiée le il y a 2 mois et 3 semaines par michel c..
    Attachments:
    You must be logged in to view attached files.
    #73925
    bebarth
    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 ?

    @+
    😎

    #73926
    michel c.
    Participant

    Si 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 2 mois et 3 semaines par michel c..
    • Cette réponse a été modifiée le il y a 2 mois et 3 semaines par michel c..
    • Cette réponse a été modifiée le il y a 2 mois et 3 semaines par michel c..
    Attachments:
    You must be logged in to view attached files.
    #73931
    bebarth
    Maître des clés

    bonjour,
    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.
    #73933
    bebarth
    Maître des clés

    Voici 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 :

    1. Je n’arrive pas à re-frapper directement. Il faut re-cliquer dans le champ.
    2. Impossible de revenir directement à un champ plus petit si on supprime du texte.

    @+
    😎

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

    Je 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.

    #73938
    bebarth
    Maître des clés

    bonjour,
    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].

    @+
    😎

    #73939
    Merlin
    Maître des clés

    Concernant 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.

    😉

    #73940
    bebarth
    Maître des clés

    J’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.
    #73943
    michel c.
    Participant

    Je 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 2 mois et 3 semaines par michel c..
    #73945
    bebarth
    Maître des clés

    bonjour,
    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;

    @+
    😎

    #73946
    michel c.
    Participant

    Super, 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 2 mois et 3 semaines par michel c..
    #73948
    bebarth
    Maître des clés

    Voici 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

    @+
    😎

    #73951
    michel c.
    Participant

    Merci 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

    #73952
    bebarth
    Maître des clés

    bonjour,
    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))) {
    ...
    }
    }

    @+
    😎

    #73957
    michel c.
    Participant

    Merci 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.
    #73959
    bebarth
    Maître des clés

    bonjour,

    je ne pourrai regarder que demain…

    @+
    😎

    #73960
    Merlin
    Maître des clés

    Je 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.
    #73962
    michel c.
    Participant

    Merci 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 2 mois et 2 semaines par michel c..
    Attachments:
    You must be logged in to view attached files.
    #73965
    Merlin
    Maître des clés

    Encore 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.
    #73967
    michel c.
    Participant

    Merci, 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.

    #73968
    bebarth
    Maître des clés

    bonjour,

    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…

    @+
    😎

    #73969
    michel c.
    Participant

    Je 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.
    #73971
    Merlin
    Maître des clés

    +

    #73972
    bebarth
    Maître des clés

    bonjour,
    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 ...

    @+
    😎

    #73973
    michel c.
    Participant

    Bonjour 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

    #73974
    bebarth
    Maître des clés

    bonjour,

    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…

    @+
    😎

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