Donnez vie à vos documents numériques !
 

Lecture d’un PDF remplissable – Javascript apparition de modèles de pages

abracadabraPDF Forums PDF – Général Lecture d’un PDF remplissable – Javascript apparition de modèles de pages

  • Ce sujet est vide.
  • Créateur
    Sujet
  • #46340
    noepix
    Membre

    Bonjour à tous et à toutes,

    Je viens vers vous aujourd’hui pour avoir votre aide sur une question de lecture d’un PDF remplissable sur Adobe Reader.

    J’ai un PDF remplissable à réaliser, qui comporte sur une page 4 séries de boutons radios « oui/non ». L’idée c’est qu’en sélectionnant le bouton radio « oui », la page correspondant à cette catégorie vienne s’ajouter à la suite du document.

    Grâce à vous, j’ai pu mettre en place cette option. J’ai en effet trouvé la solution dans un sujet de 2018 auquel vous aviez répondu :
    https://abracadabrapdf.net/forum/index.php/topic,3429.msg20295.html#msg20295

    J’ai donc enregistré mes pages à faire apparaitre en tant que modèles de pages, puis j’ai mis en place sur mes boutons radios « oui » le code suivant :

    this.getTemplate(“01”).hidden = false;

    En parallèle j’ai également mis en place le code suivant pour le bouton « non » :

    this.getTemplate(“01”).hidden = true;

    Lorsque j’ai 2 pages de documents à ajouter, j’ai ajouté deux actions « exécuter un javascript » sur un même bouton pour faire apparaître ces 2 pages.

    Cela fonctionne parfaitement bien pour moi sur Acrobat XI Pro sur mon poste (MAc OS Sierra), merci pour votre aide sur ce sujet.

    Malheureusement, je me retrouve confrontée à un problème en transmettant le fichier au client.
    Pour transmettre un fichier PDF à mon client, je l’enregistre habituellement sous Reader Extended pour qu’il ne puisse pas modifier les calculs et champs mis en place.
    Je fais donc « Enregistrer sous un autre > Fichier PDF Reader Extended > Activer d’autres outils »

    Il me signale alors que « une fois Reader activé, certaines fonctions, telles que la modification du contenu, l’insertion ou la suppression de pages, sont restreintes. »

    Et en effet, une fois Reader activé, ma fonction JavaScript ne fonctionne plus, il ne m’ajoute plus de page quand j’active le bouton radio « oui »

    J’ai donc envisagé de transmettre mon PDF sans cette manipulation, mais même sans passer par cette étape de Reader Extended, quand mon client ouvre son PDF sous Acrobat Reader, la fonction d’ajout de page en sélectionnant le bouton radio oui ne fonctionne pas.

    Ce document a pour vocation d’être envoyé par mail aux nouveaux clients de mon client, il doit donc pouvoir être ouvert et rempli facilement, sans avoir besoin d’adapter son logiciel de lecture.

    A quoi est dû ce défaut de lecture par Acrobat Reader ? Puis-je le rectifier pour faire en sorte que mon document soit ouvert et fonctionne sur tous les logiciels de lecture ?

    Et pour ce qui est de Reader Extended, comment pourrais-je contourner ce problème qui m’empêche de régler un ajout/suppression de pages une fois mon fichier sécurisé ? Puis je sécuriser mes champs autrement ?

    Merci d’avance pour votre aide,

