Ajoute le plugin Acrobat Pro d'imposition (acrobat-plugin/)

Suite d'imposition professionnelle en Folder-Level Scripts JS (7 modules +
verification de licence Vision), avec un plugin natif hybride optionnel
(WinINet + Registre) pour deplacer la verification de licence en code
compile. Installeur install.bat sur le meme modele que celui du projet
desktop (git portable, detection automatique des dossiers Acrobat).
This commit is contained in:
Jules
2026-06-21 22:16:24 +02:00
parent 202834a794
commit de76c1776c
14 changed files with 2856 additions and 0 deletions

View File

@@ -0,0 +1,222 @@
// Imposition-04-Decoupe.js
// ---------------------------------------------------------------------------
// Suite d'imposition professionnelle - Folder-Level Script pour Adobe Acrobat Pro
// Module 4 : Decoupe et reassemblage de pages
//
// Depend de Imposition-00-Core.js (doit etre charge avant).
//
// Repose sur CDImp.Util.extraireRegionPage() / placerPageDansRect() (voir
// avertissement dans Imposition-00-Core.js). A tester dans Acrobat Pro reel
// avant usage en production.
// ---------------------------------------------------------------------------
if (typeof CDImp === "undefined") {
throw new Error("Imposition-04-Decoupe.js : CDImp.Core doit etre charge avant ce fichier.");
}
CDImp.Decoupe = CDImp.Decoupe || {};
// -----------------------------------------------------------------------
// Couper les pages en deux (Split)
// -----------------------------------------------------------------------
/**
* Coupe chaque page de srcDoc en deux moities independantes et retourne un
* nouveau document contenant 2x plus de pages.
*
* @param {Doc} srcDoc
* @param {String} axe "vertical" (gauche/droite) | "horizontal" (haut/bas)
* @returns {Doc} nouveau document
*/
CDImp.Decoupe.couperPages = function (srcDoc, axe) {
var destDoc;
CDImp.Util.avecPrivileges(function () {
destDoc = new Doc();
});
var nDestPage = 0;
for (var s = 0; s < srcDoc.numPages; s++) {
var box = srcDoc.getPageBox({ nPage: s, cBox: "Crop" });
var w = Math.abs(box[2] - box[0]);
var h = Math.abs(box[3] - box[1]);
var demis; // [{rect, largeur, hauteur}, ...] dans l'ordre de lecture
if (axe === "horizontal") {
demis = [
{ rect: [0, h / 2, w, h], largeur: w, hauteur: h / 2 }, // haut
{ rect: [0, 0, w, h / 2], largeur: w, hauteur: h / 2 } // bas
];
} else {
demis = [
{ rect: [0, 0, w / 2, h], largeur: w / 2, hauteur: h }, // gauche
{ rect: [w / 2, 0, w, h], largeur: w / 2, hauteur: h } // droite
];
}
for (var d = 0; d < demis.length; d++) {
CDImp.Util.avecPrivileges(function () {
destDoc.newPage({ nPage: nDestPage, width: demis[d].largeur, height: demis[d].hauteur });
});
CDImp.Util.extraireRegionPage(srcDoc, s + 1, demis[d].rect, destDoc, nDestPage);
nDestPage++;
}
}
return destDoc;
};
// -----------------------------------------------------------------------
// Inversion de l'ordre des pages
// -----------------------------------------------------------------------
/**
* Retourne un nouveau document avec les pages de srcDoc dans l'ordre inverse.
*/
CDImp.Decoupe.inverserOrdre = function (srcDoc) {
var n = srcDoc.numPages;
var destDoc;
CDImp.Util.avecPrivileges(function () {
destDoc = new Doc();
});
for (var i = 0; i < n; i++) {
var nSrcPage = n - i; // 1-based, en partant de la derniere page
var box = srcDoc.getPageBox({ nPage: nSrcPage - 1, cBox: "Crop" });
var w = Math.abs(box[2] - box[0]);
var h = Math.abs(box[3] - box[1]);
CDImp.Util.avecPrivileges(function () {
destDoc.newPage({ nPage: i, width: w, height: h });
});
CDImp.Util.placerPageDansRect(srcDoc, nSrcPage, destDoc, i, [0, 0, w, h]);
}
return destDoc;
};
// -----------------------------------------------------------------------
// Reassemblage par motif (mélange par blocs)
// -----------------------------------------------------------------------
/**
* Reordonne les pages de srcDoc par blocs, selon un motif comme "1,3,2,4"
* (1-based, a l'interieur de chaque bloc). La taille de bloc est la longueur
* du motif ; le nombre de pages doit en etre un multiple exact.
*
* @param {Doc} srcDoc
* @param {String} motifStr ex: "1,3,2,4"
* @returns {Doc} nouveau document reordonne
*/
CDImp.Decoupe.reassembler = function (srcDoc, motifStr) {
var motif = motifStr.split(",").map(function (s) { return parseInt(s.trim(), 10); });
var taille = motif.length;
if (taille === 0 || motif.some(function (m) { return isNaN(m) || m < 1 || m > taille; })) {
throw new Error("Motif invalide : \"" + motifStr + "\". Attendu une liste de positions 1-based, ex: 1,3,2,4");
}
if (srcDoc.numPages % taille !== 0) {
throw new Error("Le document (" + srcDoc.numPages + " pages) n'est pas un multiple de la taille de bloc (" + taille + ").");
}
var nBlocs = srcDoc.numPages / taille;
var destDoc;
CDImp.Util.avecPrivileges(function () {
destDoc = new Doc();
});
var nDestPage = 0;
for (var b = 0; b < nBlocs; b++) {
for (var k = 0; k < taille; k++) {
var nSrcPage = b * taille + motif[k]; // 1-based
var box = srcDoc.getPageBox({ nPage: nSrcPage - 1, cBox: "Crop" });
var w = Math.abs(box[2] - box[0]);
var h = Math.abs(box[3] - box[1]);
CDImp.Util.avecPrivileges(function () {
destDoc.newPage({ nPage: nDestPage, width: w, height: h });
});
CDImp.Util.placerPageDansRect(srcDoc, nSrcPage, destDoc, nDestPage, [0, 0, w, h]);
nDestPage++;
}
}
return destDoc;
};
// -----------------------------------------------------------------------
// Point d'entree du module
// -----------------------------------------------------------------------
CDImp.Decoupe.lancer = function (doc) {
try {
doc = CDImp.Util.getDocActif(doc);
} catch (e) {
CDImp.Util.erreur(e.toString());
return;
}
var action = app.popUpMenu(
{ cName: "Couper les pages en deux (Split)", cReturn: "split" },
{ cName: "Inverser l'ordre des pages", cReturn: "reverse" },
{ cName: "Reassembler par motif (Shuffle)", cReturn: "shuffle" }
);
if (!action) { return; }
var destDoc, params;
try {
switch (action) {
case "split":
var axe = app.popUpMenu(
{ cName: "Vertical (gauche / droite)", cReturn: "vertical" },
{ cName: "Horizontal (haut / bas)", cReturn: "horizontal" }
);
if (!axe) { return; }
params = { action: "split", axe: axe };
destDoc = CDImp.Decoupe.couperPages(doc, axe);
break;
case "reverse":
params = { action: "reverse" };
destDoc = CDImp.Decoupe.inverserOrdre(doc);
break;
case "shuffle":
var motifStr = app.response({
cQuestion: "Motif de reassemblage par bloc (positions 1-based separees par des virgules) :",
cTitle: "Reassembler par motif",
cDefault: "1,3,2,4"
});
if (motifStr === null) { return; }
params = { action: "shuffle", motif: motifStr };
destDoc = CDImp.Decoupe.reassembler(doc, motifStr);
break;
}
} catch (e) {
CDImp.Util.erreur("Erreur : " + e.toString());
return;
}
if (CDImp.Auto && CDImp.Auto.enregistrerDerniereAction) {
CDImp.Auto.enregistrerDerniereAction("Decoupe.executer", params);
}
CDImp.Util.info("Operation terminee (" + destDoc.numPages + " page(s)).\nPensez a l'enregistrer (Ctrl+S) sous un nouveau nom.");
};
/**
* Variante directe sans dialogues (Module 7 - Automatisation).
*/
CDImp.Decoupe.executerAvecParams = function (doc, params) {
doc = CDImp.Util.getDocActif(doc);
var destDoc;
switch (params.action) {
case "split":
destDoc = CDImp.Decoupe.couperPages(doc, params.axe);
break;
case "reverse":
destDoc = CDImp.Decoupe.inverserOrdre(doc);
break;
case "shuffle":
destDoc = CDImp.Decoupe.reassembler(doc, params.motif);
break;
default:
throw new Error("Action inconnue : " + params.action);
}
CDImp.Util.info("Operation recreee avec succes (" + destDoc.numPages + " page(s)).");
return destDoc;
};