Toutes mes réponses sur les forums
-
AuteurRéponses
-
14 avril 2022 à 08:33 en réponse à : Insertion obligatoirement différentes de valeurs. – RÉSOLU #70970
Merlin
Maître des clésBonjour
Je viens de vérifier, la pièce jointe a été supprimée du message original.
Désolé.
Attachments:
You must be logged in to view attached files.Merlin
Maître des clésBonjour
Pour moi ce document devrait ne contenir que deux pages : le plan et la “page élève”.
Les champs de la “page élève” étant remplis dynamiquement en fonction du nom sélectionné à partir d’un fichier texte placé en pièce jointe contenant les données.
Ça résoudrait la plupart des problèmes.
13 avril 2022 à 07:21 en réponse à : Bouton “envoyer” ne fonctionne pas après avoir signé le formulaire #70965Merlin
Maître des clésTout le monde à ce problème parce-qu’une (vraie) signature numérique supprime toutes les actions, tous les calculs et tous les scripts du document.
On ne peut rien faire de plus avec Acrobat, pour aller plus loin dans les processus de signature il faut prendre un abonnement Adobe Sign.
Merlin
Maître des clésBonjour
Ce script liste les signets et les affiche en menu depuis un bouton.
C’est un morceau de code que j’ai acheté à PDFScripting : “Add Bookmark Menu Button to PDF”.
https://www.pdfscripting.com/members/login.cfm?hpage=programs/fileinfo.cfm
5 avril 2022 à 22:56 en réponse à : GREP Indesign – Mettre parenthèses et chiffre en exposant #70938Merlin
Maître des clés“Merlin est LE spécialiste en GREP !”
🆒 🤓
5 avril 2022 à 22:43 en réponse à : GREP Indesign – Mettre parenthèses et chiffre en exposant #70937Merlin
Maître des clésBonjour
Cette regex capte tous les chiffres entre parenthèses et capte aussi les parenthèses :
\((?<=\()\d+?(?=\))\)
À utiliser en Rechercher-remplacer ou bien en style GREP.
5 avril 2022 à 09:00 en réponse à : Bouton “envoyer” ne fonctionne pas après avoir signé le formulaire #70926Merlin
Maître des clésBonjour
Quelle fonction utilises tu pour la signature ?
Le menu “Remplir et signer” ?
(“l’icône de la plume” ça ne me parle pas du tout)
Merlin
Maître des clés“Est il possible que les valeurs a « 0 » s’affiche en blanc pour ne pas apparaître dans le tableau”
Bonjour
Place ce script en script de format personnalisé dans le champ “total” :
if (event.value == 0) {event.value = ""};
Merlin
Maître des clésJe crois que ce que bebarth veut dire c’est qu’il est déconseillé d’utiliser la propriété hidden et qu’il vaut mieux utiliser display à la place :
Et il a raison, par exemple hidden ne fonctionne pas avec Foxit Reader, qui ne reconnait que la propriété display.
Adobe conserve les “propriétés remplacées” autant que possible pour des raisons de rétrocompatibilité mais ce n’est pas le cas de tous les éditeurs.
Merlin
Maître des clésBonjour
En fait dans cette ligne tu demande au champ bouton qui est cliqué (event.target) de transférer son icône/image dans le champ photo, ce qu’il fait :
this.getField(this.getNthFieldName(i)).buttonSetIcon(event.target.buttonGetIcon());
Il faut créer un autre bouton (masqué) ne contenant pas d’icône et transférer cette “non icône” vers le champ photo lors du reset. Comme ceci :
this.getField(this.getNthFieldName(i)).buttonSetIcon(this.getField("Button1").buttonGetIcon());
Ci-joint.
Attachments:
You must be logged in to view attached files.Merlin
Maître des clésBonjour
La réponse est : oui, mais non.
Oui on peut le faire.
Mais non car dès qu’un élément est utilisé plus d’une seule fois on a toujours intérêt à le mettre en variable. Parce-que c’est plus simple à programmer et parce-que le script s’exécute plus vite, même si ça se joue en millièmes de secondes.
Et bravo pour ces premiers scripts !
23 mars 2022 à 18:33 en réponse à : Le total ne se met pas à jour lorsqu’un montant calculé est mis à jour #70810Merlin
Maître des clésBonjour
Ça n’a rien à voir avec JavaScript !
Un dessin vaut mieux qu’un long discours, voir pièce jointe.
Attachments:
You must be logged in to view attached files.Merlin
Maître des clésBonjour
1 Il n’y a pas besoin de JavaScript.
2 Si l’utilisateur coche une première case il doit pouvoir immédiatement remplir le menu correspondant sinon ça n’a pas de sens, ce serait plutôt déroutant pour l’utilisateur final et donc pas ergonomique.
3 S’il est possible de cocher plus de 3 cases, pourquoi se limiter à 3/3 ?
Merlin
Maître des clésBonjour
En fait ce sont les logiciels de messagerie qui ne respectent pas les propriétés de visibilité des champs de formulaire et des calques, c’est pour ça qu’ils les affichent quand même.
Donc a priori le moyen idéal serait de supprimer ces champs au lieu de les masquer.
Merlin
Maître des clés👍
Merlin
Maître des clés“Je ne savais pas (et je n’avais jamais essayé) !!!”
Ce n’est pas documenté, ça fonctionne aussi pour les labels des boutons.
J’ai appris ça par Thom Parker au détour d’un forum. 😉
Merlin
Maître des clésbebarth a raison, ce n’est pas possible en utilisant l’interface d’Acrobat.
Par-contre c’est possible si on utilise JavaScript pour remplir les items du menu en y insérant des sauts de ligne “\n”.
Par exemple en exécutant ce script dans la Console JavaScript (copier dans la Console, tout sélectionner, appuyer sur la touche Entrée*) :
this.getField("theme1").setItems(["Patiente avec progression au niveau\nviscéral après 2 lignes de traitement", "Patiente en rechute après 2 lignes de traitement avec notamment\nprésence de métastases cérébrales peu symptomatiques", "Etc."]);
Exemple ci-joint.
*Attention, la touche Entrée (Enter) n’est pas la touche Retour (Return) !
Attachments:
You must be logged in to view attached files.Merlin
Maître des clésPlus exactement : il faut que la page a supprimer ait été dupliquée/générée (spawned) à partir d’une page modèle (en général masquée).
Ça fonctionne aussi avec les versions de Foxit Reader postérieures à septembre 2021.
Après que je leur ai signalé ce “défaut de fonctionnalité” en juin 2021 : belle réactivité, en plus de prendre la peine de m’en informer par email. Tous les éditeurs ne peuvent pas en dire autant… 😉
Merlin
Maître des clésBonjour
Attention, ça fonctionne avec Acrobat Pro et Acrobat Standard mais pas avec Acrobat Reader, ni avec Foxit Reader.
Merlin
Maître des clésBonjour
Place ce script en action de document “(Quand) Le document sera enregistré” :
var nCompt = 0;
for (var i=0; i<this.numFields; i++) {
var oChamp = this.getField(this.getNthFieldName(i));
if (oChamp != null && oChamp.required == true && oChamp.value == oChamp.defaultValue) {nCompt++;}
}
if (nCompt > 0) {
app.alert("Merci de cocher tous les champs obligatoires sinon votre demande ne sera pas prise en compte.");
}
Attachments:
You must be logged in to view attached files.Merlin
Maître des clés👍
Merlin
Maître des clés😀
Merlin
Maître des clésClic-droit sur un champ : Propriétés.
Ou double-clic.
Ou quand le champ est sélectionné : touche Entrée (Enter)
Attachments:
You must be logged in to view attached files.Merlin
Maître des clésL’idéal serait que dans le document InDesign tu puisses convertir les intitulés en autant de champs de textes indépendants. (Il existe des scripts pour InDesign, certains gratuits, qui découpent en un clin d’œil un bloc de texte multiligne en autant de blocs qu’il y a de lignes.)
Si les intitulés/champs de texte sont placés sur la page à peu près en face des cases à cocher, lors de la conversion en PDF InDesign devrait les numéroter de façon synchrone.
Ainsi le script de calcul du champ texte pourrait aller chercher automatiquement l’intitulé correspondant à chaque case cochée, ce qui éviterait de devoir (re)remplir la valeur des cases manuellement.
Merlin
Maître des clés2. Il faut ajouter ce script en script de calcul dans le champ de texte, exemple ci-joint (je n’ai renseigné que les 3 premières cases).
InDesign a une curieuse et peu pratique façon de nommer les champs de formulaires mais heureusement les cases à cocher ont toutes un point commun : leur nom contient “Case à cocher”.
// CONCATÉNER LES VALEURS (str) DES COCHES DONT LE NOM CONTIENT "Case à cocher"
var strTexte = "";
for (var i = 0; i < this.numFields; i++) {
var oFld = this.getField(this.getNthFieldName(i));
if ((oFld.type == "checkbox") && (/Case à cocher/.test(oFld.name)) && oFld.value != "Off") {
strTexte = strTexte + oFld.valueAsString + "\n";
}
}
event.target.value = strTexte;
Attachments:
You must be logged in to view attached files.Merlin
Maître des clés1. Il faut donner à chaque case à cocher l’intitulé correspondant, c’est faisable avec InDesign ou avec Acrobat Pro.
Voir captures jointes.
Attachments:
You must be logged in to view attached files.Merlin
Maître des clésBonjour
A priori la réponse est oui.
Mais pour dire comment il faudrait en savoir plus et/ou que tu partages ce document.
Merlin
Maître des clésÇa n’est pas possible, tous les logiciels qui ouvrent des fichiers PDF ne se valent pas, loin de là.
Je te conseille la lecture de ce tuto :
Cependant les champs de type Codebarre ne s’affichent pas dans Acrobat Reader, c’est voulu, mais ils fonctionnent quand même.
Par-contre ils s’affichent très bien dans Foxit Reader…
Merlin
Maître des clésBonjour
Concernant le message d’alerte la réponse est simple : coche “Ne plus afficher” et tu ne le verras plus.
Ce message ne concerne que les codes-barres et de toute façon est périmé, le “Barcode Paper Form Solution” dont il parle est un vieux truc qui date du XXe siècle, ce n’est plus d’actualité.
Un peu comme les fax.
Pour le reste, réponse en images :
Attachments:
You must be logged in to view attached files.Merlin
Maître des clésBonjour
Je n’ai pas essayé depuis l’avant-dernière version (32 bits) mais ça fonctionnait.
Par-contre ça fait maintenant plus de deux ans, depuis l’abandon du support de Flash Player, qu’on attend qu’Adobe implémente la barre de contrôle.
Parce-que quand ça fonctionne l’utilisateur ne peut que déclencher la vidéo, ou le son, et ensuite attendre que ça s’arrête. Faute d’avoir les boutons Pause, Arrêt, Retour, Avance, etc.
Donc mon conseil en attendant qu’Adobe se réveille c’est de placer la vidéo en pièce jointe dans le PDF, ce qui a pour effet de la lancer en externe via le lecteur vidéo par défaut de l’ordinateur, et donc avec une barre de contrôle.
Et sans avoir le problème des formats non reconnus par Acrobat, puisque que le lecteur par défaut gère tous les formats standards actuels.
😎
Merlin
Maître des clésPourquoi ne pas remplacer event.value+=” M”+String.fromCharCode(0x00B2);
par : event.value+=” M²”Parce-que si tu le fait sur Mac ça ne s’affichera pas correctement sur PC, Android et iOS, et si tu le fait sur PC ça ne s’affichera pas correctement sur Mac, Android et iOS.
Merlin
Maître des clésBonjour
Quand j’ouvre ce document la console m’affiche :
TypeError: f is null
2:Document-Level:New Script 1Parce-que le champ “DATE” s’appelle en fait : “03-DATE”.
Le script de date à l’ouverture n’est pas bon, celui-ci devrait mieux fonctionner :
f = this.getField("03-DATE");
if (f != null && f.value == f.defaultValue)
{f.value = util.printd("dd/mm/yy", new Date())};
Pour répondre à ta question :
var oChampCoche = this.getField("Classe de précision");
var oChampText = this.getField("texte1");
if (oChampCoche.value == 0.4) {event.value = (oChampText.value / 2) + 1;}
else if (oChampCoche.value == 1.5) {event.value = (oChampText.value / 2) + 2;}
else {event.value = ""}
Ci-joint.
Attachments:
You must be logged in to view attached files.Merlin
Maître des clés👍
Merlin
Maître des clésOK, je n’ai rien dit.
😇
Merlin
Maître des clésSupprime le script de validation (qui ne sert à rien) et supprime le script de calcul (qui converti en capitales et qui donc fausse tout le reste).
Attachments:
You must be logged in to view attached files.Merlin
Maître des clésPS : le texte qui apparait en gris clair doit être placé en texte par défaut.
Attachments:
You must be logged in to view attached files.Merlin
Maître des clésBonjour
// À PLACER EN ACTION "CHAMP ACTIVÉ" (ON FOCUS)
if (event.target.value == event.target.defaultValue) {
event.target.value = "";
event.target.textColor = color.black;
event.target.textSize = 36;
event.target.alignment = "left"; // à gauche
}
// À PLACER EN ACTION CHAMP DÉSACTIVÉ (ON BLUR)
if (event.target.value == "") {
event.target.value = event.target.defaultValue;
event.target.textColor = color.ltGray; // gris clair
event.target.textSize = 12;
event.target.alignment = "center"; // centrer
}
Merlin
Maître des clésUne telle liste est un non-sens ergonomique, comment un utilisateur pourrait-il se souvenir de la liste des noms de champs affichés s’il y en a plus de 3 ?
Voir ci-dessus mon message du 6 janvier.
Merlin
Maître des clés👍
Galactica : Je crois que le champ image serait mieux s’il était carré, sans contour et avec un redimensionnement proportionnel de l’image.
Carré parce-que ça permet des images dans les deux sens H et V, et aussi les images carrées.
Redimensionnement proportionnel pour éviter de déformer les visages.
Sans contour pour éviter l’effet moche entre le bord de l’image et le cadre si l’image n’est pas carrée.
Attachments:
You must be logged in to view attached files.Merlin
Maître des clésbebarth wrote:
Je ne comprends pas pourquoi « if (event.commitKey == 13… » ???Moi non plus.
Merlin
Maître des clés👌
Merlin
Maître des clésBonjour
Dans le champ “Result” j’ai déplacé le script en Validation et je l’ai un peu modifié.
J’ai aussi ajouté une instruction dans le script du bouton “Générer”.
Attachments:
You must be logged in to view attached files.Merlin
Maître des clésMoi je l’ai vu, c’est déjà ça 😉
Merci.
Merlin
Maître des clésMerci, mais n’hésites pas : moins on a l’habitude de publier et plus ça parait sincère quand on le fait.
😎
Merlin
Maître des clésOn ne peux pas te donner tort.
😉
Merlin
Maître des clésMerci pour les compliments !
Si tu pouvais publier les mêmes sur Twitter, LinkedIn, Facebook, etc. ce serait extra.
😎
Merlin
Maître des clésMerlin
Maître des clésappelle la en « script de touche personnalisé » dans chacun des champs
Pour le faire en un clin d’œil copie-colle ce script dans la Console, sélectionne tout et appuie sur la touche Entrée (ne pas confondre avec Retour) :
for (var i = 0; i < this.numFields; i++) {
var oFld = this.getField(this.getNthFieldName(i));
if ((oFld.type == "text") && (/ac/.test(oFld.name))) {
oFld.setAction("Keystroke", "formatChiffre()");
}
}
Merlin
Maître des clésje n’ai pas pu formater les champs en nombre car cela crée une erreur (je pense qu’un champ nombre ne peut pas contenir la valeur vide « ».
C’est exactement ça.
Ajoute cette fonction et appelle la en “script de touche personnalisé” dans chacun des champs.
Elle n’autorise que la saisie de chiffres mais elle n’empêche pas “rien”.
function formatChiffre() {
var regxp=/^[0-9]$/;
if (event.willCommit==false) {
if (event.change.length>0 && regxp.test(event.change)==false) {
app.beep();
event.rc=false
}
}
}
Merlin
Maître des clésJe vais essayer de potasser un peu ça.
==> https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Statements/try…catch
Merlin
Maître des clésAvec le script de bebarth ça fonctionne bien.
Dans le ci-joint j’ai mis la fonction en action “onBlur”, j’ai supprimé les calculs et j’ai optimisé le script de reset.
function affLigne() {
for (var i=0; i<=19; i++) {
eval("var ac"+i+" = this.getField(\"ac."+i+"\").value");
}
if (ac0 != "" | ac1 != "" | ac2 != "" | ac3 != "" ) {
for (var k = 4 ; k<8 ; k++) {
this.getField("ac."+k).display = display.visible;}}
if (ac4 != "" | ac5 != "" | ac6 != "" | ac7 != "" ) {
for (var l = 8 ; l<12 ; l++) {
this.getField("ac."+l).display = display.visible;}}
if (ac8 != "" | ac9 != "" | ac10 != "" | ac11 != "" ) {
for (var m = 12 ; m<16 ; m++) {
this.getField("ac."+m).display = display.visible;}}
if (ac12 != "" | ac13 != "" | ac14 != "" | ac15 != "" ) {
for (var n = 16 ; n<20 ; n++) {
this.getField("ac."+n).display = display.visible;}}
}
Attachments:
You must be logged in to view attached files.Merlin
Maître des clésL’ordre d’exécution des événements dans les champs de formulaire PDF
https://www.abracadabrapdf.net/ressources-et-tutos/js-et-formulaires-ressources/lordre-dexecution-des-evenements-dans-les-champs-de-formulaire-pdf/
Merlin
Maître des clésBonjour
1 Il faudrait placer le script en script de validation, pas en script de calcul.
De plus tous les scripts et actions de calcul de tous les champs d’un document se déclenchent tous à chaque fois qu’un champ du document, y compris les boutons, passe par l’état “champ désactivé”. Ce qui peut vite devenir pénalisant en terme de performances et d’expérience utilisateur.
Les scripts de calculs sont à éviter autant que possible.
2 Pour moi une variable qui n’est utilisée qu’une seule fois et qui ne change pas de valeur ne sert à rien d’autre qu’à encombrer la mémoire, en tel cas je mettrais les noms de champs directement dans les conditions if.
3 C’est possible mais je préfère toujours faire comme toi car je trouve que c’est trop prise de tête.
Par-contre dans ce cas précis la double numérotation des suffixes serait avec toi puisqu’elle rendrait les boucles inutiles. Si les champs étaient nommés comme les champs “ab” de la capture ci-jointe, pour afficher la deuxième rangée tu pourrais utiliser :
this.getField("ab.1").display = display.visible;
Qui affiche tous les champs enfants du champ virtuel “ab.1”, peut importe leur nombre.
-
Cette réponse a été modifiée le il y a 3 années et 3 mois par
Merlin.
Attachments:
You must be logged in to view attached files.19 janvier 2022 à 17:49 en réponse à : Alignement du texte au sein d’un champ de formulaire (en haut ou en bas) #70447Merlin
Maître des clésOui ne regrette pas trop, pas de JavaScript et une curieuse façon de mémoriser les paramètres.
C’est une implémentation un peu bancale, mais c’est hélas d’origine.
☹
Merlin
Maître des clésBonjour.
Quand on envoie vers une page via JavaScript le haut de la page ciblée est toujours visible.
// NAVIGATION DANS LES PAGES D'UN DOCUMENT PDF
// EN JAVASCRIPT LES NUMÉROTATIONS COMMENCENT À ZÉRO, LE NUMÉRO DE LA PAGE CIBLE EST DONC TOUJOURS ÉGAL À N-1
// aller à la vue précédente*
app.execMenuItem("GoBack");
// aller à la page précédente
this.pageNum--;
// aller à la page suivante
this.pageNum++;
// aller à la dernière page
this.pageNum = this.numPages - 1;
// aller à la première page
this.pageNum = 0;
// aller à la page 4
this.pageNum = 3;
Merlin
Maître des clésBonjour Jean-Claude
// CHANGER LA COULEUR DES TEXTES (PAR DÉFAUT) LORS DE L'IMPRESSION
// ACTION DOCUMENT WILL PRINT
var bSale = this.dirty;
for (var i=0; i<this.numFields; i++) {
var oFld = this.getField(this.getNthFieldName(i));
if (oFld.type == "text" && oFld.value == oFld.defaulValue) {
oFld.value = "";
}
}
this.dirty = bSale;
// ACTION DOCUMENT DID PRINT
var bSale = this.dirty;
for (var i=0; i<this.numFields; i++) {
var oFld = this.getField(this.getNthFieldName(i));
if (oFld.type == "text" && oFld.value == "") {
oFld.value = oFld.defaulValue;
}
}
this.dirty = bSale;
19 janvier 2022 à 11:00 en réponse à : Alignement du texte au sein d’un champ de formulaire (en haut ou en bas) #70430Merlin
Maître des clésAttention : pour cette dernière étape il faut utiliser l’outil Main (mode saisie).
Attention aussi : il faut que les champs restent remplis (même avec une espace) car sinon ces propriétés ne sont pas enregistrées.
Attachments:
You must be logged in to view attached files.19 janvier 2022 à 10:58 en réponse à : Alignement du texte au sein d’un champ de formulaire (en haut ou en bas) #70427Merlin
Maître des clésMerlin
Maître des clésJe les ai toutes dans l’ordre chronologique, c’est peut être un problème d’horloge ?
Merlin
Maître des clésPS : Bizarre, ma réponse est bien la dernière mais n’est pas située après l’avant-dernière de Merlin !!!
Reload ! 🔄
😉
Merlin
Maître des clésC’est un paradoxe, pour aider à la saisie de noms de villes à l’orthographe “compliquée” on se retrouve avec un problème avec les noms “simples” qui sont utilisés par plusieurs villes. 🤔
Faute d’avoir une solution j’ai un autre (petit) problème à ajouter : certaines villes partagent un même code postal, si par exemple je cherche Labeaume par son code postal (07120) c’est la ville de Pradons qui s’affiche (c’est la première qui utilise le 07120 dans l’ordre alphabétique inverse).
De mémoire il y a au moins 5 villes qui partagent ce code postal…
Il va falloir faire confiance au bon sens de l’utilisateur.
🙏
Merlin
Maître des clésMerlin
Maître des clésBonjour
Un dessin vaut mieux qu’un long discours :
(attention quand même, la valeur d’un champ “mot de passe” n’est jamais exportée avec les autres données)
Attachments:
You must be logged in to view attached files.Merlin
Maître des clés👍
Merlin
Maître des clés“j’ai testé et cela fonctionne sur Adobe mais toujours pas sur notre logiciel. J’essaye de comprendre…”
A priori la réponse est simple (et peu plaisante) : ce logiciel ne supporte pas toutes les fonctionnalités d’ECMAScript.
Voir : https://www.abracadabrapdf.net/format_pdf/normes_iso_et_pdf/norme-iso-ecmascript-for-pdf/
Merlin
Maître des clés“C’est effectivement une méthode que je n’utilise pas, et ici elle ne convient pas !”
Oui, je n’avais pas fait attention aux cases. 😩
“Quel script peut-on mettre dans l’onglet « Actions » du champ de texte pour afficher un pop up qui liste le contenu des infobulles des champs non complétés ?”
Le plus simple, le plus ergonomique et le plus intuitif pour l’utilisateur final c’est de mettre un contour rouge aux champs obligatoires, contour qui devient transparent quand le champ est rempli. C’est très visuel, ça lui permet de voir l’avancement du remplissage au fur et à mesure et ça lui évite de chercher un intitulé (infobulle) obscur dans un document qui est farci d’intitulés de partout.
Et ça évite au développeur de devoir gérer des listes, des noms et un champ supplémentaire à affichage variable.
Pour faire ça dans chaque champ obligatoire je met un script en action “champ désactivé” qui vérifie si un “event” a eu lieu ou qui vérifie si le champ a été rempli, et qui change la couleur de contour en fonction du résultat.
Merlin
Maître des clésbebarth, tu crées des scripts astucieux qui m’épatent, mais là je crois que tu te casses la tête pour rien. 😉
Pour savoir si un champ a été rempli ou coché il n’y a pas besoin de savoir ce qu’il contient ni de savoir de quel type il est, il suffit de comparer sa valeur active avec sa valeur par défaut.
On peut donc simplifier le script ainsi :
var nbChps=0;
// Vérifie tous les champs du document
for (var i=0; i<this.numFields; i++) {
var f = this.getField(this.getNthFieldName(i));
// si le champ est obligatoire ET si sa valeur est égale à sa valeur par défaut
if (f.required==true && f.value == f.defaultValue) {nbChps++}
}
// Affichage du message
if (nbChps!=0) {
if (nbChps==1) app.alert("Un champ n'est pas rempli.",3);
else app.alert(nbChps+ " champs ne sont pas remplis.",3);
}
Merlin
Maître des clésBonjour
C’est le problème inverse de celui de l’autre jour, dans cette ligne :
var results = dialog.store();
la variable “results” est déclarée avec “var”, ce qui en fait une variable locale (qui n’existe que dans et pour la fonction).
Du coup le script qui s’exécute dans le bouton juste après la fonction n’a pas accès à cette variable et donc ne peut pas remplir le champ texte.
Pour que le script du bouton puisse accéder à cette variable il faut la déclarer comme globale, et donc remplacer la ligne ci-dessus par :
results = dialog.store();
Par ailleurs il me semble qu’il y a un petit bug (humain) dans la boite de dialogue :
😀
Attachments:
You must be logged in to view attached files.Merlin
Maître des clés“j’aimerais verrouiller mes formulaires de façon efficace comme ce fichier que l’on trouve disponible sur le net”
Et pour finir, le fichier que tu cites n’est pas protégé ni chiffré ni verrouillé.
C’est juste que tu n’as pas le logiciel nécessaire pour l’ouvrir et le modifier.
😎
Merlin
Maître des clés“Lorsque je verrouille mes fichiers via mon logiciel d’édition, il est assez facile de les déverrouiller via certains sites web, même lorsque je spécifie un mot de passe complexe.”
Ce qu’on appelle souvent à tort des “protections” ne sont en fait que des “restrictions d’usage”. En réalité ce sont des instructions ajoutées au fichier et qui indiquent les restrictions à appliquer.
L’ennui c’est qu’il suffit tout simplement d’ignorer ces instructions pour ignorer les restrictions d’usage, c’est ce que font tous les services en ligne qui proposent de “déverrouiller” un PDF.
La vraie protection “simple” fournie de base avec Acrobat, avec un vrai chiffrement total du fichier, c’est la protection par mot de passe à l’ouverture. Mais ça ne conviendra pas dans ton cas car quand on a ledit mot de passe on a pleinement accès à tout le contenu du fichier.
Merlin
Maître des clés“Je suis enseignant et je fais quelques contrôles sous forme de formulaires pdf et je ne veux pas qu’un jour certains petits malins trouvent qu’avec un logiciel d’édition pdf on peut avoir toutes les réponses.”
Ne t’inquiètes pas, ils sont déjà tous au courant. 😉
La protection d’un document est toujours un compromis entre sécurité et facilité d’utilisation.
Les formulaires XFA-PDF n’ont de PDF que le nom, leur structure n’a en fait rien à voir avec le format PDF, s’ils ont le suffixe “.pdf” c’est juste pour permettre directement leur ouverture avec Acrobat (les XFA-PDF ne fonctionnent dans aucun autre logiciel et ne fonctionnent pas du tout sur mobile).
Dans ton cas il y aurait deux “vraies” possibilités de protection, mais il faudrait faire des sacrifices :
- utiliser la fonction “Envoyer pour signature” pour envoyer les contrôles aux élèves. La protection est totale mais les formulaires “Adobe Sign” ne peuvent pas contenir d’actions ni de calculs ni de JavaScripts, juste de “bêtes” champs à remplir…
- utiliser la protection par Certificat, ça ne fonctionne qu’avec Acrobat (y compris sur mobile) et c’est assez lourd à mettre en place car chaque élève doit avoir son fichier “ID numérique” et toi tu dois avoir le certificat d’échange (ou “certificat d’identité approuvé”) de chaque élève pour pouvoir leur envoyer un document protégé (de plus il faudrait les envoyer un par un).
Voir : https://www.abracadabrapdf.net/ressources-et-tutos/protection-ressources/protection-par-certificat/
Donc le plus simple à mon avis serait de te contenter de la minification et de revoir le fonctionnement de ton formulaire.
Par exemple en privilégiant de simples champs à remplir plutôt que des listes contenant déjà la bonne réponse, etc.
Une autre possibilité serait de cacher les réponses dans les scripts en les noyant dans un flot de texte inutile et en les rédigeant en Unicode, de façon à rendre tout “piratage” très complexe, donc non rentable et peu intéressant.
Voir : https://www.abracadabrapdf.net/ressources-et-tutos/js-et-formulaires-ressources/pdf-javascript-et-unicode/Merlin
Maître des clésIl y a un message à l’ouverture du fichier « L’arborescence de la page contient un noeud incorrect. ».
C’est un problème de structure du document, ce n’est pas lié aux champs de formulaire ni à JavaScript.
Merlin
Maître des clésc’est ce qu’on appelle une collision de variables
On peut aussi éviter les collisions en plaçant le mot “var” devant la variable lors de sa déclaration, ainsi on utilise une variable “locale” et non pas une variable “globale”.
Merlin
Maître des clésBonjour et bonne année
Ces boucles utilisent une variable nommée “i”.
Tous les champs “diff.n” utilisent chacun un script de calcul qui utilise aussi une variable nommée “i”.
Un script de calcul se déclenche à chaque fois qu’un champ du document passe par l’état “désactivé”, que l’action vienne d’un humain ou d’un script.
Ce qui a deux conséquences :
- la variable “i” des boucles est immédiatement interceptée et modifié par le premier calcul déclenché, c’est ce qu’on appelle une collision de variables et c’est pour ça que les boucles ne fonctionnent que sur la première itération.
- à chaque fois qu’un champ est modifié cela déclenche les 52 calculs des champs “diff.n” (et il y a peut être d’autres calculs ailleurs, je n’ai pas vérifié).
Donc quand on boucle sur 52 champs cela fait 52 x 52 calculs à effectuer : c’est pour ça que ça rame.
Ci-joint, j’ai remplacé “i” par “t” dans les boucles de remplissage et de reset. Dans la mesure où le remplissage et le reset des champs n’est effectué qu’une fois (ou deux) par l’utilisateur on peut considérer le temps de latence comme acceptable. Sinon il faudrait “pousser” les valeurs depuis chaque menu déroulant correspondant, au lieu de les “tirer” avec un calcul.
J’ai aussi ajouté une protection qui empêche les script de s’arrêter si un champ n’existe pas.
Attachments:
You must be logged in to view attached files.Merlin
Maître des clés1 Il y a une erreur dans cette ligne :
if ((event.target.type == "combobox" && event.name == "
Format") || (event.target.type == "listbox" && event.name == "Keystroke")) {À remplacer par :
if ((event.target.type == "combobox" && event.name == "Keystroke") || (event.target.type == "listbox" && event.name == "Keystroke")) {
2 Le script devrait être placé en script de “Touche personnalisé” et non pas en script de Format (un script de Format ne modifie que l’affichage, pas la valeur elle-même. Ce qui explique que la valeur du 2e menu revienne toujours à sa valeur par défaut).
Ci-joint.
Attachments:
You must be logged in to view attached files.29 décembre 2021 à 15:32 en réponse à : Champs obligatoires (boutons radio) multipage et valeurs #70212Merlin
Maître des clésUne autre solution simple : dans le champ “résultat” afficher un message (en rouge*) expliquant qu’il faut que tout soit coché pour déclencher l’affichage du résultat.
Et y afficher le résultat à la place du message quand tout est OK.
- On peut aussi le faire clignoter si besoin 😉
29 décembre 2021 à 12:02 en réponse à : Ajouter les pages d’un document joint à partir d’un bouton d’action #70211Merlin
Maître des clésBonjour
Si par “document joints” tu entends “pièces jointes du document PDF” il y a moyen de faire autrement, on peut facilement afficher une pièce jointe, surtout si elle est en PDF.
28 décembre 2021 à 16:42 en réponse à : Champs obligatoires (boutons radio) multipage et valeurs #70207Merlin
Maître des clésOn ne peut (heureusement) pas empêcher un utilisateur d’enregistrer un document, par contre au moment où il enregistre rien n’empêche de lui afficher un message explicatif si tout n’est pas rempli.
28 décembre 2021 à 11:20 en réponse à : Champs obligatoires (boutons radio) multipage et valeurs #70194Merlin
Maître des clésBonjour
Je ne suis pas certain de bien comprendre la question.
Vu comme ça pour moi il y aurait deux solutions, soit rendre tous les boutons-radios obligatoires, soit ne déclencher le calcul final que quand tous les groupes de boutons-radio sont cochés.
Cette dernière solution étant à mon avis la plus fiable et la plus logique car elle n’afficherait pas un résultat faux ou partiel lors de la saisie utilisateur.
Merlin
Maître des clésBonjour
Si tu as réussi à poster ici il n’y a pas de raison que ça ne fonctionne pas ailleurs…
En tous cas tu peux toujours poster ta question ici, il y sera répondu même si je n’arrive pas à la déplacer.
😎
Merlin
Maître des clésC’est possible si et seulement si l’utilisateur utilise Firefox et le plugin Acrobat.
Autant dire qu’on perd la plus grande partie des utilisateurs avant même d’avoir commencé.
Il existe une autre méthode : forcer le téléchargement du PDF et forcer son ouverture avec Acrobat ou Foxit Reader.
Voir :
Merlin
Maître des clés👍
Merlin
Maître des clésBonjour
Il y a deux problèmes :
1- Dans la première ligne du script
str = event.target.value;
signifie “la valeur du champ du champ actif”, c’est à dire la valeur déjà affichée par ce champ.
Alors que
str = event.value;
signifie “la valeur qui vient d’être saisie”, ce qui n’est généralement pas la même chose.
Donc il faut remplacer la 1re ligne ci-dessus par la 2e.
2- L’emplacement du script n’est pas bon.
Un script de Format ne change jamais la “vraie” valeur d’un champ, il ne change que l’affichage de cette valeur (il faut penser aux formats de Date : la date ne change pas, c’est seulement sa présentation qui change).
Donc dans ce cas il faut utiliser un script de Validation, qui modifie vraiment la valeur saisie.
Ce tuto devrait t’aider à y voir plus clair dans l’ordre d’enchainement des évènements :
L’ordre d’exécution des événements dans les champs de formulaire PDF
-
Cette réponse a été modifiée le il y a 3 années et 4 mois par
Merlin.
Attachments:
You must be logged in to view attached files.Merlin
Maître des clésCeci pourrait peut être aider à répondre à ta dernière question (dont je ne connais pas la réponse) :
Merlin
Maître des clésLe problème c’est la boucle :
for (var i = 0; i < this.numFields; i++) {
this.numFields ça veut dire : nombre de champs contenus dans le document (199 dans ce document).
Les champs à calculer sont nommés avec des suffixes qui vont de xxxxx.0 à xxxxx.52
Comme il y a plus que 52 champs dans le document quand “i” arrive à la valeur 53 ça provoque une erreur puisque ces champs n’existent pas (en JavaScript “null” ça veut dire : n’existe pas).
Donc il faut remplacer la ligne ci-dessus par celle-ci, qui indique zéro comme valeur de départ et 52 comme valeur à ne pas dépasser :
for (var i = 0; i < 53; i++) {
-
Cette réponse a été modifiée le il y a 3 années et 4 mois par
Merlin.
Merlin
Maître des clésBonjour
“Le champ n’existe pas” parce-que tu fais faire une boucle au script alors qu’il n’y a que des champs “.0“, donc pas besoin de boucle ni de “+i“.
if (this.getField("CheckBox.0").value == "A" & this.getField("TheckBox.0").value != "D") {
app.alert({cMsg:"Attention, les apprentis ne peuvent pas être au lycée quand les élèves sont en PFMP ou en vacances", nIcon:2});
this.getField("CheckBox.0").value = "Off"
}
Attachments:
You must be logged in to view attached files.Merlin
Maître des clésSi jamais tu avais peur de t’ennuyer pendant les fêtes il y a d’autres ressources listées ici :
🤓
Merlin
Maître des clésTu as raison de préciser qu’il est inutile d’exécuter les 53 scripts; J’avais remarqué que lorsque j’ai un pdf dans lesquels trop de champs contiennent des scripts
C’est pour ça que mon exemple n’utilise qu’un seul script de calcul dans un seul champ.
😎
Ce que tu appelle script de touche personnalisée
Voir capture jointe et voir aussi ce tuto, mais je ne connais pas les équivalences avec PDF XChange Editor Plus :
L’ordre d’exécution des événements dans les champs de formulaire PDF
Attachments:
You must be logged in to view attached files.Merlin
Maître des clésBonjour
- C’est parce-que les couleurs ne sont pas référencées correctement il manque /255, voir le script ci-dessous. Si la 1re fonctionnait c’est parce qu’elle n’utilisait que 255 et 0, si la dernière fonctionne c’est parce-que c’est une couleur nommée.
2. Il faut placer le script à la suite du calcul existant dans le bouton CALCUL, voir le ci-joint.
for (var j = 0; j < 53; j++) {
if (this.getField("diff."+j).value === 0) {
this.getField("diff."+j).fillColor = color.transparent;}
else if (this.getField("diff." +j).value === 1) {
this.getField("diff."+j ).fillColor = ["RGB", 0/255, 255/255, 0/255];}
else if (this.getField("diff." +j).value === 2) {
this.getField("diff."+j ).fillColor = ["RGB", 255/255, 205/255, 0/255];}
else if (this.getField("diff." +j).value === 3) {
this.getField("diff."+j ).fillColor = ["RGB", 255/255, 180/255, 0/255];}
else if (this.getField("diff." +j).value === 4) {
this.getField("diff."+j ).fillColor = ["RGB", 255/255, 149/255, 0/255];}
else if (this.getField("diff." +j).value === 5) {
this.getField("diff."+j ).fillColor = ["RGB", 255/255, 122/255, 0/255];}
else if (this.getField("diff." +j).value === 6) {
this.getField("diff."+j ).fillColor = ["RGB", 255/255, 102/255, 0/255];}
else if (this.getField("diff." +j).value === 7) {
this.getField("diff."+j ).fillColor = ["RGB", 255/255, 77/255, 0/255];}
else if (this.getField("diff." +j).value === 8) {
this.getField("diff."+j ).fillColor = ["RGB", 255/255, 54/255, 0/255];}
else if (this.getField("diff." +j).value === 9) {
this.getField("diff."+j ).fillColor = ["RGB", 255/255, 37/255, 0/255];}
else if (this.getField("diff." +j).value === 10) {
this.getField("diff."+j ).fillColor = color.red;}
else {this.getField("diff."+j ).fillColor = color.transparent;}
}
Attachments:
You must be logged in to view attached files.Merlin
Maître des clésJe crois que le script est plus logique et plus compréhensible ainsi, j’ai changé le nom des variables :
var comptA = 0;
var comptB = 0;
var comptC = 0;
// Itération de tous les champs du document
for (var i = 0; i < this.numFields; i++) {
var oFld = this.getField(this.getNthFieldName(i));
// si le champ est de type "checkbox" et si son nom contient "CheckBox" et si sa valeur n'est pas nulle
if ((oFld.type == "checkbox") && (/CheckBox/.test(oFld.name)) && (oFld.value != "Off")) {
if (oFld.value == "A") {comptA += 1;}
if (oFld.value == "B") {comptB += 1;}
if (oFld.value == "C") {comptC += 1;}
}
}
this.getField("LT").value = comptA;
this.getField("ET").value = comptB;
this.getField("VT").value = comptC;
Merlin
Maître des clésvar compt0 = 0;
var compt1 = 0;
var compt2 = 0;
// Itération de tous les champs du document
for (var i = 0; i < this.numFields; i++) {
var oFld = this.getField(this.getNthFieldName(i));
// si le champ est de type "checkbox" et si son nom contient "CheckBox" et si sa valeur n'est pas nulle
if ((oFld.type == "checkbox") && (/CheckBox/.test(oFld.name)) && (oFld.value != "Off")) {
if (oFld.value == "A") {compt0 += 1;}
if (oFld.value == "B") {compt1 += 1;}
if (oFld.value == "C") {compt2 += 1;}
}
}
this.getField("LT").value = compt0;
this.getField("ET").value = compt1;
this.getField("VT").value = compt2;
Merlin
Maître des clésCi-joint, le script se trouve dans le champ masqué “CALCUL”.
Pour que des cases à cocher fonctionnent comme des boutons-radios il faut que chaque rangée (par exemple) de cases ait le même nom et une valeur d’exportation différente, comme dans le ci-joint.
Le script fait les totaux en fonction de la valeur d’exportation de chaque coche, s’il y en a une (valeur).
Attachments:
You must be logged in to view attached files.Merlin
Maître des clésDans mon premier message, le fichier est attaché, je suis le seul à le voir ?
OTAN pour moi, je m’étais concentré sur le 2e message. 😵
Ton document à l’air bien inutilement compliqué, je répondrai plus longuement demain.
Merlin
Maître des clésSinon tu peux utiliser JavaScript, en modifiant un tout petit peu cet exemple ça devrait le faire :
Script pour ajouter un bouton avec action Page suivante sur fichiers pdf
Merlin
Maître des clésBonjour
En fait il faut prendre le problème à l’envers, c’est très rapide.
Pour commencer il faut supprimer tous les boutons déjà créés, sauf un. Ça se fait en tournemain dans la liste des champs du panneau “Préparer le formulaire” d’Acrobat Pro.
Ensuite il faut soigneusement paramétrer le bouton restant en lui attribuant tous les paramètres (position, aspect, action, etc) nécessaires.
Et pour finir, clic-droit sur le bouton : Dupliquer sur toutes les pages.
C’est terminé.
Pour les autres documents il suffit de copier-coller un bouton et de le dupliquer de la même manière sur toutes pages.
Merlin
Maître des clés🤗
Merlin
Maître des clésBonjour
C’est une propriété du document, pas un réglage du logiciel.
Tu étais à deux doigts de la solution : menu Fichier : Propriétés : Vue initiale
La suite en image :
Attachments:
You must be logged in to view attached files.Merlin
Maître des clésBonjour
Est-ce que ce sont des cases à cocher indépendantes ou bien est-ce qu’elles fonctionnent avec un choix unique pour chaque ligne (comme des boutons-radio) ?
Peux tu partager ton document ou un exemple ?
11 décembre 2021 à 23:06 en réponse à : Générer un numéro unique non aléatoire dans un champ texte #70106Merlin
Maître des clés👍
J’ajoute juste qu’avec le script de bebarth le champ COMPTEUR ne doit surtout pas être au format “nombre”, ce qui supprimerait les zéros directeurs de toute façon.
Par principe, un champ dont le contenu est issu d’un calcul ou d’un script, donc non modifiable par l’utilisateur, n’a pas besoin d’avoir un “format”, puisque la valeur obtenue a déjà ce format.
-
Cette réponse a été modifiée le il y a 3 années et 3 mois par
-
AuteurRéponses