Affichage de 18 réponses de 1 à 18 (sur un total de 18)
  • Auteur
    Réponses
  • #67654
    bebarth
    Maître des clés

    bonjour,
    L’application Adobe Reader de ton client est sur tablette ou sur un PC.
    Les applications pour tablettes gèrent très mal le JavaScript, donc ça ne m’étonne pas que ton fichier ne fonctionne pas très bien.
    Si c’est sur un PC, peux-tu partager un fichier afin que je regarde ?
    @+
    :bonjour:

    #67655
    noepix
    Membre

    Bonjour bebarth,

    Merci pour ta réponse.

    Mon client utilise Acrobat Reader sur PC. J’ai également testé mon PDF avec le acrobat reader sur mon ordinateur et le javascript ne fonctionne pas. En revanche, si j’utilise Acrobat Pro, ça fonctionne.

    Merci pour ta proposition de regarder. Tu trouveras ci-joint un fichier de mon problème avec mes quatre duo de boutons radios qui fonctionnent sous Acrobat pro, mais pas sous Adobe Reader.
    :bonjour:

    #67656
    bebarth
    Maître des clés
    #67657
    noepix
    Membre

    Aïe, j’avais peur de recevoir cette réponse justement…
    Dans ce cas si je ne peux pas faire en sorte de faire apparaitre les pages correspondantes à l’option choisi grâce aux templates, est ce que je peux utiliser un autre moyen ?

    Comment pourrais je faire en sorte d’ajouter à mon document une page définie lorsque l’on sélectionne “oui” avec une solution compatible avec acrobat reader ? Auriez vous une suggestion?

    Merci de votre réponse,

    #67658
    Merlin
    Maître des clés

    Bonjour

    Tu te heurtes à un double mur :
    this.getTemplate n’est pas supporté par Acrobat Reader,
    this.getTemplate ne fonctionne pas dans les PDF “Reader Extended”, comme la fonction spawn d’ailleurs.

    La bonne nouvelle c’est que “Reader Extended” ne sert plus à rien depuis longtemps, et n’a jamais servi à protéger un document, même si ça restreint quelques fonctions (il suffit de “Enregistrer une copie” pour dé-Reader-Extendiser un PDF).
    Concernant la protection voir ce sujet : https://abracadabrapdf.net/forum/index.php/topic,3986.0.html

    Ce qu’il te faut faire c’est utiliser la fonction spawn pour générer/afficher les pages, et la fonction deletePages pour les masquer/supprimer, les deux sont supportées par Acrobat Reader (version DC ou version XI (11)).
    Ce qui suppose que le document contiennent des pages modèles (templates) masquées.

    #67659
    noepix
    Membre

    Bonjour Merlin,

    Merci pour ta réponse très complète.

    Je viens effectivement de remplacer ma fonction “this.getTemplate” par la suivante :

    var sName = “MyTemplateName”;var a = this.templates;for (i = 0; i .name == sName) {a.spawn(this.numPages, false, false);break;}}
    Je viens de faire un essai rapide et il semblerait que ça fonctionne ! Je vais de ce pas décliner l’ensemble des pages.

    En revanche, que donnera cette fonction sous une version X ou antérieure ? Comme je le disais, mon client va transmettre ce PDF à ses nouveaux clients et je crains qu’ils n’aient pas tous un logiciel à jour…
    Merci à vous deux pour votre aide précieuse.

    #67660
    Merlin
    Maître des clés

    En revanche, que donnera cette fonction sous une version X ou antérieure ?

    Rien, ça ne fonctionne pas avec Acrobat Reader X et versions antérieures (mais ça fonctionne avec Acrobat Pro et Standard toutes versions).
    Tu peux utiliser cette astuce, en y ajoutant la condition “Acrobat XI ou ultérieur” : https://www.abracadabrapdf.net/ressources-et-tutos/js-et-formulaires-ressources/forcer-utilisation-pdf-avec-acrobat-reader/

    #67661
    noepix
    Membre

    Bonjour à tous,

    J’aurais plusieurs questions quand à la fonction spawn mise en place hier. 

    Comme énoncé hier, j’ai utilisé la fonction spawn suivante, trouvée sur un site expliquant la mise en place de cette fonction :
    var sName = “MyTemplateName”;var a = this.templates;for (i = 0; i Très honnêtement, je ne comprends pas l’ensemble de cette fonction, mais elle fonctionne pour me générer les pages de mon template. Le problème c’est qu’elle me génère autant de pages que le nombre de fois ou j’appuie sur oui… j’aurais besoin d’un seul exemplaire de chaque, peut on limiter cela ?

    Autre problème, je ne trouve pas ce que je dois écrire pour mettre en place la fonction .deletePages. J’ai fait des recherches mais je ne trouve pas. Pourriez vous me donner un exemple de ce qu’il faut écrire pour que mon option “non” masque mon template ?

    J’aurais également une question quand au positionnement des pages générées. J’ai besoin que les pages générées ne se placent pas en dernier mais en page 5. Ma dernière page est une page fixe sur laquelle vient la signature du client, donc j’ai besoin de la placer toujours en dernier. Commet puis-je définir cette place lors de la création de la page ? 

    Avant, avec ma fonction this.getTemplate, je faisais disparaitre ma dernière page, faisais apparaitre le pages voulues puis faisais réapparaitre ma dernière page. Si j’ai bien compris, cette fonction spawn ne fait pas apparaitre/disparaitre mais crée et supprime (donc perd les données intégrées dessus si on la supprime) c’est bien cela ? 

    Merci pour votre aide,
    :bonjour:

    #67662
    Merlin
    Maître des clés

    Une page-modèle, ou template, est un “modèle” qui est la plupart du temps masqué et dont la fonction est d’être dupliqué (to spawn = https://translate.google.fr/#view=home&op=translate&sl=en&tl=fr&text=to%20spawn )

    Il faut voir les pages-modèles comme une sous-couche ou comme un calque qui serait masqué, sauf que contrairement à un calque la position dans le document n’est pas figée.

    Il y a deux cas type d’utilisation :
    – un seul modèle, masqué ou non au départ, dupliqué plusieurs fois, auquel cas il faut nécessairement renommer les champs, exemple : https://www.abracadabrapdf.net/?p=3736
    – plusieurs modèles, masqués au départ, dupliqués chacun une seule fois, par exemple pour faire apparaitre un contrat A ou un contrat B ou un contrat C, etc. en fonction des choix utilisateur.

    Dans ce dernier cas, chaque modèle n’étant dupliqué qu’une fois il n’est pas nécessaire de renommer les champs (paramètre bRename), auquel cas leur contenu est commun sur la page-modèle masquée et sur la page générée visible, parce-qu’on obtient des champs en double qui ont le même nom.
    Supprimer une page visible et ensuite re-générer une nouvelle page visible à partir de son modèle masqué n’affecte en rien le contenu des champs.

    Donc, si le paramètre bRename est false “générer/supprimer” une page-modèle revient exactement au même que “afficher/masquer” une page-modèle. Sauf que ça fonctionne aussi avec Acrobat Reader.
    :Smiley15:

    spawn : https://help.adobe.com/en_US/acrobat/acrobat_dc_sdk/2015/HTMLHelp/Acro12_MasterBook/JS_API_AcroJS/Template_methods.htm?rhhlterm=template&rhsyns=%20

    deletePages : https://help.adobe.com/en_US/acrobat/acrobat_dc_sdk/2015/HTMLHelp/Acro12_MasterBook/JS_API_AcroJS/Doc_methods.htm?rhhlterm=deletePage&rhsyns=%20#XREF_99469_deletePages

    #67663
    noepix
    Membre

    Bonjour Merlin,

    Merci pour ta réponse. Effectivement grâce à cela j’ai mieux compris cette fonction spawn et surtout j’ai pu la corriger.
    Ainsi, à présent j’ai mis en place ceci sur le bouton radio oui :this.getTemplate(“01_A”).spawn({nPage:1, bRename:false, bOverlay: false});
    this.getTemplate(“01_B»).spawn({nPage:2, bRename:false, bOverlay: false});
    Afin de faire apparaitre mes 2 pages de mon premier template.

    En revanche, pour les faire disparaitre, je me retrouve face à un problème.

    Je souhaiterais pouvoir déterminer quelles pages supprimer, sans passer par le numéro de pages mais en spécifiant son identifiant de template.

    Je m’explique :
    Quand mon client arrive devant les quatres options, il peux en sélectionner avec oui ou non les options qu’il désire. Mais si il ne souhaite pas la première option, il va sélectionner “non”. Il ne faut pas alors que des pages soient supprimés, je ne peux donc pas coder que “non” signifie supprimer la page 2. Mais si il met “oui”, la page pour la première option va se générer après la page du choix, donc en page 2. Si alors il se ravise et met non, il faut que cette pages soit supprimée… mais le non ne peux pas dire “supprimer page 2″…De même si il dit oui à l’option 3 (qui sera ajoutée en tant que page 2 à ce moment là) puis ensuite met non aux autres options, il ne faut pas que le non supprime ma page 2 ajoutée pour l’option 3…

    J’ai essayé ceci :this.deletePages({nStart: “01_A”, nEnd: “01_B”});
    “01_A” et “01_B” étant les noms des deux pages de ma première option, mais cela ne fonctionne pas pas…

    Auriez vous une idée pour supprimer la page en fonction de son modèle de template et non de sa numérotation ?
    Je joint un fichier d’exemple afin que ce soit plus clair (je l’espère)

    Merci
    :Smiley01:

    #67664
    bebarth
    Maître des clés

    bonjour,
    Voici ma solution.
    Désolé, mais je n’avais pas vu que tu avais posté un second fichier.
    Pour les explications, voir :
    https://help.adobe.com/en_US/acrobat/acrobat_dc_sdk/2015/HTMLHelp/index.html#t=Acro12_MasterBook%2FJS_API_AcroJS%2FDoc_methods.htm%23TOC_spawnPageFromTemplatebc-105&rhtocid=_6_1_8_23_1_104
    et
    https://help.adobe.com/en_US/acrobat/acrobat_dc_sdk/2015/HTMLHelp/index.html#t=Acro12_MasterBook%2FJS_API_AcroJS%2FDoc_methods.htm%23TOC_deletePagesbc-20&rhtocid=_6_1_8_23_1_19
    J’ai incorporé des champs invisible pour indiquer si chaque modèle était dupliqué ou non car je ne savais pas s’il y a moyen de vérifier avec tes pages modèles.
    @+
    :bonjour:

    #67665
    noepix
    Membre

    Bonjour Bebarth,

    Merci beaucoup, c’est exactement ce que je veux effectivement !

    En revanche chacun de mes cas comportent 2 ou 3 pages de template selon les cas. J’ai crée un template par page. Auparavant, ajouter 2 “executer un script javascript” successif fonctionnait, mais pas avec ce nouveau code…
    Pour ce qui est de tes champs invisibles je ne vois pas à quoi ils servent en revanche. Je n’ai pas vu une seule valeur qui leur est lié dans propriétés et pourtant tu les cite dans ta fonction… Comment les définis tu ?
    En réalité mon fichier comporte un Cas 01, un cas 02, un cas 03-A un cas 03-B et un cas 04, donc je vais devoir modifier ceci, mais je ne comprends pas comment tu l’as mis en place…
    Merci beaucoup encore une fois à vous deux de m’aider sur ce fichier ! :bonjour:

    #67666
    Merlin
    Maître des clés

    J’ai essayé ceci :this.deletePages({nStart: “01_A”, nEnd: “01_B”});
    “01_A” et “01_B” étant les noms des deux pages de ma première option, mais cela ne fonctionne pas pas…

    J’avais essayé ça aussi au début, ça aurait été bien si ça fonctionnait…
    :Smiley03:

    #67667
    bebarth
    Maître des clés

    bonsoir,

    Je souhaiterais pouvoir déterminer quelles pages supprimer, sans passer par le numéro de pages mais en spécifiant son identifiant de template.

    Je m’explique :
    Quand mon client arrive devant les quatres options, il peux en sélectionner avec oui ou non les options qu’il désire. Mais si il ne souhaite pas la première option, il va sélectionner “non”. Il ne faut pas alors que des pages soient supprimés, je ne peux donc pas coder que “non” signifie supprimer la page 2. Mais si il met “oui”, la page pour la première option va se générer après la page du choix, donc en page 2. Si alors il se ravise et met non, il faut que cette pages soit supprimée… mais le non ne peux pas dire “supprimer page 2″…De même si il dit oui à l’option 3 (qui sera ajoutée en tant que page 2 à ce moment là) puis ensuite met non aux autres options, il ne faut pas que le non supprime ma page 2 ajoutée pour l’option 3…

    Les cases invisibles servent à ça !
    Une fois le modèle dupliqué, cela devient une simple page que l’on peut ou non distinguer selon si on a des champs et si on les a renommés ou pas.
    Ici on compte les pages à partir de la fin du document, il faut savoir si la/les pages modèles des cases ont été ajoutées. On indique donc dans chaque case 1 ou 2 lorsque le cas a été choisi et on repasse à 0 si on l’enlève !
    Il suffira donc de modifier à l’identique du cas 01 les autres cas s’ils ont plusieurs pages modèles…
    @+
    :bonjour:

    #67668
    noepix
    Membre

    Bonjour à vous deux,
    J’ai pu me pencher de nouveau sur mon problème hier et grâce à vos explications et à vos exemples, j’ai pu mettre en place un code qui fonctionne et qui fait exactement ce que je souhaite !
    J’ai pu adapter ce que vous m’aviez répondu afin qu’il corresponde à mon fichier, ce qui m’a donné le code suivant pour le cas 01 sur la case “Oui” :

    Code:
    var nbPages=this.getField(“cas02”).value+this.getField(“cas03A”).value+this.getField(“cas03B”).value+this.getField(“cas04”).value;
    if (event.target.value==”Oui” && this.getField(“cas01”).value==0) {
        this.spawnPageFromTemplate({
            cTemplate: “01p1”,
            nPage: this.numPages-(2+nbPages),
            bRename: false,
            bOverlay: false
        });
        this.spawnPageFromTemplate({
            cTemplate: “01p2”,
            nPage: this.numPages-(2+nbPages),
            bRename: false,
            bOverlay: false
        });
        this.getField(“cas01”).value=2;
        this.pageNum=3;
    }

    Et pour le cas 01 lorsque la case non a été coché celà donné :

    Code:
    var nbPages=this.getField(“cas02”).value+this.getField(“cas03A”).value+this.getField(“cas03A”).value+this.getField(“cas04”).value;
    if (event.target.value==”Non” && this.getField(“cas01”).value==2) {
        this.deletePages({
            nStart: this.numPages-(2+nbPages+2),
            nEnd: this.numPages-(2+nbPages+1)
        });
        this.getField(“cas01”).value=0;
    }

    Je joins mon fichier d’exemple entièrement fonctionnel en démo au cas où certains rencontreraient le même genre de problème à l’avenir.Encore merci à tout les deux et très bonne journée,

    :bonjour:

    #67669
    bebarth
    Maître des clés

    :bravo:
    BRAVO !
    …surtout si tu as bien compris le principe.
    @+
    :bonjour:

    #67670
    noepix
    Membre

    Tout à fait !

    J’ai bien compris l’ensemble de la fonction en place. Honnêtement, je n’aurais jamais pensé à créer des champs invisibles pour créer une valeur à partir de laquelle baser le positionnement des pages (entre autre). C’est très malin !

    Ca m’encourage à réfléchir davantage à des manières de contourner un obstacle quand je ne trouve pas une fonction faisant exactement ce que je veux, sans astuces ni détours.

    Je vais continuer à découvrir de nouvelles manières d’utiliser les PDFs efficacement

    à bientôt

    :bonjour:

    #67671
    Merlin
    Maître des clés

    :bravo: 
    Merci pour le partage.

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