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).
198 lines
7.8 KiB
JavaScript
Executable File
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;
|
|
};
|