// Imposition-08-MiseAJour.js // --------------------------------------------------------------------------- // Suite d'imposition professionnelle - Folder-Level Script pour Adobe Acrobat Pro // Module 8 : Verification et installation des mises a jour, depuis le menu // Acrobat lui-meme (pas besoin de relancer un installeur externe pour les // mises a jour ulterieures ; l'installeur externe ne sert plus qu'au tout // premier deploiement). // // Depend de Imposition-00-Core.js et Imposition-00b-Licence.js (reutilise // CDImp.Licence._lireFluxReponse pour lire les reponses Net.HTTP). // // AVERTISSEMENTS TECHNIQUES - a tester dans Acrobat Pro reel : // - Le parametre cFile de Net.HTTP.request() (telechargement direct vers // un fichier disque) est suppose exister par analogie avec d'autres // usages documentes du Network Object, mais n'a pas pu etre verifie ici. // Si indisponible, ecrire le fichier autrement (ex: lire le flux comme // pour la licence, puis l'ecrire avec un mecanisme de fichier - a // determiner selon les API reellement exposees par votre version // d'Acrobat). // - L'enumeration des dossiers Acrobat installes evite volontairement // l'objet `Enumerator` (specifique a JScript/WSH, probablement absent du // moteur JS d'Acrobat) : on teste une liste de noms de version connus // via FolderExists() plutot que d'enumerer dynamiquement le contenu du // dossier %APPDATA%\Adobe\Acrobat. Completer CONFIG.versionsConnues si // une version recente n'y figure pas. // --------------------------------------------------------------------------- if (typeof CDImp === "undefined") { throw new Error("Imposition-08-MiseAJour.js : CDImp.Core doit etre charge avant ce fichier."); } CDImp.MiseAJour = CDImp.MiseAJour || {}; CDImp.MiseAJour.CONFIG = { urlBaseRaw: "https://git.copydev.fr/jules/copydev-imposing-tool/raw/branch/master/acrobat-plugin/", fichierVersion: "version.txt", dossierSrc: "src/", fichiers: [ "Imposition-00-Core.js", "Imposition-00b-Licence.js", "Imposition-01-UI.js", "Imposition-02-Livret.js", "Imposition-03-NUp.js", "Imposition-04-Decoupe.js", "Imposition-05-Marges.js", "Imposition-06-Reperes.js", "Imposition-07-Auto.js", "Imposition-08-MiseAJour.js" ], versionsConnues: ["DC", "2024", "2023", "2022", "2021", "2020", "11.0"] }; // ----------------------------------------------------------------------- // Comparaison de versions "x.y.z" // ----------------------------------------------------------------------- /** * @returns {Number} 1 si b > a, -1 si b < a, 0 si egales */ CDImp.MiseAJour._comparerVersions = function (a, b) { var pa = String(a).split(".").map(Number); var pb = String(b).split(".").map(Number); var n = Math.max(pa.length, pb.length); for (var i = 0; i < n; i++) { var va = pa[i] || 0; var vb = pb[i] || 0; if (vb > va) { return 1; } if (vb < va) { return -1; } } return 0; }; // ----------------------------------------------------------------------- // Detection des dossiers JavaScripts d'Acrobat installes // ----------------------------------------------------------------------- CDImp.MiseAJour._trouverDossiersJavaScripts = function () { var dossiers = []; try { var shell = new ActiveXObject("WScript.Shell"); var fso = new ActiveXObject("Scripting.FileSystemObject"); var racine = shell.ExpandEnvironmentStrings("%APPDATA%") + "\\Adobe\\Acrobat"; for (var i = 0; i < CDImp.MiseAJour.CONFIG.versionsConnues.length; i++) { var dossierVersion = racine + "\\" + CDImp.MiseAJour.CONFIG.versionsConnues[i]; if (fso.FolderExists(dossierVersion)) { var dossierJS = dossierVersion + "\\JavaScripts"; if (!fso.FolderExists(dossierJS)) { fso.CreateFolder(dossierJS); } dossiers.push(dossierJS); } } } catch (e) { // ActiveXObject indisponible : on ne peut pas detecter les dossiers // automatiquement (cas hors Windows, ou scripts non-privilegies). } return dossiers; }; // ----------------------------------------------------------------------- // Requete HTTP GET -> texte (reutilise la lecture de flux de Licence.js) // ----------------------------------------------------------------------- CDImp.MiseAJour._telechargerTexte = function (url) { var resultat = { erreur: null, texte: null }; try { Net.HTTP.request({ cVerb: "GET", cURL: url, oHandler: { response: function (msgStream, status) { if (status && status >= 400) { resultat.erreur = "HTTP " + status; } else { resultat.texte = CDImp.Licence._lireFluxReponse(msgStream); } }, error: function (msg, err) { resultat.erreur = (err || msg || "Erreur reseau inconnue").toString(); } }, bAsync: false }); } catch (e) { resultat.erreur = e.toString(); } return resultat; }; /** * Telecharge url directement vers le fichier cheminDest (ecrase si present). */ CDImp.MiseAJour._telechargerVersFichier = function (url, cheminDest) { var resultat = { erreur: null }; try { Net.HTTP.request({ cVerb: "GET", cURL: url, cFile: cheminDest, oHandler: { response: function (msgStream, status) { if (status && status >= 400) { resultat.erreur = "HTTP " + status; } }, error: function (msg, err) { resultat.erreur = (err || msg || "Erreur reseau inconnue").toString(); } }, bAsync: false }); } catch (e) { resultat.erreur = e.toString(); } return resultat; }; // ----------------------------------------------------------------------- // Point d'entree : verifie puis propose d'installer la mise a jour // ----------------------------------------------------------------------- CDImp.MiseAJour.verifier = function () { var reponse = CDImp.MiseAJour._telechargerTexte( CDImp.MiseAJour.CONFIG.urlBaseRaw + CDImp.MiseAJour.CONFIG.fichierVersion); if (reponse.erreur || !reponse.texte) { CDImp.Util.erreur("Impossible de verifier les mises a jour (reseau indisponible ou serveur inaccessible) :\n" + (reponse.erreur || "")); return; } var versionDistante = reponse.texte.replace(/[\r\n\s]+/g, ""); var comparaison = CDImp.MiseAJour._comparerVersions(CDImp.VERSION, versionDistante); if (comparaison <= 0) { CDImp.Util.info("Vous avez deja la derniere version (v" + CDImp.VERSION + ")."); return; } var confirmer = app.alert({ cMsg: "Une mise a jour est disponible : v" + versionDistante + " (vous avez v" + CDImp.VERSION + ").\nInstaller maintenant ?", cTitle: "Mise a jour disponible", nIcon: 2, // question nType: 2 // Oui/Non }); if (confirmer !== 4) { // 4 = "Oui" pour nType 2 dans Acrobat JS return; } var dossiers = CDImp.MiseAJour._trouverDossiersJavaScripts(); if (dossiers.length === 0) { CDImp.Util.erreur("Aucun dossier JavaScripts d'Acrobat detecte automatiquement.\nMise a jour annulee : utilisez l'installeur externe si besoin."); return; } var erreurs = []; CDImp.Util.avecPrivileges(function () { for (var d = 0; d < dossiers.length; d++) { for (var f = 0; f < CDImp.MiseAJour.CONFIG.fichiers.length; f++) { var nomFichier = CDImp.MiseAJour.CONFIG.fichiers[f]; var url = CDImp.MiseAJour.CONFIG.urlBaseRaw + CDImp.MiseAJour.CONFIG.dossierSrc + nomFichier; var cheminDest = dossiers[d] + "\\" + nomFichier; var resultatTelechargement = CDImp.MiseAJour._telechargerVersFichier(url, cheminDest); if (resultatTelechargement.erreur) { erreurs.push(nomFichier + " (" + dossiers[d] + ") : " + resultatTelechargement.erreur); } } } }); if (erreurs.length > 0) { CDImp.Util.erreur("Mise a jour partielle, erreurs sur " + erreurs.length + " fichier(s) :\n" + erreurs.join("\n")); } else { CDImp.Util.info("Mise a jour vers v" + versionDistante + " installee avec succes.\nRedemarrez Acrobat Pro pour l'appliquer."); } }; // ----------------------------------------------------------------------- // Entree de menu "Verifier les mises a jour..." // ----------------------------------------------------------------------- try { app.addMenuItem({ cName: "CDImpVerifierMAJ", cParent: "ImpositionPro", cExec: "CDImp.MiseAJour.verifier();", nPos: 2 }); } catch (e) {}