-
Notifications
You must be signed in to change notification settings - Fork 9
Pages And Margins
Fabian Morón Zirfas edited this page Jun 13, 2025
·
2 revisions

This script fits a page to a text frame
var doc = app.documents.add();
var page = doc.pages.item(0);
var tf = page.textFrames.add({
geometricBounds: [12.7, 12.7, 100, 210],
contents: "Hi God, it's me - Jesus.",
});
tf.paragraphs.item(0).pointSize = 42;
tf.fit(FitOptions.FRAME_TO_CONTENT);
doc.documentPreferences.pageWidth = tf.geometricBounds[3] + 12.7;
doc.documentPreferences.pageHeight = tf.geometricBounds[2] + 12.7;
var new_pw = doc.documentPreferences.pageWidth;
var new_ph = doc.documentPreferences.pageHeight;
tf.geometricBounds = [12.7, 12.7, new_ph - 12.7, new_pw - 12.7];The next script shows how many fun you can have with pageItems
var doc;
if (app.documents.length > 0) {
doc = app.activeDocument;
} else {
doc = app.documents.add();
}
/**
* A document has always a page
* so we don't need to create one
*/
var page = doc.pages.item(0);
// could also be
// var page = doc.pages.lastItem();
// now lets do some stuff on that page
var gb = [10, 10, 50, 50]; // some bounds
page.ovals.add({ geometricBounds: gb }); // add an oval
// increase x values
gb[1] += 10;
gb[3] += 10;
page.rectangles.add({ geometricBounds: gb }); // add an rectangle
// increase x values again
gb[1] += 10;
gb[3] += 10;
page.textFrames.add({ geometricBounds: gb }); // add an textFrame
// a page has not only ovals and so on
// it also has pageItems
// loop them
for (var i = 0; i < page.pageItems.length; i++) {
// now get the y value
var y = page.pageItems[i].geometricBounds[1];
// and move them
page.pageItems[i].move([10 + 10 * i, y]);
}
// now duplicate the page
page.duplicate();Margins are the grid for your layout.
var doc = app.documents.add({});
var page = doc.pages.item(0);
page.marginPreferences.properties = {
top: 30,
left: 30,
right: 30,
bottom: 30,
};Have a look at the tons of different options and properties you can set. This script also creates a new layer and connects several textFrames.
/**
* Lets build a doc
*/
main();
function main() {
// add a doc
var doc = app.documents.add();
// lets store some data in an object for better handling
meta = {
pw: 200,
ph: 200,
top: 20,
left: 20,
bottom: 20,
right: 20,
gutter: 5,
textColumnCount: 5,
};
// have a look at the build function below
doc_build(doc, true, false, meta);
// now lets make something with those pages
var count = 0; // counter
var range = 10; // until
var frames = []; // to store the textFrames
// now loop it
while (count < range) {
// the first page is always there
// so we have to check if we are at index 0
var page;
if (count != 0) {
page = doc.pages.add(); // if not add a page
} else {
page = doc.pages[0]; // we are at index 0 take the existing page
}
// apply a master spread
page.appliedMaster = doc.masterSpreads.item(0);
// add a textFrame and push it into an array
// for better handling
frames.push(page.textFrames.add());
// now get the margins from the page
// the get bounds function is part of the
// Scripting Tutorial Hello World from the SDK
frames[count].geometricBounds = myGetBounds(doc, page);
// once again we have to check if we are at index 0
// because the textFrame 0 cant have a previous text frame
// if we are not at 0 connect the actual textFrame with the previous
if (count != 0) {
frames[count].previousTextFrame = frames[count - 1];
}
// now we change the gutter on every second text frame
// just for the fun of it.
// get the gutter from the page
// and give the textFrame the same margins
if (count % 2 == 0) {
frames[count].textFramePreferences.properties = {
textColumnCount: page.marginPreferences.columnCount / 2,
textColumnGutter: page.marginPreferences.columnGutter,
};
}
//increment the count for the next loop
count++;
}
// add some placeholder text
frames[0].contents = TextFrameContents.placeholderText;
// The End
return 0;
}
/**
* Lets build a document
* with lots of preferences
*/
function doc_build(doc, makeColumns, facingPages, meta) {
doc.layers.item(0).name = "the standard layer";
doc.layers.add({ name: "a new layer" });
if (facingPages) {
doc.documentPreferences.facingPages = true;
} else {
doc.documentPreferences.facingPages = false;
}
// set some view parameters
doc.viewPreferences.properties = {
horizontalMeasurementUnits: MeasurementUnits.MILLIMETERS,
verticalMeasurementUnits: MeasurementUnits.MILLIMETERS,
};
// set the page size and bleed box
doc.documentPreferences.properties = {
pageWidth: meta.pw,
pageHeight: meta.ph,
documentBleedBottomOffset: 3,
documentBleedTopOffset: 3,
documentBleedInsideOrLeftOffset: 3,
documentBleedOutsideOrRightOffset: 3,
};
// the baseline settings
doc.gridPreferences.properties = {
baselineStart: meta.top,
};
// how big are the steps
doc.gridPreferences.baselineDivision = "15pt";
// lets create some master spreads
var master_spread1 = doc.masterSpreads.item(0).pages.item(0); // edit the master spreads
master_spread1.marginPreferences.properties = {
right: meta.right,
top: meta.top,
left: meta.left,
bottom: meta.bottom + 10,
columnGutter: meta.gutter * 2,
};
var master_spread2 = doc.masterSpreads.item(0).pages.item(1); //edit the other master spread
master_spread2.marginPreferences.properties = {
right: meta.right,
top: meta.top,
left: meta.left,
bottom: meta.bottom,
columnGutter: meta.gutter,
};
if (makeColumns) {
master_spread1.marginPreferences.columnCount = meta.textColumnCount * 2;
master_spread2.marginPreferences.columnCount = meta.textColumnCount;
}
} // end make doc
// part of
//ImprovedHelloWorld.jsx from InDesign scripting SDK
//An InDesign CS6 JavaScript
function myGetBounds(myDocument, myPage) {
var myPageWidth = myDocument.documentPreferences.pageWidth;
var myPageHeight = myDocument.documentPreferences.pageHeight;
if (myPage.side == PageSideOptions.leftHand) {
var myX2 = myPage.marginPreferences.left;
var myX1 = myPage.marginPreferences.right;
} else {
var myX1 = myPage.marginPreferences.left;
var myX2 = myPage.marginPreferences.right;
}
var myY1 = myPage.marginPreferences.top;
var myX2 = myPageWidth - myX2;
var myY2 = myPageHeight - myPage.marginPreferences.bottom;
return [myY1, myX1, myY2, myX2];
}This wiki is mostly maintained by:
ff6347
Thanks to:
- JohnDarnell for fixing lots of typos.
- jsp for fixing lots of typos.
- ltfschoen for fixing typos.
- wridgers for adding more links.
- EugenTepin for several improvements.
- vamitul for improvements.
- abandonedbywolves for adding an example.
- Travis Weston
- Andy Dayton
Thanks to the students from my seminars for asking all those questions and making me start this wiki.
- adinaradke
- AnitaMei
- ce0311
- coerv
- felixharle
- FerdinandP
- Flave
- marche
- monkian
- natael
- OliverMatelowski
- PDXIII
- praktischend
- schlompf
- skaim
You are awesome.
- Arrays
- Classes
- Comments
- Conditionals
- Functions
- Inspect Properties
- Loops
- Objects
- Output And Interaction
- Recursive Functions
- Inspect Properties
- Variables And Operations
- Extended JavaScript Guide
- Bridge Talk
- Create And Read Files
- Executing Shell Commands
- ExtendScript Toolkit
- File
- Folder
- Includes JSX
- Object Watch
- Read CSV
- Read In JSON From File And DONT Eval
- Storing Data In A Target Engine
- Target an application
- XML
- Isolate Layers With the Shy Setting
- Layer Duration Change
- Render And System Call
- Rename Layers
- SourceText to Keyframes from Array
- SourceText
- System Call
- app
- Colorbrewer
- ColorGroups
- Colors And Swatches
- Delay And View
- Dialogs
- Documents
- Duplicate And Transform
- Event AfterSave
- Export IDML
- ExtendScript in InDesign Scripting DOM
- Fonts
- GeometricBounds and Coordinates
- Get named pageItems
- Graphic Lines
- Groups
- HSL Color Wheel
- Images
- Includes
- InsertionPoints
- Layers
- Line Feeds And Carrige Returns
- Locked PageItems
- loops vs everyItem
- Masterspreads
- Matrix
- Objectstyles
- Outlines Groups Alignment
- Pages And Margins
- Pathfinder
- Placeholder Text
- Rectangles Ovals Polygons
- RulerOrigin
- Scripting Labels
- Select words at insertionPoint
- Simple Find And Change Grep with FC Query
- Simple Find And Change Grep
- Simple Find And Change Text
- Spiro
- Styles
- Table Cells
- Text Analysis ID FC
- Text Analysis
- Text Find Locations
- Text
- Transformation Matricies
- TransparencySettings
- XML creation and import