Files
copydev-imposing-tool/acrobat-plugin/src/Imposition-03-NUp.js
Jules de76c1776c 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).
2026-06-21 22:16:24 +02:00

198 lines
7.8 KiB
JavaScript
Executable File

// Imposition-03-NUp.js
// ---------------------------------------------------------------------------
// Suite d'imposition professionnelle - Folder-Level Script pour Adobe Acrobat Pro
// Module 3 : N-Up & Step and Repeat (amalgame et multi-poses)
//
// Depend de Imposition-00-Core.js (doit etre charge avant).
//
// Repose sur CDImp.Util.placerPageDansRect() (technique template + CropBox,
// voir avertissement dans Imposition-00-Core.js) pour positionner ET mettre
// a l'echelle chaque page source dans sa cellule de grille. A tester dans
// Acrobat Pro reel avant usage en production.
// ---------------------------------------------------------------------------
if (typeof CDImp === "undefined") {
throw new Error("Imposition-03-NUp.js : CDImp.Core doit etre charge avant ce fichier.");
}
CDImp.NUp = CDImp.NUp || {};
/**
* Construit une grille de nLignes x nColonnes sur des feuilles au format
* (largeurFeuilleMm x hauteurFeuilleMm), en mode "n-up" (pages successives
* du document source) ou "repeat" (une seule page dupliquee sur la grille).
*
* @param {Doc} srcDoc document source
* @param {Object} p parametres :
* nLignes, nColonnes {Number}
* largeurFeuilleMm, hauteurFeuilleMm {Number}
* gouttiereMm {Number} espace entre les poses
* margeMm {Number} marge technique autour de la feuille
* mode {String} "nup" | "repeat"
* nPageRepeat {Number} page 1-based a dupliquer (mode "repeat" uniquement)
* @returns {Doc} le nouveau document compose
*/
CDImp.NUp.construireGrille = function (srcDoc, p) {
var feuilleW = CDImp.Util.mmToPt(p.largeurFeuilleMm);
var feuilleH = CDImp.Util.mmToPt(p.hauteurFeuilleMm);
var margePt = CDImp.Util.mmToPt(p.margeMm);
var goutPt = CDImp.Util.mmToPt(p.gouttiereMm);
var cellW = (feuilleW - 2 * margePt - (p.nColonnes - 1) * goutPt) / p.nColonnes;
var cellH = (feuilleH - 2 * margePt - (p.nLignes - 1) * goutPt) / p.nLignes;
if (cellW <= 0 || cellH <= 0) {
throw new Error("Grille N-Up : la feuille est trop petite pour " + p.nLignes + " x " + p.nColonnes + " avec ces marges/gouttieres.");
}
// Page de reference pour le ratio d'echelle (premiere page, ou page a
// repeter en mode Step & Repeat).
var nPageRef = (p.mode === "repeat") ? p.nPageRepeat : 1;
var boxRef = srcDoc.getPageBox({ nPage: nPageRef - 1, cBox: "Crop" });
var largeurSrc = Math.abs(boxRef[2] - boxRef[0]);
var hauteurSrc = Math.abs(boxRef[3] - boxRef[1]);
var echelle = Math.min(cellW / largeurSrc, cellH / hauteurSrc);
var largeurMise = largeurSrc * echelle;
var hauteurMise = hauteurSrc * echelle;
var nParFeuille = p.nLignes * p.nColonnes;
var nFeuilles = (p.mode === "repeat") ? 1 : Math.ceil(srcDoc.numPages / nParFeuille);
var destDoc;
CDImp.Util.avecPrivileges(function () {
destDoc = new Doc();
destDoc.newPage({ nPage: 0, width: feuilleW, height: feuilleH });
for (var k = 1; k < nFeuilles; k++) {
destDoc.newPage({ nPage: k, width: feuilleW, height: feuilleH });
}
});
for (var s = 0; s < nFeuilles; s++) {
for (var r = 0; r < p.nLignes; r++) {
for (var c = 0; c < p.nColonnes; c++) {
var idxGrille = r * p.nColonnes + c;
var nSrcPage;
if (p.mode === "repeat") {
nSrcPage = p.nPageRepeat;
} else {
var idxGlobal = s * nParFeuille + idxGrille;
if (idxGlobal >= srcDoc.numPages) {
continue; // cellule vide en fin de grille
}
nSrcPage = idxGlobal + 1;
}
var cellX = margePt + c * (cellW + goutPt);
// r=0 correspond a la rangee du haut visuellement.
var cellYBas = feuilleH - margePt - (r + 1) * cellH - r * goutPt;
var offsetX = cellX + (cellW - largeurMise) / 2;
var offsetY = cellYBas + (cellH - hauteurMise) / 2;
CDImp.Util.placerPageDansRect(srcDoc, nSrcPage, destDoc, s,
[offsetX, offsetY, offsetX + largeurMise, offsetY + hauteurMise]);
}
}
}
return destDoc;
};
/**
* Demande le format de feuille cible (standard ou personnalise), en mm.
* @returns {Object|null} { largeurMm, hauteurMm }, ou null si annule
*/
CDImp.NUp._demanderFormatFeuille = function () {
var choix = app.popUpMenu(
{ cName: "A4 (210 x 297 mm)", cReturn: "A4" },
{ cName: "A3 (297 x 420 mm)", cReturn: "A3" },
{ cName: "SRA3 (320 x 450 mm)", cReturn: "SRA3" },
{ cName: "SRA4 (225 x 320 mm)", cReturn: "SRA4" },
{ cName: "Letter (215.9 x 279.4 mm)", cReturn: "LETTER" },
{ cName: "Personnalise...", cReturn: "PERSO" }
);
if (!choix) {
return null;
}
if (choix !== "PERSO") {
var f = CDImp.Util.FORMATS_MM[choix];
return { largeurMm: f[0], hauteurMm: f[1] };
}
var largeurMm = CDImp.Util.demanderNombre("Largeur de la feuille (mm) :", "Format personnalise", 320);
if (largeurMm === null) { return null; }
var hauteurMm = CDImp.Util.demanderNombre("Hauteur de la feuille (mm) :", "Format personnalise", 450);
if (hauteurMm === null) { return null; }
return { largeurMm: largeurMm, hauteurMm: hauteurMm };
};
CDImp.NUp.lancer = function (doc) {
try {
doc = CDImp.Util.getDocActif(doc);
} catch (e) {
CDImp.Util.erreur(e.toString());
return;
}
var mode = app.popUpMenu(
{ cName: "Grille N-Up (pages successives du document)", cReturn: "nup" },
{ cName: "Repetition - Step & Repeat (dupliquer une page)", cReturn: "repeat" }
);
if (!mode) { return; }
var nLignes = CDImp.Util.demanderNombre("Nombre de lignes :", "N-Up / Step & Repeat", 2);
if (nLignes === null) { return; }
var nColonnes = CDImp.Util.demanderNombre("Nombre de colonnes :", "N-Up / Step & Repeat", 2);
if (nColonnes === null) { return; }
var formatFeuille = CDImp.NUp._demanderFormatFeuille();
if (!formatFeuille) { return; }
var gouttiereMm = CDImp.Util.demanderNombre("Gouttiere entre les poses (mm) :", "N-Up / Step & Repeat", 4);
if (gouttiereMm === null) { return; }
var margeMm = CDImp.Util.demanderNombre("Marge technique autour de la feuille (mm) :", "N-Up / Step & Repeat", 5);
if (margeMm === null) { return; }
var nPageRepeat = 1;
if (mode === "repeat") {
nPageRepeat = CDImp.Util.demanderNombre("Numero de la page a dupliquer :", "Step & Repeat", doc.pageNum + 1);
if (nPageRepeat === null) { return; }
if (nPageRepeat < 1 || nPageRepeat > doc.numPages) {
CDImp.Util.erreur("Page invalide : " + nPageRepeat);
return;
}
}
var params = {
nLignes: nLignes,
nColonnes: nColonnes,
largeurFeuilleMm: formatFeuille.largeurMm,
hauteurFeuilleMm: formatFeuille.hauteurMm,
gouttiereMm: gouttiereMm,
margeMm: margeMm,
mode: mode,
nPageRepeat: nPageRepeat
};
var destDoc;
try {
destDoc = CDImp.NUp.construireGrille(doc, params);
} catch (e) {
CDImp.Util.erreur("Erreur lors de la construction de la grille : " + e.toString());
return;
}
if (CDImp.Auto && CDImp.Auto.enregistrerDerniereAction) {
CDImp.Auto.enregistrerDerniereAction("NUp.executer", params);
}
CDImp.Util.info("Mise en page terminee (" + destDoc.numPages + " feuille(s)).\nPensez a l'enregistrer (Ctrl+S) sous un nouveau nom.");
};
/**
* Variante directe sans dialogues (Module 7 - Automatisation).
*/
CDImp.NUp.executerAvecParams = function (doc, params) {
doc = CDImp.Util.getDocActif(doc);
var destDoc = CDImp.NUp.construireGrille(doc, params);
CDImp.Util.info("Mise en page recreee avec succes (" + destDoc.numPages + " feuille(s)).");
return destDoc;
};