Donnez vie à vos documents numériques !
 

Programmation afficher/masquer plusieurs calques de façon rapide

abracadabraPDF Forums PDF – Général Programmation afficher/masquer plusieurs calques de façon rapide

  • Ce sujet est vide.
  • Créateur
    Sujet
  • #45007

    Bonjour à 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.

Affichage de 23 réponses de 1 à 23 (sur un total de 23)
  • Auteur
    Réponses
  • #57968
    brumbies
    Membre

    Bonjour,

    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#msg5829

    Enfin, j’ai modifié légèrement la maquette que je t’avais faite en intégrant la visibilité des 2 boutons présents

    :Smiley01:

    #57969
    Merlin
    Maître des clés

    (oui mon logiciel est en anglais)

    Quelle version d’Acrobat utilises tu ? Acrobat XI ?

    #57970

    Version utilisée : Adobe Acrobat pro version 10.1.10

    #57971

    Merci pour vos infos, je teste le tout et je vous reviens!!!!

    #57972
    Merlin
    Maître des clés

    Version utilisée : Adobe Acrobat pro version 10.1.10

    Dommage ! Depuis la version XI Acrobat est multilingue.
    :Smiley01:

    #57973

    Bonjour!

    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 P2

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

    #57974
    brumbies
    Membre

    Bonjour,

    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:

    #57975

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

    #57976
    brumbies
    Membre

    oups!!! 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 => P1

    du 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 boutons

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

    #57977

    à 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 P1

    Donc 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…..

    #57978

    Bon 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….

    #57979
    brumbies
    Membre

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

    #57980

    J’ai réussi à le faire fonctionner, un gros merci!

    #57981
    romain10
    Membre

    Bonjour,

    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.

    #57982
    brumbies
    Membre

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

    #57983
    romain10
    Membre

    Bonjour,

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

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

    #57984
    brumbies
    Membre

    Bonjour,

    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:

    #57985
    romain10
    Membre

    Bonjour,

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

    #57986
    Merlin
    Maître des clés

    romain10 : 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.

    #57987
    brumbies
    Membre

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

    #57988
    romain10
    Membre

    Bonjour,

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

    #57989
    Merlin
    Maître des clés

    Merlin, 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:

    #57990
    romain10
    Membre

    J’en prends bonne note.

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