abracadabraPDF › Forums › PDF – Général › Programmation afficher/masquer plusieurs calques de façon rapide
- Ce sujet est vide.
-
CréateurSujet
-
12 novembre 2014 à 21:30 #45007
IsabelleLemire
MembreBonjour à vous,
J’ai cherché sur le forum et je n’ai rien trouvé.
J’aimerais savoir s’il existe un code pour afficher et masquer les calques à l’aide de boutons. et c’est boutons, par la même occasion font apparaître et disparaitres des champs…
Présentement, je fais avec les commodité du logiciel : Set Layers Visibilities (oui mon logiciel est en anglais) + Run Javascript avec ex:
Bouton 1 :Code:this.getField(«DealerOffre»).display = display.hidden;
this.getField(«Montant_OFFRE3»).display = display.hidden;
this.getField(«OffreSpecial»).display = display.hidden;
this.getField(«Dealer_Offre_2»).display = display.hidden;
this.getField(«OPTIONS_FINAL_PRICE»).display = display.hidden;
this.resetForm(«DealerOffre»);
this.resetForm(«Montant_OFFRE3»);
this.resetForm(«OffreSpecial»);Bouton 2 :
Code:this.getField(«DealerOffre»).display = display.visible;
this.getField(«Montant_OFFRE3»).display = display.hidden;
this.getField(«OffreSpecial»).display = display.hidden;
this.getField(«Dealer_Offre_2»).display = display.visible;
this.getField(«OPTIONS_FINAL_PRICE»).display = display.visible;
this.resetForm(«DealerOffre»);
this.resetForm(«Montant_OFFRE3»);this.resetForm(«OffreSpecial»);
Et ainsi de suite. Et je devrais faire des changement sur quelques PDF donc je dois refaire cette étape qui est très longue (j’ai 4 boutons à programmer qui font 4 choses différentes).
Merci de votre aide.
-
CréateurSujet
-
AuteurRéponses
-
13 novembre 2014 à 09:55 #57968
brumbies
MembreBonjour,
C’est proche d’une de tes demandes précédentes : http://abracadabrapdf.net/forum/index.php/topic,2550.0.html
sinon le post évoqué par Merlin avec le script d’Alex est celui-ci je pense :http://abracadabrapdf.net/forum/index.php/topic,1284.msg5829.html#msg5829Enfin, j’ai modifié légèrement la maquette que je t’avais faite en intégrant la visibilité des 2 boutons présents
:Smiley01:
13 novembre 2014 à 11:24 #57969Merlin
Maître des clés(oui mon logiciel est en anglais)
Quelle version d’Acrobat utilises tu ? Acrobat XI ?
13 novembre 2014 à 14:45 #57970IsabelleLemire
MembreVersion utilisée : Adobe Acrobat pro version 10.1.10
13 novembre 2014 à 14:49 #57971IsabelleLemire
MembreMerci pour vos infos, je teste le tout et je vous reviens!!!!
14 novembre 2014 à 00:29 #57972Merlin
Maître des clésVersion utilisée : Adobe Acrobat pro version 10.1.10
Dommage ! Depuis la version XI Acrobat est multilingue.
:Smiley01:4 décembre 2014 à 16:03 #57973IsabelleLemire
MembreBonjour!
J’ai essayé de faire la programmation simple suggéré par Brumbies mais ça ne fonctionne pas… où j’ai fait l’erreur?
Voici ce que j’ai inscrit sur mes boutons qui fait apparaître 2 calques sur 4. (Car j’ai un calque qui reste toujours actif) Je vous ai mis en pièce jointe mon document.
Le bouton WITHOUT OFFER devrait faire activer le calque BASE et P1
Le bouton PRINCECRAFT OPTIONS devrait faire activer le calque BASE et P4
Le bouton ADDIDIONAL REBATE devrait faire activer le calque BASE et P3
Le bouton SPECIAL OFFER devrait faire activer le calque BASE et P2this.getField(“OFFRE_0a”).value = true;
this.getField(“OFFRE_1a”).value = false;
this.getField(“OFFRE_2a”).value = false;
this.getField(“OFFRE_3a”).value = false;for (var i = 0 ; i < 2; i++)
this.getOCGs(this.pageNum).state = this.getField(“OFFRE“+(i+1)+”a”).value;
this.getField(“OFFRE_0”).display = display.visible;
this.getField(“OFFRE_1”).display = display.hidden;
this.getField(“OFFRE_2”).display = display.hidden;
this.getField(“OFFRE_3”).display = display.hidden;4 décembre 2014 à 16:26 #57974brumbies
MembreBonjour,
Je remplacerai ta boucle for par :
Code:for (var i = 0 ; i <= 3; i++)
this.getOCGs(this.pageNum).state = this.getField(“OFFRE_”+(i)+”a”).value;si tu utilises la console avec ton code, elle te signale que this.getField(“OFFRE”+(i+1)+”a”).value n’est pas définit…
=> attention à la casse il manque “_”
=> dans ce cas tu ne couvres pas les 4 calques mais seulement 1 (i = 0 + 1) et 2 (i = 1 + 1) et s’arrête à i < à 2 ... il manque donc le calque correspondant à OFFRE_0a et OFFRE_3a et perso, j’ajouterai un bouton qui réactiverai l’ensemble des boutons OFFRE_n visible et faisant disparaitre l’ensemble des calques car sinon l’utilisateur ne peut pas revenir en arrière une fois son choix fait… :Smiley01:4 décembre 2014 à 16:32 #57975IsabelleLemire
MembreÇa fonctionne, par contre, quand je clic sur les boutons PRINCECRAFT OPTIONS/ADDIDIONAL REBATE/SPECIAL OFFER mon calque BASE ne reste pas actif….
Voici ce que je mettrais :
this.getField(“OFFRE_0a”).value = true;
this.getField(“OFFRE_1a”).value = false;
this.getField(“OFFRE_2a”).value = false;
this.getField(“OFFRE_3a”).value = false;for (var i = 0 ; i <= 3; i++)
this.getOCGs(this.pageNum).state = this.getField(“OFFRE_”+(i)+”a”).value;Il me manquerais juste une ligne de code qui pourrais dire de laisser toujours actif le calque BASE….
:mur:4 décembre 2014 à 18:12 #57976brumbies
Membreoups!!! je n’ai pas tester les autres boutons…
donc le problème vient de la numérotation de tes calques:
this.getOCGs(this.pageNum)[0].state => BASE
this.getOCGs(this.pageNum)[1].state => P4
this.getOCGs(this.pageNum)[2].state => P3
this.getOCGs(this.pageNum)[3].state => P2
this.getOCGs(this.pageNum)[4].state => P1du coup avec la boucle for tu affectes la valeur de “OFFRE_0a” à BASE
=> pour résoudre ton problème il suffit de mettre
this.getField(“OFFRE_0a”).value = true;
dans chacun des scripts des boutonsSinon, P1 ne sert à rien, et pour ne pas avoir à gérer un calque pour qu’il soit visible tout le temps, met le en fond de page. => cad utilses le pdf BASE comme pdf principal et vient y ajouter les calques dessus, comme cela tu n’as besoin d’en gérer que 3…
:Smiley01:
PS: il faut bien conserver la boucle for ainsi :Code:for (var i = 0 ; i <= 3; i++)
this.getOCGs(this.pageNum).state = this.getField(“OFFRE_”+(i)+”a”).value;car le tiens ne fais pas référence au numéro de calque
4 décembre 2014 à 19:19 #57977IsabelleLemire
Membreà ce moment là j’écrit comment le code?
Le bouton WITHOUT OFFER devrait faire activer le calque BASE
Le bouton PRINCECRAFT OPTIONS devrait faire activer le calque BASE et P3
Le bouton ADDIDIONAL REBATE devrait faire activer le calque BASE et P2
Le bouton SPECIAL OFFER devrait faire activer le calque BASE et P1Donc comme suggéré j’ai mis le PDF de base….
this.getField(“OFFRE_0a”).value = true;
this.getField(“OFFRE_1a”).value = false;
this.getField(“OFFRE_2a”).value = false;
this.getField(“OFFRE_3a”).value = false;for (var i = 0 ; i <= 3; i++)
this.getOCGs(this.pageNum).state = this.getField(“OFFRE_”+(i)+”a”).value;Je ne suis pas caler en programmation donc je plafonne un peu en ce moment…..
4 décembre 2014 à 19:33 #57978IsabelleLemire
MembreBon j’ai compris et ça fonctionne, par contre…. j’ai un javascript qui sauvegarde mon document à l’état à laquel il est…
Et cette fonctionne ne fonctionne plus….Document JavaScript : LayerConfig
function saveLayerConfig(doc) {
// get the current layer configuration and save the names of all active layers in an array
var activeLayers = [];var ocgArray = doc.getOCGs();
for (var i = 0; i < ocgArray.length; i++) {
if (ocgArray.state == true) {
activeLayers.push(ocgArray.name);
}
}var f = doc.getField(“LayerConfig”);
if (f != null) {
f.clearItems();
f.setItems(activeLayers);
}
}function isInArray(val, arr) {
for (var i = 0; i < arr.length; i++) {
if (arr == val)
return true;
}
return false;
}function restoreLayerConfig(doc) {
var activeLayers = [];// get the items from the layerConfig dropdown control
var f = this.getField(“LayerConfig”);if (f != null) {
for (var i = 0; i < f.numItems; i++) {
activeLayers.push(f.getItemAt(i));
}var ocgArray = doc.getOCGs();
for (var i = 0; i < ocgArray.length; i++) {
ocgArray.state = isInArray(ocgArray.name, activeLayers);
activeLayers.push(ocgArray.name);
}
}
}restoreLayerConfig(this);
J’ai ajouter un DropDown avec comme nom LayerConfig
Et une action à Document Will Save : saveLayerConfig(this);Ça fonctionne plus… avant quand je faisait juste mettre mes calques avec l’action Set Layers Visibilities, a fonctionnait…
:mur: aidez-moi SVP il ne m’en manque pas beaucoup pour y arriver….
4 décembre 2014 à 21:20 #57979brumbies
MembreJe viens de regarder et ta fonction saveLayerConfig remplie bien ca fonction chez moi… testé sous acrobat pro XI et adobe reader 11…
Sinon, il y a plus simple pour enregistrer/récupérer le statut des calques.
tu peux ajouter la boucle for en script d’ouverture de document…Code:for (var i = 0 ; i <= 3; i++)
this.getOCGs(this.pageNum).state = this.getField(“OFFRE_”+(i)+”a”).value;d’ou l’utilisation des champs OFFRE_na pour “sauvegarder” le statut de chaque calque et dans ce cas la liste déroulante LayerConfig est inutile.
Et le code est plus simple…cf exemple joint…
:Smiley01:6 décembre 2014 à 04:52 #57980IsabelleLemire
MembreJ’ai réussi à le faire fonctionner, un gros merci!
11 décembre 2014 à 14:01 #57981romain10
MembreBonjour,
Nouveau sur le forum, je tiens d’abord à remercier les différentes personnes qui partagent leurs connaissances de l’univers PDF.
Je souhaite réaliser la même fonction qu’IsabelleLemire. J’ai suivi avec attention les différents échanges qui ont eu lieu et ai procédé à des corrections sur mon document.
Cependant après réouverture de mon document, le calque choisi lors du précédent enregistrement n’est pas pris en compte. Mon document est un contrat de 21 pages dans sa totalité. Le calque que je souhaite conserver lors de l’enregistrement se situe en page 3 et est également repris en page 6.
Je tiens à préciser que lorsque j’ouvre un PDF contenant uniquement la page 3, les scripts fonctionnent.
Une solution à mon problème serait un joli cadeau.
12 décembre 2014 à 09:15 #57982brumbies
MembreBonjour et bienvenu,
1) je ne vois pas de script d’ouverture pour venir affecter aux calques P1 et P2 les valeurs des champs OFFRE_0a et OFFRE_1a.
Je mettrais le script suivant en script d’ouverture de la page d’ouverture de ton document (ici la page 1):Code:this.getOCGs(2)[1].state = this.getField(“OFFRE_0a”).value;
this.getOCGs(2)[2].state = this.getField(“OFFRE_1a”).value;2) ensuite tu as fait une inversion d’une inversion au niveau des scripts en OFFRE_0 et OFFRE_1 (déclencheur souris relachée) => pile je gagne, face tu perds
tu as écrit les même codes, même ce n’était pas ton souhait:Code:// code en OFFRE_0
this.getField(“OFFRE_0a”).value = true;
this.getField(“OFFRE_1a”).value = false;
// code en OFFRE_1
this.getField(“OFFRE_1a”).value = false;
this.getField(“OFFRE_0a”).value = true;j’ai modifié ton fichier avec les éléments que je viens de te décrire
dis moi si ca te va?
:Smiley01:8 juin 2015 à 15:24 #57983romain10
MembreBonjour,
Merci Brumbies pour ton retour, et désolé de ne pas avoir pu répondre avant.
Le document fonctionne parfaitement, en revanche, lorsque je veux le réinsérer dans mon document complet (le fichier transmis n’est qu’une partie du formulaire créé), la console m’affiche le message suivant lors de l’ouverture :
this.getOCGs(2)[2] is undefined
1:Page-Actions:Page1:Ouverture de la page:Action1Exception à la ligne 1 de la fonction top_level, script Page-Actions:Page1:Ouverture de la page:Action1
TypeError: this.getOCGs(2)[2] is undefined
1:Page-Actions:Page1:Ouverture de la page:Action1Je suppose que cela veut dire qu’il n’identifie pas les calques qu’il doit faire apparaitre ou disparaitre, mais je n’arrive pas à comprendre pourquoi ?
Merci d’avance.
22 juin 2015 à 08:10 #57984brumbies
MembreBonjour,
Désolé du délais de réponse, j’ai été pas mal pris ces derniers temps…
Donc le message d’erreur qui est généré laisse supposer, comme tu l’indiquais, un problème au niveau de la reconnaissance soit de la page soit du calque.
J’ai besoin de savoir :
– quel est le numéro de page ou se situe les calques que tu veux faire apparaitre/masquer?
– quel est ton nombre de calque à gérer?:Smiley01:
26 juin 2015 à 13:24 #57985romain10
MembreBonjour,
– Les calques se situent pour ce document sur la page 2 (Les mêmes calques étaient placés sur la page 3 de mon précédent document)
– Sur ce document, il y’a 2 calques à gérer.
Je commence par ces 2 calques pour comprendre le mécanisme, mais sur ce même document, il pourrait ensuite y avoir potentiellement une dizaine de calques. Est-ce que cela peut poser un problème ? :doute:
Pour cet exercice je me suis appuyé au départ sur le document d’IsabelleLemire, mais j’avoue ne pas comprendre la fonction du layer config :Ooops: . A quoi sert-il ?
Ci-joint le document.
D’avance merci pour ton retour.
26 juin 2015 à 13:39 #57986Merlin
Maître des clésromain10 : je vois que ton document provient d’InDesign alors je te met en garde contre un secret bien gardé :
dans InDesign chaque champ de formulaire est forcément affecté à un calque et un seul, comme tous les objets.
Par-contre dans le format PDF et dans Acrobat les champs de formulaires sont flottants et indépendants des calques.*
Il faut le savoir…:mur: :Smiley15:
* On peut avoir l’impression contraire au début quand on ouvre le PDF dans Acrobat, curieusement parfois les champs de formulaire restent attachés à leur calque d’origine… Jusqu’à ce qu’on y touche… Et après c’est fichu.
26 juin 2015 à 14:30 #57987brumbies
MembreDe plus,
il faut savoir que tu as bien mis tes calques en page 2 mais d’un point de vue script ton document commence au numéro de page 0… donc la page 2 à laquelle tu veux faire appel porte le numéro 1 et ainsi de suite… => raison pour laquelle tu as une erreur, puisqu’il n’y a pas de calque sur la page 3 de ton doc…
Il en va de même avec les calques…
:Smiley01:29 juin 2015 à 08:46 #57988romain10
MembreBonjour,
Merlin, je suppose que ta mise en garde concerne l’édition d’une partie du formulaire sur indesign. Pour ma part, je construis mon document, ainsi que les calques sur indesign, puis je l’exporte en PDF. J’édite ensuite mon formulaire uniquement sur acrobat.
Brumbies, effectivement le script ne pointait pas sur la bonne page, après modification, il y avait également une erreur sur ce même script qui ne pointait pas sur les bons calques. Après modification de ce point également, le formulaire fonctionne enfin comme je le souhaite. :extra:
Je vais maintenant pouvoir me lancer dans l’ajout d’autres calques.
Un grand merci à vous !!!
29 juin 2015 à 09:31 #57989Merlin
Maître des clésMerlin, je suppose que ta mise en garde concerne l’édition d’une partie du formulaire sur InDesign.
Exactement.
Il y en a déjà quelques uns qui ont été surpris par ce comportement (logique mais qui devrait pouvoir être évité).
Comme en général c’est une mauvaise surprise je préfère avertir avant.:Smiley01:
29 juin 2015 à 16:50 #57990romain10
MembreJ’en prends bonne note.
-
AuteurRéponses
- Vous devez être connecté pour répondre à ce sujet.