Donnez vie à vos documents numériques !
 

Verrouiller les champs de la page en cours sauf exception

abracadabraPDF Forums PDF – Général Verrouiller les champs de la page en cours sauf exception

  • Ce sujet est vide.
  • Créateur
    Sujet
  • #46141
    cdrun
    Membre

    Bonjour à tous,

    Je suis nouveau sur le forum que je viens de découvrir.

    Pour commencer je tiens à dire que je n’ai absolument aucune connaissance de JavaScript et je n’ai fait que copier-coller des exemples postés sur le forum, qui j’avoue m’ont bien aidé. Alors merci pour ça.

    Je suis en train de créer un formulaire PDF qui me cause bien des soucis.
    Alors voilà, je vais essayé d’être le plus clair possible.
    Je tiens d’abord à dire que j’utilise bien la convention de dénomination des champs de formulaires décrite dans le forum.

    Je souhaite dupliquer une page de formulaire, je me suis donc basé sur le tuto suivant : http://www.abracadabrapdf.net/ressources-et-tutos/js-et-formulaires-ressources/dupliquer-dynamiquement-des-pages-dans-un-pdf/ que j’ai exécuté jusqu’au bout. Les pages se dupliquent bien.

    La page dupliquée doit être validée (donc signée) par la personne qui la duplique et la remplit. Dans le champ signature, j’ai intégré le script suivant :

    Code:
    this.getField(“rp.position”).readonly = true;

    que j’ai trouvé sur le topic suivant : https://abracadabrapdf.net/forum/index.php/topic,2803.msg15656.html#msg15656 car je voulais figer le contenu saisi sur la page pour qu’il ne soit pas modifiable.
    Jusque-là je m’en sors pas trop mal.

    Le problème c’est qu’avec la fonction de duplication, tous les champs sur la nouvelle page générée sont renommés avec un préfixe qui change à chaque page ajoutée. Du coup la fonction this.getField(“rp.position”).readonly = true ne marche pas (le champs restent modifiables) puisque “rp.position” est l’identifiant donné aux champs de ma page modèle, mais comme ceux-là changent à chaque fois, je suis coincé. Mon idée était donc de trouver une astuce pour verrouiller les champs de la page en cours (indépendamment des nouveaux noms de champs de la page) mais je ne connais pas JavaScript et je ne sais pas s’il y a une fonction équivalente.

    En revanche, je souhaite y ajouter des exceptions car il y a un champ sur cette page que je ne souhaite pas figer, et là encore je ne sais pas comment faire.
    J’espère que je n’ai pas été trop perturbant dans mes explications.
    En vous remerciant par avance de votre aide.

