Donnez vie à vos documents numériques !
 

Probleme Javascript dans PDF

abracadabraPDF Forums PDF – Général Probleme Javascript dans PDF

Étiqueté : 

  • Ce sujet contient 14 réponses, 4 participants et a été mis à jour pour la dernière fois par Merlin, le il y a 4 mois.
  • Créateur
    Sujet
  • #75165
    David Misso
    Participant

    Bonjour à tous,

    Je bloque sur une action JS dans mon fichier PDF.

    Résumé :
    On me demande de mettre un champs de saisi pour trouver des références dans un PDF.

    Comme j’ai beaucoup de référence, plus de 800, les gens se perdent pour sélectionner la bonne référence. Alors j’ai proposé de mettre un champs permettant de taper 2 chiffres d’un code qui réduira à une dizaine les choix. et un menu déroulant ou s’afficheront les codes trouvés.

    J’ai donc un champs texte (pour saisir les chiffres appeler “codeInput“) et un menu déroulant (appelé “filteredOptions“) où seront les références trouvées.

    J’ai mis dans la partie “Scripts JavaScript du document“ un script avec la liste des 800 références obtenu avec un export Json d’un Excell. Je l’ai déjà nettoyé et modifié les guillemets et autres.

    Le script du document pour exemple :
    function JSON() { var data = [ {“code”: “10A1”, “value”: “Option 1”}, {“code”: “10A2”, “value”: “Option 2”} ]; }
    bon j’ai 800 lignes (et plus), mais j’en ai mis deux pour exemples.

    Dans le champs de saisi j’ai mis dans “validation“ / “Exécuter le script de validation personnalisé :
    var userInput = this.getField(“codeInput”).value;
    var dropdown = this.getField(“filteredOptions”);

    if (!dropdown || dropdown.type !== “combobox”) { app.alert(“Le champ ‘filteredOptions’ doit être un menu déroulant !”); {}
    }

    dropdown.setItems([]);

    if (userInput.length >= 2) {
    var filtered = data.filter(function(item) {
    return item.code.startsWith(userInput);
    });
    if (filtered.length > 0) {
    var items = filtered.map(function(item) {
    return [item.value];
    });

    dropdown.setItems(items);
    } else {
    dropdown.setItems([[“Aucune correspondance”]]); }
    } else {
    dropdown.setItems([[“Entrez au moins 2 caractères”]]);
    }

    Et ça ne marche pas… j’ai tout vérifier avec mes pauvres connaissances. commencé à poser des questions à ChatGPT mais il m’alourdit le code en tentant des trucs qui ne marchent pas.

    La dernière fois que je lui ai demander de l’aide pour un truc je devenais fou et ai trouvé seul ma réponse. je pense que là aussi mais je ne trouve pas.

    si vous arrivez à m’aider ce serait très sympa, merci d’avance. et si je ne suis pas clair je suis ouvert à toutes les questions.

    en PJ un extrait pour que vous voyez le code

    Attachments:
    You must be logged in to view attached files.
