// 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; };