Affichage de 29 réponses de 1 à 29 (sur un total de 29)
  • Auteur
    Réponses
  • #66225
    cdrun
    Membre

    Bon,
    Mon message n’est pas passé intégralement, bref, j’était pt’et trop long !! :Smiley01:
    En essayant d’être plus concis, je souhaite verrouiller TOUS les champs de la page en cours (après signature de cette page) en y admettant 1 exception (Tous les champs sauf un).
    Pouvez-vous m’aider SVP, merci  :Smiley08:

    #66226
    Pradow
    Membre

    Bonjour,
    Alors en script de validation, tu peux appliquer la ligne suivante à ton champ de signature :
    page = event.target.page
    for (k=0;k}
    }

    Pour l’exception, tu peux toujours réactiver ton champ après, je ne sais pas quel est le nom de ton champ mais tu peux appliquer

    this.getField(“field_name”).readonly = false

    #66227
    cdrun
    Membre

    Merci @Pradow pour ta réponse rapide.
    La première partie à l’air de fonctionner comme je le souhaite mais comment et où j’intègre la partie du code pour l’exception, car le champ que je veux laisser modifiable est aussi dynamique avec l’ajout de la nouvelle page.
    Et tant que j’y suis, y-a-t-il un moyen d’insérer la page à un endroit spécifique du document au lieu de la dernière page ?
    Encore merci pour votre aide.

    #66228
    Merlin
    Maître des clés

    Bonjour et bienvenue

    Mon message n’est pas passé intégralement, bref, j’était pt’et trop long

    Non, c’est juste qu’il était farci de balises indésirables, certainement issues d’un copier-coller, qui affichaient le texte en tout petit.
    Merci de faire des copier-coller en “texte seul” (txt).
    :geek:

    #66229
    Merlin
    Maître des clés

    Le problème c’est qu’avec la fonction de duplication, tous les champs sur la nouvelle page générée sont renommés avec un préfixe qui change à chaque page ajoutée. Du coup la fonction this.getField(“rp.position”).readonly = true ne marche pas

    C’est un peu déconcertant au début mais cette fonction de renommage est une vraie merveille.

    Pour s’adresser aux champs de la seule page active il faut d’abord savoir sur quelle page se trouve l’utilisateur, et c’est lui qui nous le dit puisque le champ (signature ou autre) sur lequel il clique porte forcément le même préfixe que ses voisins (on pourrait aussi utiliser la méthode de Pradow).
    À partir de là il suffit d’en récupérer le préfixe et de l’ajouter au nom de base des champs à masquer.

    var oNomChamp = this.event.target.name;  // nom du champ cliqué
    var aTexte = oNomChamp.split(“.”);  // découpage du nom du champ cliqué en fonction des points
    var cPrefix = aTexte.shift();  // mise en variable du préfixe
    this.getField(cPrefix + “.rp.position”).readonly = true;  // action

    #66230
    Merlin
    Maître des clés

    y-a-t-il un moyen d’insérer la page à un endroit spécifique du document au lieu de la dernière page ?

    Oui, réponse dans ce tuto : https://www.abracadabrapdf.net/?p=3736
    :Smiley15:

    #66231
    cdrun
    Membre

    Merci Merlin, mais je ne sais pas si je l’ai bien intégré car le code que tu communiques ne verrouille pas les champs de la page dupliquée (je l’ai copié-collé tel quel en enlevant les commentaires). En revanche celui de Padrow fonctionne mais je ne sais toujours pas comment faire pour l’exception sur le champ que je souhaite modifiable sur la nouvelle page.

    Merlin, j’ai bien essayé de mettre le numéro de page après lequel la nouvelle page ajoutée doit s’insérer. Ca fonctionne mais le hic c’est que du coup tous les champs des nouvelles pages ajoutée ont le même prefixe. Par exemple, si je mets 7, les champs commencent par P7… sur toutes les pages dupliquées !
    J’ai mis le code suivant pour le bouton :

    Code:
    this.getTemplate(“entsuivi”).spawn({nPage:7, bRename:true, bOverlay: false});

    avec entsuivi comme nom de page modèle et 7, l’endroit où je veux que la page dupliquée s’insère.

    #66232
    cdrun
    Membre

    j’ai décidément du mal avec le copier-coller !! :Smiley08:

    #66233
    bebarth
    Maître des clés

    bonjour,
    Comme d’habitude, c’est plus simple à comprendre lorsqu’on partage un fichier…
    Si le préfixe change, par contre la fin du nom de champ ne change pas, donc :

    Code:
    for (var i=0; i     var leNom=this.getNthFieldName(i);
        if (this.getField(leNom).name.endsWith(“rp.position”)) this.getField(leNom).readonly=true;;
    }

    @+
    :bonjour:

    #66234
    Merlin
    Maître des clés

    par contre la fin du nom de champ ne change pas

    Je crois bien que si puisque cdrun utilise la convention de dénomination des champs de formulaires.
    :doute:

    #66235
    Merlin
    Maître des clés

    celui de Padrow fonctionne mais je ne sais toujours pas comment faire pour l’exception sur le champ que je souhaite modifiable sur la nouvelle page

    Il ne faut pas gérer une exception, il faut :
    1. Verrouiller tous les champs de la page
    2. Déverrouiller le champ concerné.

    Ca fonctionne mais le hic c’est que du coup tous les champs des nouvelles pages ajoutée ont le même prefixe. Par exemple, si je mets 7, les champs commencent par P7… sur toutes les pages dupliquées

    C’est l’idée, d’où le script ci-dessus qui gère les préfixes.

    #66236
    bebarth
    Maître des clés

    bonjour,

    Je crois bien que si puisque cdrun utilise la convention de dénomination des champs de formulaires.
    :doute:

    J’ai écris ça de tête, mais il me semble bien que les pages sont renommées uniquement avec un préfixe !!!
    C’est pour ça que je préfère avoir un fichier partagé pour pouvoir vérifier (assez) rapidement.
    …sinon avec indexOf() on peut chercher si le nom du champ contient “rp.position”.
    @+
    :bonjour:

    PS : J’ai retrouvé cet exemple :
    https://abracadabrapdf.net/forum/index.php?action=dlattach;topic=3015.0;attach=2557

    #66237
    Merlin
    Maître des clés

    il me semble bien que les pages sont renommées uniquement avec un préfixe

    Oui, mais dans les pages renommées il y a possiblement des champs qui utilisent la convention de dénomination des champs de formulaire…

    …sinon avec indexOf() on peut chercher si le nom du champ contient “rp.position”.

    J’y avais pensé aussi, mais il y a possiblement des champs rp.position sur d’autres pages…

    :doute:

    #66238
    bebarth
    Maître des clés

    …il suffit de tester le numéro de la page !
    @+
    :bonjour:

    #66239
    cdrun
    Membre

    Salut tout le monde et encore merci de vos retours. J’en vois presque le bout grâce à vous.
    Bon effectivement, vous avez raison, un fichier vaut mieux qu’un long discours. Du coup voici des fichiers simplifiés pour illustrer ce que je souhaite.

    Dans le FICHIER 1 “PAGE A DUPLIQUER”, tout se passe correctement sauf que les pages insérées se placent à la fin du doc (bon, pas gênant en soit mais ça a le mérite de fonctionner)

    Dans le Fichier 2 “PAGE A DUPLIQUER V2”, j’ai adapté le code du bouton de la page à dupliquer comme suit : this.getTemplate(“page_a_dupliquer”).spawn({nPage:1, bRename:true, bOverlay: false}); puisque je souhaite l’insérer tout de suite après la page 1. Problème : tous les champs de toutes les nouvelles pages insérées ont le même préfixe P1… du coup, tous les champs se retrouvent avec le même contenu, ce qui n’est pas l’idée forcément et impossible de verrouiller les champs après signature du service accueil (ici représenté par un simple champ texte mais dans le véritable fichier, ce sera bien sût un champ signature).

    Le champ que souhaite laissé modifiable, vous l’aurez deviné, est le champ signature autre service. Je n’ai pas masqué la page à dupliquer volontairement pour l’exemple mais elle le sera dans le fichier final.

    Bref, j’espère que cela vous aidera à m’éclairer.
    Merci encore !

    #66240
    cdrun
    Membre

    Et voici le fichier 2  :Smiley08:

    #66241
    bebarth
    Maître des clés

    Lorsqu’on insère une page modèle toujours au même endroit, le soucis c’est qu’effectivement le préfixe est toujours le même vu que le numéro du préfixe est le numéro de la page.
    Pour ton problème, je vois donc comme solution d’aplatir les pages (au lieu de les mettre en lecture seule) avant d’insérer la nouvelle page puis de créer le champ signature sur la page d’après celle qu’on vient de créer.
    C’est envisageable ???Si oui, je regarde ce soir ou demain matin !!!
    @+
    :bonjour:

    #66242
    cdrun
    Membre

    Salut bebarth,
    Merci pour ton retour

    C’est envisageable ???Si oui, je regarde ce soir ou demain matin !!!

    Oui, à partir du moment où les champs sont non modifiables après la signature accueil. Seule la signature autre service doit être remplissable.

    D’ailleurs, j’en profite, j’use et abuse, désolé, mais j’ai une autre petite question. J’ai cherché partout mais je n’ai pas trouvé. Existe-t-il un moyen de verrouiller une signature sans qu’elle soit modifiable/effaçable, même par le signataire lui-même. En gros une fois que c’est signé, c’est signé !

    Merci encore

    #66243
    Merlin
    Maître des clés

    Lorsqu’on insère une page modèle toujours au même endroit, le soucis c’est qu’effectivement le préfixe est toujours le même vu que le numéro du préfixe est le numéro de la page.

    Plus exactement c’est parce-que dans ce cas précis le numéro de page est indiqué en valeur absolue (1).
    Il suffit en fait d’indiquer un numéro de page relatif :

    this.getTemplate(“page_a_dupliquer”).spawn({nPage:this.numPages-1, bRename:true, bOverlay: false});

    :Smiley03:

    #66244
    cdrun
    Membre

    Eureka !
    Ça fonctionne, merci Merlin. Je viens de le faire sur le fichier test que j’ai partagé, j’essaierai sur le fichier d’origine et vous tiendrai informé.
    En tous cas merci à tous de m’avoir prêté vos neurones, j’avais la tête qui allait explosé  :mur:
    Je m’en veux de ne pas y avoir pensé, à un “-1” prêt, pffff !
    Encore merci.

    D’ailleurs, j’en profite, j’use et abuse, désolé, mais j’ai une autre petite question. J’ai cherché partout mais je n’ai pas trouvé. Existe-t-il un moyen de verrouiller une signature sans qu’elle soit modifiable/effaçable, même par le signataire lui-même. En gros une fois que c’est signé, c’est signé !

    Pour finir, si qqun à la réponse  :Smiley01:

    #66245
    bebarth
    Maître des clés

    …; puisque je souhaite l’insérer tout de suite après la page 1. Problème : tous les champs de toutes les nouvelles pages insérées ont le même préfixe P1… du coup…

    J’avais cru comprendre que la nouvelle page devait-être insérée en 2ème page (tout de suite après la page 1) !
    D’ailleurs c’est laquelle la page 1 ?
    Du coup j’ai eu une autre idée c’est de l’insérée en fin de fichier et de la déplacer avec movePage.
    @+
    :bonjour:

    #66246
    Merlin
    Maître des clés

    movePage

    Je cite la doc :
    The property or method is not allowed in Adobe Reader but is available in Acrobat Pro and Acrobat Standard.
    :mur:

    #66247
    bebarth
    Maître des clés

    Correct, et l’aplatisssent non plus n’est pas permis avec Adobe Reader !!!
    @+
    :bonjour:

    #66248
    Merlin
    Maître des clés

    Existe-t-il un moyen de verrouiller une signature sans qu’elle soit modifiable/effaçable, même par le signataire lui-même. En gros une fois que c’est signé, c’est signé !

    Si l’utilisation se fait avec Acrobat Pro, ou Standard, on peut toujours tout modifier dans un PDF, même si les champs de formulaire sont aplatis (incrustés dans la couche graphique).
    Si l’utilisation se fait avec Acrobat Reader, on ne peut pas modifier la couche graphique mais on peut pas aplatir non plus.
    :oh:

    Sinon il y a Adobe Sign et/ou les formulaires Adobe Sign.

    #66249
    Merlin
    Maître des clés

    SimpleMachines (le forum) a raison d’avertir des redondances possibles quand quelqu’un d’autre a posté entretemps !
    Voilà le résultat quand on passe outre cet avertissement.
    :Smiley03:    :geek:

    #66250
    cdrun
    Membre

    Juste une confirmation, je travaille sur Acrobat Pro pour créer le formulaire sauf que je n’ai aucune certitude sur quoi il va être rempli. Tout va dépendre de comment sont équipés les différents destinataires.
    Est-ce que le code que j’ai intégré et les fonctions vont fonctionner correctement sur n’importe quel lecteur PDF ?

    #66251
    Merlin
    Maître des clés

    Est-ce que le code que j’ai intégré et les fonctions vont fonctionner correctement sur n’importe quel lecteur PDF ?

    Chaque éditeur est libre de supporter tout ou partie du format PDF et de JavaScript, donc c’est sans garantie aucune.
    Tout ce qu’on fait est garanti pour fonctionner avec Acrobat Reader (logiciel gratuit) ou Acrobat Pro (selon les fonctions utilisées) dans une version donnée, c’est le maximum qu’on puisse faire.

    La fonction de génération de pages-modèles, par exemple, est très rarement supportée par les lecteurs non-Adobe.
    Autre exemple, sur MacOS le lecteur par défaut c’est Aperçu, alias “The PDF killer”

    #66252
    cdrun
    Membre

    ok merci Merlin, je vais communiquer sur le fait d’utiliser Acrobat Reader DC. J’ai testé avec mon mac en utilisant AR et non Aperçu, et tout ce que j’ai fait jusqu’à présent fonctionne sur les 2 systèmes, à voir !

    Encore merci à tous pour votre aide très précieuse, cet endroit est vraiment génial ! !

    A très bientôt sûrement pour un autre topic  :Smiley08:

    #66253
    Merlin
    Maître des clés

    je vais communiquer sur le fait d’utiliser Acrobat Reader DC

    Tu devrais lire ça : https://www.abracadabrapdf.net/ressources-et-tutos/js-et-formulaires-ressources/forcer-utilisation-pdf-avec-acrobat-reader/
    :Smiley03:

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