Affichage de 14 réponses de 1 à 14 (sur un total de 14)
  • Auteur
    Réponses
  • #75167
    jctremblay
    Participant

    Boujour David,
    Regarde le document ici:
    J’ai modifié ton script de document en enlevant function JSON()
    J’ai mis le script en tant que script de calcul au lieu d’un script de validation.

    var userInput = this.getField("codeInput").value;
    var dropdown = this.getField("filteredOptions");
    // Sécuriser la conversion en chaîne et en minuscules
    userInput = userInput ? String(userInput).toLowerCase() : "";
    // Gérer les différents cas de saisie
    if (userInput.length < 2) {
    dropdown.setItems(["Entrez au moins 2 caractères"]);
    } else {
    // Filtrer les options
    var filtered = data.filter(function(item) {
    return item.code.toLowerCase().startsWith(userInput);
    });
    if (filtered.length > 1) {
    // Construire un tableau des valeurs pour le dropdown
    var options = filtered.map(function(item) {
    return item.value;
    });
    dropdown.setItems(options);
    } else {
    dropdown.setItems(["Aucune correspondance"]);
    }
    }

     

    Attachments:
    You must be logged in to view attached files.
    #75172
    David Misso
    Participant

    Merci !!!! Un million de fois merci.
    Je vais analyser ça pour essayer de comprendre et d’appliquer la solution à mes autres docs…
    Merci vraiment d’avoir pris le temps de regarder.

     

    #75175
    David Misso
    Participant

    Bonjour,
    peut-on avoir plusieurs listes dans Préparer un formulaire\Scripts Javascript du document ?

    On a actuellement la liste JSON. mais j’ai besoin de créer 2 autres listes  car les tableaux sont très longs.

    Puis-je le faire et surtout comment est-ce que je les appelle, car je n’avais pas eu à le faire dans ce que j’ai partagé, et je n’ai pas remarqué de nouvelles lignes JS pour appeler spécifiquement la liste JSON. comme le non avait été modifié je pensais qu’il le fallait.

    merci pour votre gentillesse et votre suivi

    #75176
    bebarth
    Maître des clés

    bonjour,
    Si les données sont extraites d’un fichier Excel, pourquoi ne pas attacher un fichier au pdf ?

    @+
    😎

    #75177
    David Misso
    Participant

    On peut faire ça ?
    Et aller chercher les données dans le fichier Excell sans l’ouvrir par le client ?

    Alors, déjà que mon niveau est bas en JS, là, je suppose que je n’y arriverais jamais …

    Peut être que je me pose trop de question et qu’il serait plus simple de ne pas utiliser de “Script javascript du document“ et de mettre mon script dans un seul champs texte… sans chercher ailleurs de données ?

    Je pense que je ne suis pas assez clair.

    • Cette réponse a été modifiée le il y a 4 mois par David Misso.
    #75179
    bebarth
    Maître des clés

    Peux-tu partager un fichier Excel (au format csv ou txt) ou une partie de ce fichier et m’indiquer les cellules utiles.

    @+
    😎

    #75182
    David Misso
    Participant

    Bien sur que je le peux 🙂 le fichier d’origine a 752 lignes, j’en ai mis que quelques une.

    merci beaucoup

    J’ai essayé d’autres JS cette nuit mais je n’obtient rien.

    Attachments:
    You must be logged in to view attached files.
    #75184
    Merlin
    Maître des clés

    “On peut faire ça ?”

    Oui, regarde ce document de démo : https://www.abracadabrapdf.net/pdf-de-demo/formulaires/open-data-javascript-et-pdf/

    Il y a 26560 entrées dans le fichier CSV incorporé.

    #75186
    David Misso
    Participant

    Merci Merlin, en effet le doc est … long 😀

    Comme d’hab, je me prends une baffe avec la capacité fantastique d’acrobat.

    Je suis en train de décortiquer ton PDF, mais mes connaissance en JS sont rouillées, enfin plutôt grippées. ma formation en JS a bien lancé ma réflexion mais je ne l’ai pas utilisé pendant plus d’un an, il me faut me remettre dans le bain… et c’est vraiment dur.

    #75189
    Merlin
    Maître des clés

    Ne te fatigues pas avec les scripts contenus dans le document ils sont minifiés.

     

    Ci-dessous les deux principaux, le premier s’exécute à l’ouverture du document, le deuxième à chaque changement de sélection du menu déroulant.

    /* importation texte */
    this.delay = true;
    this.resetForm();
    this.getField("ratpStation").clearItems(); // champ liste déroulante
    // importer l'unique PJ sans la nommer
    var p = this.getDataObject(this.dataObjects[0].name)
    var fi = this.getDataObjectContents(p.name)
    var fit = util.stringFromStream(fi)
    // séparation des rangées
    var datarr1 = fit.split("\n")
    // séparation des colonnes
    var datarr = new Array()
    for (var i = 0 ; i < datarr1.length ; i++) {datarr = datarr1.split(";")}
    var fillarr = new Array() ;
    for (var j = 0 ; j < datarr.length ; j++) { fillarr[j] = [datarr[j][1], j] ;}
    // remplissage de la liste déroulante avec la 2e rangée
    this.getField("ratpStation").setItems(fillarr);
    // réglage du corps de la liste déroulante au cas où
    this.getField("ratpStation").textSize = 18;
    // masquage du champ QRcode
    this.getField("ratp.QRcode").display = display.hidden;
    // masquage du bouton Gmap
    this.getField("ratpBoutonGmap").display = display.hidden;
    // mise en couleur des champs
    maCouleur = ["RGB", 224/255, 224/255, 224/255]; // gris moyen clair
    this.getField("ratpStation").fillColor = maCouleur;
    this.getField("ratp.adresse").fillColor = maCouleur;
    this.getField("ratp.coordonneesGPS").fillColor = maCouleur;
    this.getField("ratp.departement").fillColor = maCouleur;
    this.delay = false;
    this.dirty = false;

    /****************************************************/

    function selectData() {
    if (!event.willCommit) {
    this.delay = true;
    this.getField("ratp.adresse").value = datarr[event.changeEx][2];
    this.getField("ratp.coordonneesGPS").value = datarr[event.changeEx][3];
    this.getField("ratp.departement").value = datarr[event.changeEx][7];
    // affichage bouton Gmap
    this.getField("ratpBoutonGmap").display = display.visible;
    // affichage du champ QRcode sauf si Reader
    if (app.viewerVariation == "Reader")
    {this.getField("ratp.QRcode").display = display.hidden;}
    else
    {this.getField("ratp.QRcode").display = display.visible;}
    //
    if (datarr[event.changeEx][1] == "Sélectionnez une station") {
    this.resetForm("ratp");
    this.getField("ratpBoutonGmap").display = display.hidden;
    this.getField("ratp.QRcode").display = display.hidden;
    }
    this.delay = false;
    this.dirty = false;
    }
    }

    #75190
    Merlin
    Maître des clés

    this.dirty = false;

    est placé à la fin de chaque fonction pour que l’utilisateur ne soit pas invité à enregistrer le document après utilisation.

    #75201
    bebarth
    Maître des clés

    bonjour,
    Voici une solution possible. Ici on ne peut écrire que sous le code sous format désiré (2 chiffres, 1 point, 2 chiffres et 1 lettre) et le nombre d’éléments possibles est indiqué si il est multiple ou nul. S’il n’y en a qu’un, l’élément est directement affiché.
    On pourrait également modifier le script pour ne permettre de taper que les codes disponibles… Tu me dis !

    // script de document
    this.getField("codeInput").value="";
    this.getField("filteredOptions").clearItems();
    var p=this.getDataObject(this.dataObjects[0].name);
    var fichier=this.getDataObjectContents(p.name);
    var donnees=util.stringFromStream(fichier);
    var rangees=donnees.split("\n");
    var colonnes=new Array();
    for (var i=0; i<rangees.length; i++) colonnes=rangees.split(";");
    var cellule=new Array();
    for (var j=0; j<colonnes.length; j++) cellule[j]=[colonnes[j][1].replace(/\s$/,""),colonnes[j][0]];
    cellule[0][0]="- "+(cellule.length-1)+" éléments -";
    this.getField("filteredOptions").setItems(cellule);

    // Script de touches personnalisé
    if (!event.willCommit) {
    event.change=event.change.toUpperCase();
    var aTester=event.value.split("");
    aTester.splice(event.selStart,event.selEnd-event.selStart,event.change);
    var testeChaine=aTester.join("");
    if (testeChaine.length<6) testOK=/^(\d{1,2}([.](\d{1,2})?)?)?$/.test(testeChaine);
    else testOK=/^\d{2}[.]\d{2}[a-zA-Z]$/.test(testeChaine);
    event.rc=testOK;
    if (testOK) {
    var lesElements=[];
    for (var i=1; i<cellule.length; i++) {
    if (cellule[1].indexOf(testeChaine)==0) lesElements.push([cellule[0],cellule[1]]);
    }
    var nb=lesElements.length;
    if (nb!=1) lesElements.unshift("- "+nb+" élément(s) -");
    this.getField("filteredOptions").setItems(lesElements);
    }
    } else {
    if (event.value.length<6) testOK=/^(\d{1,2}([.](\d{1,2})?)?)?$/.test(event.value);
    else testOK=/^\d{2}[.]\d{2}[a-zA-Z]$/.test(event.value);
    event.rc=testOK;
    }

    @+
    😎

    Attachments:
    You must be logged in to view attached files.
    #75211
    David Misso
    Participant

    Bonjour à tous,

    Je voulais clore ce fil en vous donnant les formules magiques qui ont fonctionné. Si cela peut aider quelqu’un d’autre.

    Dans “Script Javascript du document“ j’ai mis :
    // Fonction pour lire les fichiers CSV attachés
    function lireCSV(nomFichier, tableauDestination) {
    try {
    var fichier = this.getDataObjectContents(nomFichier); //recupere le fichier .CSV
    var contenu = util.stringFromStream(fichier); // Lit le contenu
    var lignes = contenu.split(/\r?\n/); // créé les retours a la ligne
    for (var i = 0; i < lignes.length; i++) {
    var ligne = lignes.split(“;“);
    if (ligne.length === 2) {
    tableauDestination.push({ code: ligne[0].trim(), value: ligne[1].trim() });
    }
    }
    } catch (e) {
    console.println(“Erreur lors du chargement de ” + nomFichier + “: ” + e.message);
    }
    }

    var csvData = {
    NACE: [],
    CSP: [],
    PAYS: []
    };

    // Charger les données au démarrage du document
    lireCSV(“Code_NACE_2_col.csv“, csvData.NACE);
    lireCSV(“Liste_CSP_niv4_2.csv“, csvData.CSP);
    lireCSV(“liste_pays.csv“, csvData.PAYS);

    Et le code pour mes champs texte :
    if (event.willCommit) {
    var input = event.value.substring(0, 2);
    if (input.length === 2) {
    var resultats = csvData.NACE.filter(function(item) {
    return item.code.startsWith(input); });
    var menu = this.getField(“Filtered_NAC“); menu.setItems(resultats.map(function(item) { return item.value; }));
    }
    }

    Le tout grâce à vous… merci un million de fois et j’espère que cela aidera quelqu’un.
    je vous ai mis en Italie les champs de nom à modifier et en gras le ; car c’est ça qui m’a posé le plus de problème… , ou ; il faut bien choisir !

    ENCORE MERCI !

    #75214
    Merlin
    Maître des clés

    🙂

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