Toutes mes réponses sur les forums
-
AuteurRéponses
-
2 juin 2025 à 18:00 en réponse à : Sauvegarder un formulaire sur le bureau de plusieurs utilisateurs #76051
Merlin
Maître des clésBonjour
Ce n’est malheuresement pas possible dans le cas que tu décris. Sécurité oblige, ça ne peut fonctionner que depuis un script d’application (voir : https://www.abracadabrapdf.net/?p=2990).
Concernant le nom, tout ce que tu peux faire c’est afficher une boite d’alerte avant l’enregistrement pour suggérer un nom de fichier, à copier-coller par l’utilisateur.
Concernant le chemin d’accès il n’y a pas de contournement possible.
Merlin
Maître des clésSalut
Mes cours de math sont loins, mais je crois me souvenir que l’addition de deux nombres négatifs donne nécessairement un résultat négatif.
De même que l’addition de deux nombres positifs donne un résultat positif.
Merlin
Maître des clésCe soir j’étais plutôt dans « Légion », j’ai regardé Terminator Dark Fate.
😉
Merlin
Maître des clésIntéressant, mais j’ai failli zaper avant la fin de l’intro (un peu trop longue) !
Attachments:
You must be logged in to view attached files.Merlin
Maître des clésTu n’as pas posté le lien vers la vidéo
😉
Merlin
Maître des clésJe crois que jctremblay sera d’accord avec moi : « intelligence artificielle » est une mauvaise traduction de l’anglais (comme Réseaux sociaux qu’on aurait du traduire par Réseaux relationnels).
En anglais américain « intelligence » signifie plutôt « traitement de l’information » ou « renseignement », comme dans CIA (Central Intelligence Agency).
Un peu comme quand en français on parle « d’intelligence avec l’ennemi ».
Merlin
Maître des clésBonjour
– Qu’est-ce que le format HR ?
– Le 1 et le 2 sont possibles en PDF, mais le 2 demanderait une manip de plus à l’utilisateur. En tout cas c’est une solution qui ne fonctionnera que si l’utilisateur se sert d’Acrobat ou de Foxit Reader qui sont de « vrais » logiciels lecteurs de PDF.
Avec tout autre logiciel (comme les navigateurs Edge, Chrome…) le fonctionnement du document serait dégradé, voire ne fonctionnerait pas du tout.Merlin
Maître des clésIl faut utiliser « break » :
Merlin
Maître des clésBonjour
Ça c’est une question pour jctremblay, il est à fond dedans en ce moment !
😉
Merlin
Maître des clésMerlin
Maître des clésPar ailleurs, quand on veut des valeurs d’exportation différentes qui répresentent au final la même somme il faut savoir que :
7
7,0
7,00
7,000
sont des valeurs d’exportation différentes pour des cases à cocher (ou des boutons-radio) mais représentent le même nombre dans un calcul.
Dans ton exemple ça semblait fonctionner grâce aux arrondis mais 7,1 n’est pas égal à 7.
Ca peut poser des problèmes lors de calculs plus complexes.
Merlin
Maître des clésComme quoi il est important de poster un exemple : souvent la bonne réponse vient de l’abandon de la « mauvaise » question.
Dans le ci-joint la deuxième rangée est en lecture seule, c’est la première qui contrôle tout.
Il y a un script d’action dans les coches, et un script de validation dans le champ texte/nombre.
Attachments:
You must be logged in to view attached files.Merlin
Maître des clésPS : ne pert pas de vue non plus que comme le script « sera imprimé » (Will Print) le script « sera enregistré » (Will Save) n’est pas bloquant, il ne peut pas empêcher l’action d’enregistrement de se produire.
Merlin
Maître des clésBonjour
Fais attention qu’on ne peut pas intégrer le script tel quel, il faut d’abord le convertir en une chaine de caractères (string), notament pour échapper les balises.
Voir ce sujet : https://www.abracadabrapdf.net/forums/topic/ajout-de-line-de-code-avec-javascript/
Merlin
Maître des clésSalut
– Les PDF-JavaScripts n’ont pas accès aux dossiers « sensibles » de l’ordinateur, je ne sais pas si «Application Support» (ou « Library » sur Mac) en fait partie.
– Si ça doit fonctionner sur les deux plateformes Windows/Mac il sera plus facile de paramétrer le chemin d’accès vers le dossier Documents de l’utilisateur.
Merlin
Maître des clésBonjour
Oui, n’hésite pas à joindre un exemple, parce-que ce n’est pas très clair.
Mais surtout sans support il est difficile de fournir une réponse vraiment adéquate.
Merlin
Maître des clésMoi aussi j’avais bricolé.
Ça m’est revenu entre-temps, c’était pour des couleurs de soulignement et je ne voulais pas que « blanc » apparaisse en tête de liste. Donc j’ai mis son nom en anglais. 😉
Attachments:
You must be logged in to view attached files.Merlin
Maître des clésSalut
Je me souviens avoir déjà eu un probème identique il y a quelques années, je crois qu’effectivement on ne peut rien faire contre.
Par-contre ce n’est pas une limitation d’Acrobat, c’est une limitation d’EcmaScript 😉
Merlin
Maître des clés« Ok merlin, mais j’ai besoin d’une balance par ligne oui ou non, pas les deux. »
Je ne comprend pas « balance ».
Dans l’exemple que j’ai posté chaque rangée peut être cochée oui ou non, mais pas les deux à la fois.
Merlin
Maître des clésBonjour
Les boutons-radio c’est la misère.
Ci-joint avec des cases à cocher : chaque rangée à des cases qui ont le même nom mais avec une valeur d’exportation différente (oui/non).
==> https://acrobat.adobe.com/id/urn:aaid:sc:EU:9481f177-4423-44f3-a1ab-99dc38ccf6d8
Merlin
Maître des clésBonjour
J’en profite pour attirer ton attention sur le fait qu’en France la mention « Lu et appouvé » n’a plus aucune valeur juridique depuis la loi n°80-525 du 12 juillet 1980.
Tu pourrais donc t’en passer 😉
Merlin
Maître des clésSalut
Pour moi rien ne fonctionne, je crois que c’est dû au script RAZ car la console le signale en erreur à chaque clic sur une coche.
Il y a aussi une accolade mal placée dans les fonctions laCouleur, qui fait que la condition else ne peut jamais s’exécuter.
Je ne comprend pas les fonctions « laCouleur », si je lis le script il doit changer successivement les couleurs de tous les champs en fonction de la valeur de chaque coche rencontrée. C’est à dire à changer la couleur de tous les champs à chaque fois qu’il rencontre une coche.
C’est donc forcément la dernière qui leur donnera leur couleur définitive.
Je suppose donc que ce n’est pas le but, que veux tu faire exactement ?
Dans le script RAZ il manque une accolade, et il tente de génèrer une variable à partir d’un élément qui n’existe pas : var P3
Mais je ne comprend par quoi il est déclenché.
Quoi qu’il en soit il s’exécuterait plus vite en le simplifiant ainsi :
function Raz() {
//decoch();
for (var i=0; i<this.numFields; i++) {
var nomChamp=this.getNthFieldName(i);
var b = nomChamp.split(".");
var P1 = (b[0]);
// var P2 = (b[1]); // inutile
// var P3 = (b[2]); // b2 n'existe pas
if (P1=="A" || P1=="AA" || P1=="B" || P1=="BB") {this.getField(nomChamp).value="";}
}
}
Merlin
Maître des clésMerci.
En plus de l’attribut Sans retour, rien n’interdit de modifier l’approche dans le style de caractère.
Merlin
Maître des clés« ou y a-t-il possibilité qu’ils le soient sans espaces ? »
Dans ce cas ce n’est pas un problème, InDesign ne coupe pas les nombres.
😉
Merlin
Maître des clésBonjour
« c’est dans indesign, c’est pour le trouver et le remplacer par un espace insécable. »
Ce n’est pas la meilleure méthode.
Le plus efficace c’est un style GREP qui applique l’attribut « sans retour automatique » via un style de caractère, soit à l’espace seule, soit au nombre en entier, ce qui revient au même.
Ainsi il n’y a plus besoin d’y penser par la suite, même en cas de modification ou d’ajout dans le texte.
La requête à utiliser : \d{1,3}?\s\d{1,3}\s\d{3,3}
Lors des copier-coller « \s » (espace quelconque) est remplacé par une espace, ce n’est pas grave. Ci-dessus j’ai mis \s car c’est plus visuel.
Attachments:
You must be logged in to view attached files.Merlin
Maître des clésTop !
Du coup c’est une liste qui n’est plus déroulante mais ça fonctionne avec Edge et Chrome.
Merlin
Maître des clésBonjour et bienvenue
Qu’il existe d’autres logiciels qu’Acrobat Pro pour faire ça je n’en doute pas (Callas, Pitstop…).
Par-contre qu’il en existe des gratuits ça m’étonnerait car c’est un marché de petite niche et le développement de tels logiciels spécialisés est coûteux.
Je ne peux pas mieux te répondre, sinon te dire qu’on n’est pas obligé de s’abonner à Acrobat, c’est le seul logiciel Adobe qui est également disponible à l’achat (licence à vie).
Merlin
Maître des clésAvec Edge ou Chrome c’est encore pire, la liste n’affiche qu’une seule ligne quel que soit le cas. Et avec Apple Aperçu aucun espoir non plus.
Afficher le texte dans un champ de texte adjacent est possible mais ce ne sera pas instantané, il faut d’abord que l’utilisateur sélectionne un item dans la liste pour qu’il s’affiche.
Merlin
Maître des clésBonjour et bienvenue
La réponse courte c’est : pas possible.
La réponse longue c’est : on peut quand même le faire mais c’est bancal car quand la liste est activée les items ne s’affichent que sur une seule ligne et sont donc illisibles. Ils ne sont lisiblesque quand la liste est désactivée et si on a prévu une hauteur suffisante.
Autre inconvénient : on ne peut pas la remplir manuellement, il faut impérativement utiliser JavaScript pour remplir la liste en plaçant des retours de ligne (\n) dans le texte, ce qui devient vite laborieux.
C’est une limitation du format PDF, ce n’est pas lié à un logiciel en particulier.
Par exemple dans le PDF exemple ci-joint (où je n’ai mis que les deux premiers items) il faut utiliser le script ci-dessous dans la Console JavaScript pour remplir la liste déroulante :
var l = this.getField("liste");
l.setItems(["Sélectionner","LIT-201 – Introduction à la littérature musicale\nLe cours LIT-201 explore les grandes périodes et aborde les œuvres majeures\nqui ont marqué l’histoire de la musique en Occident, du Moyen Âge\njusqu’à aujourd’hui. Des genres et des styles variés provenant\ndu répertoire instrumental, vocal, profane et sacré sont étudiés.\nCe cours vise à acquérir des connaissances et des compétences pour apprécier\ndes œuvres représentatives de grandes périodes historiques,\net pour les situer dans leur contexte. Il amènera aussi l’étudiante\net l’étudiant à une meilleure compréhension du langage musical\ngrâce à une initiation à l’analyse.", "LIT-202 – Moyen Âge, Renaissance et baroque\nLe cours LIT-202 aborde les grandes œuvres et explore les différents courants\nqui ont marqué l’histoire de la musique en Occident, du Moyen Âge\njusqu’au milieu du 18e siècle. Des genres et des styles variés\nprovenant du répertoire instrumental, vocal, profane et sacré sont étudiés.\nCe cours vise à acquérir des connaissances et des compétences\npour apprécier des œuvres représentatives de l’époque médiévale,\nde la Renaissance et du baroque, et pour les situer dans leur contexte.\nIl amènera aussi l’étudiante et l’étudiant à une meilleure compréhension du langage musical\ngrâce à une initiation à l’analyse."]);
Comment utiliser la Console : https://www.abracadabrapdf.net/ressources-et-tutos/js-et-formulaires-ressources/console-javascript-d-acrobat/
Attachments:
You must be logged in to view attached files.Merlin
Maître des clésJe fais ça parce que de toute façon il faut ensuite positionner précisément les champs sur les pages. C’est ce qui prend le plus de temps et avec un script ce n’est pas évident ni forcément plus rapide qu’à l’œil.
Merlin
Maître des clésJ’utilise une astuce plus basique, je crée un grand PDF*, par exemple au format A2 ou A1, sur lequel je duplique les champs autant de fois que nécessaire et ensuite je copie-colle le nombre de champs requis sur chaque page du document final.
C’est un truc que j’utilise aussi quand je veux que tous les champs dupliqués n’aient qu’un seul numéro après le point, et non pas deux comme quand on les duplique en grille (colonnes + rangées).
Bien entendu c’est valable pour un petit nombre de page, au dela d’une dizaine il serait certainement plus rentable d’utiliser un script mais je n’ai jamais eu ce cas.
*Avec le plugin « Nouveau » de abracadabraTools
Merlin
Maître des clésJe comprend bien !
Merlin
Maître des clésBravo, mais en fait tu viens de réinventer la roue.
Si j’avais compris que c’était pour faire ça je t’aurais conseillé d’utiliser l’info-bulle
😉
Attachments:
You must be logged in to view attached files.Merlin
Maître des clésNon, pas mieux.
Je t’aurais bien parlé de la Convention de dénomination des champs de formulaire mais il me semble que dans ce cas ce ne serait pas plus pratique.
Merlin
Maître des clésSalut
Souris entrée : afficher un champ
Souris sortie : masquer un champ
En général on utilise un bouton comme support du texte à afficher, avec ou sans image.
Merlin
Maître des clésEt donc en fonction pour mettre en script de document :
function folCoche() {
var sNom = event.target.name;
if (event.target.value != "Off") {
for (var j = 1; j < 5; j++) {
this.getField(sNom + "-" + j).display = display.visible;
}
}
else {
for (var j = 1; j < 5; j++) {
this.getField(sNom + "-" + j).display = display.hidden;
this.getField(sNom + "-" + j).value = "Off";
}
}
}
Attachments:
You must be logged in to view attached files.Merlin
Maître des clésBonjour
Exemple ci-joint, avec en prime un reset des cases à cocher quand elles sont masquées.
var sNom = event.target.name;
if (event.target.value != "Off") {
for (var j = 1; j < 5; j++) {
this.getField(sNom + "-" + j).display = display.visible;
}
}
else {
for (var j = 1; j < 5; j++) {
this.getField(sNom + "-" + j).display = display.hidden;
this.getField(sNom + "-" + j).value = "Off";
}
}
Attachments:
You must be logged in to view attached files.Merlin
Maître des clésOn peut éventuellement aussi reprendre les attributs des boutons existants plutôt que de les réécrire, ça fait un script un peu plus long mais si tu l’utilises sur plusieurs documents ou plusieurs types de boutons se sera plus pratique.
Par-contre on ne peut pas reprendre les actions des boutons, il faut forcément les réécrire.
Exemple :
// POUR BOUTONS LinkT
for (var j = 0; j < 8; j++) {
var b = this.getField("LinkT.A." +j);
var aRect = b.rect; // stocke rect
var contour = b.borderStyle;
var coulContour = b.strokeColor;
var comport = b.highlight;
var corps = b.textSize;
var coulTexte = b.textColor;
var coulFond = b.fillColor;
var poliss = b.textFont;
var label = b.buttonGetCaption();
for (var p = 1; p < this.numPages; p++) { // de la 2e à la dernière page
var f = this.addField("LinkT."+p+"."+j, "button", p, aRect )
f.setAction("MouseUp", "//"); // action à placer dans le bouton
f.borderStyle = contour; // contour
f.strokeColor = coulContour; // couleur du contour
f.highlight = comport; // comportement
f.textSize = corps; // corps
f.textColor = coulTexte; // couleur texte
f.fillColor = coulFond; // couleur de fond
f.textFont = poliss; // police
f.buttonSetCaption(label) // Label
}
}
Merlin
Maître des clésDans le PDF ci-joint j’ai renommé les boutons en remplaçant le « 5 » par un « A » pour ne pas que le script bugge à partir la page 6, mais je pense que tu sauras l’adapter à tes documents.
Ce script duplique les boutons de la page 1 (zéro) sur toutes les autres pages du document.
À copier-coller dans la console :
// POUR BOUTONS LinkT
for (var j = 0; j < 8; j++) {
var b = this.getField("LinkT.A." +j);
var aRect = b.rect; // stocke rect
// console.println("\naRect" + j + ": " + aRect);
for (var p = 1; p < this.numPages; p++) { // de la 2e à la dernière page
var f = this.addField("LinkT."+p+"."+j, "button", p, aRect )
f.setAction("MouseUp", "//"); // action à placer dans le bouton
f.borderStyle = border.s; // contour ligne
f.strokeColor = color.black; // couleur du contour
f.highlight = highlight.i; // comportement inversé
f.textSize = 0; // corps automatique
f.textColor = color.black; // couleur texte
f.fillColor = color.ltGray; // couleur de fond
f.textFont = font.Helv; // police helvetica
f.buttonSetCaption("...") // Label
}
}
// POUR BOUTON AjouT
var b = this.getField("AjouT.A");
var aRect = b.rect; // stocke rect
// console.println("\naRect" + j + ": " + aRect);
for (var p = 1; p < this.numPages; p++) { // de la 2e à la dernière page
var f = this.addField("AjouT."+p, "button", p, aRect )
f.setAction("MouseUp", "//"); // action à placer dans le bouton
f.borderStyle = border.s; // contour ligne
f.strokeColor = color.black; // couleur du contour
f.highlight = highlight.i; // comportement inversé
f.textSize = 0; // corps automatique
f.textColor = color.black; // couleur texte
f.fillColor = color.ltGray; // couleur de fond
f.textFont = font.Helv; // police helvetica
f.buttonSetCaption("Ajouter lien") // Label
}
Attachments:
You must be logged in to view attached files.Merlin
Maître des clésBonjour
J’imagine que les boutons doivent avoir un nom différent sur chacune des pages, c’est bien ça ?
Merlin
Maître des clés« Je n’ai pas pdf expert mais pdf Xchange «
Oups ! 😉
Merlin
Maître des clésbebarth, PDF Expert gère nativement les boites de dialogue (AcroDialog).
Michel va te mettre la misère.
😉
Merlin
Maître des clésEn ce moment je crée des regex pour identifier les NIF (Numéro d’Identification Fiscale) de plusieurs pays.
Dire que je trouvais ça compliqué, ce n’est rien a côté des filetages !
😉
Merlin
Maître des clésPour installer des apps mobiles il faut soit passer par les stores de Google et d’Apple avec toutes contraintes que ça suppose (financières mais pas seulement, il y a aussi des contraintes techniques, de contenu, et de présentation dans le store).
Soit il y a l’installation directe après déverrouillage du système de protection sur chaque appareil utilisateur, sans surprise c’est beaucoup plus simple à faire sur Android que sur iOS.
Merlin
Maître des clésBonjour
Avec PDF Expert je ne sais pas mais avec Acrobat ça ne peut fonctionner que depuis un script d’application (placé dans le sous-dossier « JavaScripts » d’Acrobat, donc sur chaque poste utilisateur).
Sécurité oblige.
Pour le “h” entre HH et MM je crois que que un (ou deux) anti-slash devant le « h » devrait suffire.
Merlin
Maître des clés« On trouve différentes expressions régulières sur internet qui correspondent à une url »
Une des plus simples se trouve ici :
En ce qui nous concerne ici, on peut même se passer des deux métacaractères finaux qui indiquent la fin d’un mot puisqu’on ne risque pas de trouver de ponctuation après.
😉
Merlin
Maître des clésBonjour
Il faut remplir la liste déroulante avec les intitulés (ou « Elément », c’est ce qui est affiché à l’utilisateur) et les valeurs d’exportation (l’URL correspondante).
Ensuite le bouton utilise la valeur d’exportation pour ouvrir le lien (via un navigateur).
Code à utiliser dans le bouton (souris relâchée) :
app.launchURL(this.getField("LISTE").value);
Attachments:
You must be logged in to view attached files.Merlin
Maître des clésBonjour
Je m’étais lancé dans la création d’applications mobiles en 2014, pour finallement tout arrêter en 2018.
J’en ai gardé un mauvais souvenir car ça m’a couté cher, surtout pour iOS (140€/an rien que pour le droit d’inscription* à l’Apple Store), et ça ne m’a pas rapporté grand-chose. Mais je n’utilisais pas un langage de programmation, j’étais abonné à une plate-forme de création (un peu comme WordPress ou Drupal pour les sites web).
Tout ça pour dire que je ne connais pas DART, mais je suppose que si ça a été fait par Google, a priori ça ne fonctionnera pas sur iOS (Apple).
Et pour dire que j’ai constaté qu’il est en fait beaucoup plus facile et moins cher de faire des « web-app ». C’est à dire un site web dédié qui se présente comme une application mobile. La limite étant que, contrairement à une vraie app, ça ne fonctionne pas vraiment bien quand l’utilisateur est hors ligne, malgré les « mises en cache ».
Donc sauf si on veut espionner tout ce que contient le smartphone de l’utilisateur ou faire une application de randonnées en montagne, de spéléologie ou de haute-mer, en général ça se passe bien.
*Chez Google (Android) c’était 50€ à vie (une seule fois).
Merlin
Maître des clésBonjour
Attention cependant car ça écrasera tout script de calcul pré-existant dans ces champs :
for (var i = 0; i < 126; i++) {
this.getField("Vol."+i).setAction("Calculate", "W(event.target.name.substr(4));");
}
Merlin
Maître des clésBonjour
La réponse est oui, ça existe depuis bientôt 30 ans dans Acrobat.
Il faut utiliser l’outil de commentaire « Enregistrer l’audio », cependant attention au poids du fichier car, de mémoire, il me semble que les sons ainsi enregistrés sont peu ou pas compressés.
S’agissant d’un « commentaire » il bénéficie des mêmes options de suivi et de classement que tous les autres outils de commentaire.
Attachments:
You must be logged in to view attached files.Merlin
Maître des clésPour le corps automatique :
f.textSize = "0";
Merlin
Maître des clésScusate, abbiamo approfittato della vostra assenza per deviare un po’ dall’argomento originale.
Ecco un articolo sull’uso della Console JavaScript:
Merlin
Maître des clésTu auras peut-être plus de chance avec ezPDF Reader, à ma connaissance c’est celui qui supporte le plus de fonctions JavaScript sur Android.
Merlin
Maître des clésBonjour
Quel logiciel utilises tu sur Android ?
Une chose est certaine c’est qu’avec Acrobat Mobile ça ne fonctionnera pas, son support de JavaScript est beaucoup trop pauvre.
Merlin
Maître des clés« je ne suis pas trop familier avec l’anglais »
Dans les forums d’Adobe il y a un bouton « Traduire » sous chaque message 😉
Merlin
Maître des clésAdobe a initié cette interface en 2021, elle est affichée par défaut depuis 2023, mais elle n’est toujours pas finalisée, certains outils ne fonctionnent toujours pas, et d’autres très mal (comme qui dirait, ils pédalent dans le yaourt).
Le mieux c’est de commencer par là : Acrobat’s new interface is a disaster
Et de continuer par :
https://community.adobe.com/t5/acrobat-discussions/why-change-everything/m-p/14770316/page/2#M472876
https://community.adobe.com/t5/acrobat-discussions/stop-it-with-the-nonsense-redesigns/td-p/14946257
Mais ce dont ils sont le plus fier c’est d’avoir inversé toute l’interface et d’avoir rendu nécessaires 2 ou 3 clics supplémentaires pour accéder à chaque fonction.
Merlin
Maître des clés« C’est quoi cette nouvelle expérience ? »
C’est la pire modification de l’interface d’Acrobat et de l’interface d’un logiciel professionnel qu’on ait jamais vu.
Je n’en dirai pas plus car je serai tenté de devenir grossier.
😉
Merlin
Maître des clés« En fait, j’ai remarquer que le fichier aT-ProprietesChamp.js n’est pas dans l’installateur d’AbracadabraTools2020 mais seulement dans la version 2019 »
Oups !
Il va falloir que je vérifie ça, de toute façon j’ai prévu une mise à jour pour bientôt car pour l’heure ils ne sont pas compatibles avec la « nouvelle expérience » de l’interface d’Acrobat.
Merlin
Maître des clésPrécision : pour le(s) script(s) de document il faut connaitre son(leurs) nom(s) pour les écraser.
Ci-dessus c’est « init » parce-que je met tous mes scripts ensemble, sous ce nom que j’utilise toujours. Mais ça peut varier en fonction des habitudes de chacun.
Merlin
Maître des clésOui, c’est un peu bête mais les machines s’en moquent pas mal, elles n’ont aucun sens du correct ou de l’esthétisme.
Et comme disait Arnaud Amalric, abbé de Cîteaux, pendant la croisade contre les albigeois :
« Scriptez les tous, Dieu reconnaitra les siens ».
🙂
Merlin
Maître des clésPS : le script ci-dessus ne génère pas d’erreurs bien qu’il s’applique à tous les champs, quel que soit leur type.
Par exemple, ce n’est pas parce-que l’interface d’Acrobat ne propose pas de « Format » ou de « Validation » pour les boutons qu’ils ne peuvent pas avoir un script de Format ou de Validation. Rien n’empêche de le faire avec JavaScript.
Donc je ne me casse pas la tête à détecter le type de champ avant de nettoyer les scripts. J’utilise la méthode « brutale ».
Merlin
Maître des clésBonjour
Oui et non.
Acrobat a un comportement curieux, si on remplace un script par rien ça ne fonctionne pas toujours.
Alors quand je veux « nettoyer » un document je remplace les scripts par un double-slash, ce n’est pas rien mais c’est comme rien, et ça fonctionne à tous les coups :
for (var i = 0; i < this.numFields; i++) {
var oFld = this.getField(this.getNthFieldName(i));
oFld.readonly = true; // verrouiler les champs
oFld.setAction("Format", "//");
oFld.setAction("Keystroke", "//");
oFld.setAction("Calculate", "//");
oFld.setAction("Validate", "//");
oFld.setAction("MouseExit", "//");
oFld.setAction("MouseEnter", "//");
oFld.setAction("MouseUp", "//");
oFld.setAction("MouseDown", "//");
oFld.setAction("OnBlur", "//");
oFld.setAction("OnFocus", "//");
}
this.setAction("WillSave", "//"); // actions de document
this.setAction("WillPrint", "//");
this.setAction("DidSave", "//");
this.setAction("DidPrint", "//");
this.setAction("WillClose", "//");
this.addScript("init", "//"); // script de document
Merlin
Maître des clésBonjour
Si c’est à faire dans des champs de formulaire la réponse est oui.
Sinon c’est non.
Merlin
Maître des clés« Pourtant avec ce fichier, ça fonctionne (il vient d’un ancien fil de discussion, d’ou mon event.commitKey = 13) »
En fait, si on va voir dans le sujet mentionné par Michel, on s’aperçoit que c’est lui qui a proposé ce bout de script.
Nous avons été deux à lui demander pourquoi « 13 », mais il n’a pas répondu.
😉
Merlin
Maître des clés« Il faut utiliser “2”, pas “13”. »
Je mange mon chapeau, la réponse de ChatGPT (qui, comme Googol, ne considère le JavaScript que par rapport aux navigateurs web, d’où le point n°2 qui n’est pas vrai dans ce qui nous intéresse) :
En JavaScript, l’instruction :
event.commitKey = 13;
semble vouloir assigner la valeur 13 à une propriété commitKey de l’objet event.
Explication :
- event : Généralement, c’est un objet représentant un événement (ex : keydown, click, etc.).
- commitKey : Ce n’est pas une propriété standard des objets event. Cela signifie qu’elle a été ajoutée dynamiquement.
- Valeur 13 : Ce nombre correspond au code ASCII/Unicode de la touche Entrée (Enter).
Merlin
Maître des clésChez moi ce fichier fonctionne correctement.
Par contre tu devrais gérer le paramètre nIcon dans les alertes, car « OK » s’affiche à côté de l’icône d’erreur (icône par défaut), ce qui est un peu perturbant.
L’icône Status conviendrait mieux.
Attachments:
You must be logged in to view attached files.Merlin
Maître des clésOui, il faut absolument que je prenne l’habitude de rafraichir ma page avant de répondre, surtout quand elle est affichée depuis la veille.
😉
Merlin
Maître des clésBonjour
Tu pourrais utiliser commitKey pour détecter l’usage de cette touche, mais :
- Il faut utiliser « 2 », pas « 13 ».
- Çe ne détecte que la touche Entrée, pas la touche Retour.
- Il faudrait l’utiliser en fonction dans tous les champs de saisie car cet évènement est détecté lors de la perte du focus (onBlur) par un champ, et non pas seulement quand on utilise ladite touche.
Attachments:
You must be logged in to view attached files.Merlin
Maître des clésBonjour
On ne peut pas exporter les données directement en XLSX, Adobe a préféré utilisé un format ouvert.
Cependant il suffit d’ouvrir le CSV exporté avec Excel ou LibreOffice et de l’enregistrer (sous) au format XLSX.
Merlin
Maître des clésBonjour
Nul besoin de se casser la tête avec des kilomètres de JavaScript, il suffit de créer un troisième champ (masqué) contenant la valeur maximum de G et de D, et de partir de la valeur qu’il contient.
(Image jointe)
Attachments:
You must be logged in to view attached files.Merlin
Maître des clésApparement ton problème vient des guillemets, JavaScript ne supporte que les guillemets droits, tous les autres sont à bannir.
"blablabla"
Merlin
Maître des clésOui, en utilisant une fonction.
Par exemple :
function styl1(A) {
A.strokeColor = color.red;
A.textColor = color.red;
A.textSize = 12;
}
styl1(this.getField("Text1"));
On peut bien entendu aussi mettre le nom du champ en variable.
Merlin
Maître des clés« Je crois même qu’on apprend ça en fin de primaire… »
C’est te dire pendant combien de temps j’en ai cauchemardé…
🙂
Merlin
Maître des clésTu devrais mettre les accolades, on est d’accord que quand il n’y a qu’une seule ligne d’instruction elles ne servent à rien mais c’est une bonne pratique et une habitude à prendre.
Pour la couleur c’est simple, il faut choisir une couleur dans un logiciel quelconque et aller dans l’éditeur de couleur/couleur personnalisée pour noter ses trois valeurs RGB (red, green, blue = rouge, vert, bleu).
Ensuite il faut remplacer les trois nombres dans cette partie du script , exemple pour le rouge abracadabraPDF :
= [“RGB”, 163/255, 0/255, 0/255];
Si cette couleur est utilisée plusieurs fois on a tout intérêt à la mettre en variable :
var coulPerso = [“RGB”, 163/255, 0/255, 0/255];
else if(champimc >= 30) {event.target.textColor = coulPerso;}
Attachments:
You must be logged in to view attached files.Merlin
Maître des clésPourquoi ?
Merlin
Maître des clésLe PGCD et le PPCM, mes cauchemars de collégien !
😉
Merlin
Maître des clésExemple ci-joint, le script est dans l’onglet Calcul, mais on peut aussi le mettre en Validation.
(C’est l’un ou l’autre, pas dans les deux)
if (event.value >= 4) {event.target.textColor = color.red;}
else {event.target.textColor = color.black;}
Attachments:
You must be logged in to view attached files.Merlin
Maître des clésWaow !
Merlin
Maître des clésJe ne sais pas de quand date l’interdiction de « SS ».
(Joker)
Mais je me souviens que mon père a eu une voiture immatriculéee « QQ », et qu’il s’est fait chambrer plus d’une fois.
😉
27 février 2025 à 22:04 en réponse à : Générer des nombres se trouvant dans une table commune #75524Merlin
Maître des clésBonjour
Je te propose encore la méthode « brutale » : si ça ne correspond pas on recommence !
var Nb1=(Math.floor(Math.random()*99))+1;
if (Nb1 < Nb1Min || Nb1 > Nb1Max) {var Nb1=(Math.floor(Math.random()*99))+1;}
var Nb2=(Math.floor(Math.random()*99))+1;
if (Nb2 < Nb2Min || Nb2 > Nb2Max) {var Nb2=(Math.floor(Math.random()*99))+1;}
Merlin
Maître des clés🙂
Merlin
Maître des clésBonjour
Le truc c’est d’attribuer aux cases à cocher (qui dans l’exemple sont en fait des boutons-radio) comme choix/valeur d’exportation des zéros et des uns pour pouvoir utiliser la fonction de calcul intégrée aux champ de texte.
J’ai utilisé la « Convention de dénomination des champs de formulaire » (voir : https://www.abracadabrapdf.net/ressources-et-tutos/js-et-formulaires-ressources/duplication-rapide-de-champs-de-formulaire/) pour additionner plus facilement le total des boutons-radio dans le champ Score.
Car ainsi il n’y a que le champ « parent » à cocher dans les champs à additionner, au lieu de devoir tout cocher un par un.
Exemple ci-joint.
Attachments:
You must be logged in to view attached files.Merlin
Maître des clésSur les plaques d’immatriculation il y a une lettre interdite dans les paires O-Q et U-V pour raison de lisibilité, je ne sais plus lesquelles.
Par contre ce qui est interdit partout, y compris sur les plaques d’immatriculation c’est « SS ».
Mais s’agissant de trios de lettres, SS ne sera jamais seul, donc ça devrait passer.
(Et du coup je m’aperçois que ci-dessus j’ai oublié SUS 🙂 )
Merlin
Maître des clésJe croyais que la liste que tu as donné était juste un exemple, parce qu’il en manque :
LFI, SS, SA, NIK, CON, CUL, PUT, BIT, TEB, FDP, LOL… et on pourrait certainement en trouver encore plus.
Si tu veux vraiment faire de la censure il ne te restera plus beaucoup de lettres à disposition, auquel cas il vaudrait peut être mieux utiliser l’alphabet Grec.
Personellement je suis contre la censure, et puis ça égaiera certainement les cours.
😉
Merlin
Maître des clésJe ne me suis pas posé toutes ces questions, mon script est « brutal » : si une des conditions interdites est remplie il recommence au départ. Autant de fois que nécessaire.
Merlin
Maître des clésOui, mais comment sont nommées ces listes déroulantes ?
Merlin
Maître des clésDu coup j’ai testé avec Foxit Reader, la génération aléatoire des caractères y fonctionne bien.
Par contre comme on ne peut pas activer la console dans la version Reader je ne sais pas si le bouton démarrer y déclenche aussi une erreur.
Merlin
Maître des clésBonjour
C’est possible si l’utilisateur saisit « 1.2.2025 », s’il ne saisit pas l’année en entier ça retourne une erreur (alerte de format).
Dans le ci-joint, clique dans le champ pour voir ce qui a été saisi.
Attachments:
You must be logged in to view attached files.Merlin
Maître des clésBeau boulot !
Mais quand je teste, la console affiche une erreur chaque fois que je clique sur le bouton « Démarrer ».
Et comme les scripts de document sont fragmentés impossible de savoir d’où vient la « ligne 17 » en question.
J’ai testé plusieurs fois et ce sont toujours les mêmes lettres « SKX » qui s’affichent dans le document, quelles que soient les valeurs de « pointsABC ».
(Capture jointe)
Attachments:
You must be logged in to view attached files.Merlin
Maître des clésEssaye ça (chez moi ça fonctionne), l’idée c’est ce qu’il y a un doublon ou une association interdite on relance la fonction :
function generLettres() {
function generateRandomLetter() {
var randomValue = Math.random();
var randomCode = 65 + Math.floor(randomValue * 26);
return String.fromCharCode(randomCode);
}
var pointA = generateRandomLetter();
var pointB = generateRandomLetter();
var pointC = generateRandomLetter();
var str = pointA + pointB + pointC;
console.println("pointsABC: " + pointA + pointB + pointC);
if (pointA === pointB || pointA === pointC || pointB === pointC) {generLettres();} // dédoublonage
else if ((/PS|PC|FN|RN|FO|LR|PD|PQ|WC|GPT|PT/.test(str))) {generLettres();} // associations interdites
}
generLettres();
Merlin
Maître des clésBonjour
Je ne suis pas certain d’avoir tout compris mais a priori à partir du moment où on affecte une valeur (lettre) aléatoire à pointA, pointB et pointC on se fiche pas mal de la valeur de « points » puisqu’elle n’y change rien.
Ce qui nous donnerait :
function generateRandomLetter() {
var randomValue = Math.random();
var randomCode = 65 + Math.floor(randomValue * 26);
return String.fromCharCode(randomCode);
}
var pointA = generateRandomLetter();
var pointB = generateRandomLetter();
var pointC = generateRandomLetter();
console.println(pointA + pointB + pointC);
On pourrait ensuite détecter les paires interdites mais dis moi d’abord si ça convient.
Merlin
Maître des clésSalut
Programmatiquement il est impossible de savoir si un champ contient des scripts.
Merlin
Maître des clés« je ne comprend pas quel problème vous soulevez »
Le truc c’est que quand on utilise un script pour ajouter un script (de document ou d’objet) il faut que le script ajouté soit sous forme d’une chaîne de caractères (string), sans contenir de guillemets ni de caractères spéciaux qui pourrait la segmenter. Et donc rendre le script ajouté inutilisable.
Quand c’est un simple script d’une ou deux lignes, pas de souci. Mais quand c’est plus complexe il faut y faire attention.
Merlin
Maître des clésbabarth, dans ton document je crois que c’est « Texte converti avec caractères d’échappement pour les guillemets, » qui est le mieux.
Avec le même script de départ voilà ce que ça donne avec l’utilitaire de Thom Parker, qui ajoute aussi les tabulations et les sauts de lignes mais en fait ça ne sert à rien car les machines n’en tiennent pas compte de toute façon. Au mieux ça ne sert qu’aux humains qui veulent ensuite faire l’opération inverse.
"if (event.target.buttonGetCaption()==\"Montrer\") {\r\n\tthis.viewState={overViewMode:7};\r\n\tevent.target.buttonSetCaption(\"Cacher\");\r\n} else {\r\n\tthis.viewState={overViewMode:0};\r\n\tevent.target.buttonSetCaption(\"Montrer\");\r\n}"
Merlin
Maître des clésBonjour
Il faut que tu utilises un utilitaire pour convertir le script JavaScript en texte (une seule chaine de caractères), par exemple :
- https://jsstringconverter.bbody.io/
ou - https://algodaily.com/convert/javascript/text (inscription requise)
ou - https://www.pdfscripting.com/public/JavaScript-to-Text-Converter-Description.cfm (payant)
Merlin
Maître des clésJe te conseille de revenir à l’ancienne interface !
Suis le lien ci-dessous, c’est le message le plus posté, en anglais et en français, sur le forum d’Adobe ces trois dernières années : 😉
Essayez de revenir à l’interface utilisateur classique : https://community.adobe.com/t5/acrobat-discussions/acrobat-2023-how-to-revert-to-classic-gui-user-interface/td-p/14052807
Considérez le « nouvel Acrobat » comme une version bêta, de nombreuses fonctionnalités sont encore manquantes ou à moitié implémentées.
Merlin
Maître des clésBravo, beau boulot mais cette erreur s’affiche à l’ouverture du PDF :
TypeError: event.target.name is undefined
12:Document-Level:initEt je crois qu’il y a un problème dans la colonne « Groupe » (image jointe)
Attachments:
You must be logged in to view attached files.Merlin
Maître des clésEn fait il n’y a qu’un seul Acrobat qu’on puisse installer.
Après s’être identifié dans le logiciel Creative Cloud avec son Adobe ID on obtient Acrobat Reader si on a un abonnement gratuit, ou bien on obtient Acrobat Pro si on a l’abonnement adéquat (ou Acrobat Standard).
C’est un seul et même logiciel qui déverrouile des fonctionnalités en fonction de l’abonnement correspondant à l’Adobe ID.
-
AuteurRéponses