Skip to content

ExtendScript in InDesign Scripting DOM

Fabian Morón Zirfas edited this page Jun 13, 2025 · 3 revisions

ExtendScript

JavaScript, or EcmaScript, is what brought us in web browsers such things as scrolling by pressing a button, warnings and similar things. ExtendScript is a "dialect" of JavaScript, which was developed by Adobe. This means InDesign understands JavaScript and ExtendScript, but a browser can't do anything with ExtendScript commands.

"The ID Scripting DOOOOOOOOOOOOOOOOM"
wuahahahahahahahah! (Lightning aaaaannnnnddd Thunder)

Now lets have a quick look on how to use all the js in InDesign

/**
 *  ExtendScript has its extended kind of calling objects
 *  in the InDesign scripting doom
 *  like for example item(), lastItem(), everyItem()
 *  if you try to use them on an javascript array
 *  you will get an error
 */

var names = ["Paul", "Peter", "Mary", "Jamens", "Hans", "Smeagol", "Estragon"];

try {
	alert(names.middleItem());
} catch (e) {
	alert("The object " + names.constructor.name + " cant do that:\n" + e);
}

// lets build some stuff to play with
// some pages with some text on them
var ph = 50;
var pw = 50;
var count = 0; // for the loop
while (count < names.length) {
	var doc = app.documents.add({
		documentPreferences: {
			pageHeight: ph,
			pageWidth: pw,
		},
	});
	// you can give labels to nearly everything
	doc.label = names[count];

	var tf = doc.pages.item(0).textFrames.add({
		geometricBounds: [ph / 2, 0, ph, pw],
		contents: names[count],
	});

	tf.paragraphs.everyItem().justification = Justification.CENTER_ALIGN;
	count++;
}

/**
 *  Now another thing.
 *  The lastItem() is not the last item created
 *  The last item is the last item in the collection of
 *  things you are calling
 */
var list = new Array();
list.push("Last item in collection : " + app.documents.lastItem().label);
list.push("Active Item : " + app.activeDocument.label);
list.push("'app.documents.item(0)' : " + app.documents.item(0).label);

alert("Names\n" + list.join("\n"));

/**
 *  Now close some of them
 */
var name = app.documents.lastItem().label;
app.documents.lastItem().close(SaveOptions.NO);
alert("closed last item named " + name);

var name = app.documents.middleItem().label;
app.documents.middleItem().close(SaveOptions.NO);
alert("closed last item named " + name);

// use the following piece of code with care:
// Like Uncle Ben saz: "With great power comes great responsibility!"
//~ app.documents.everyItem().close(SaveOptions.NO);
/*
    As in javascript in the ID DOM everything is an object  
    you can for example add a doc with a text frame on the first page with  
    */

var aString = "Hello World!\rHello Dude. How are you?\rFine and you?";
var doc = app.documents.add();
var pg = doc.pages[0];
var d_pref = doc.documentPreferences;
var pw = d_pref.pageWidth;
var ph = d_pref.pageHeight;

var x1 = 13;
var y1 = 13;
var x2 = pw - x1;
var y2 = ph - y1;
var gb = [y1, x1, y2, x2];

var tf = pg.textFrames.add();
tf.geometricBounds = gb;
tf.contents = aString;
for (var i = 0; i < tf.paragraphs.length; i++) {
	var par = tf.paragraphs[i];
	alert(par + "-->" + par.contents);

	for (var j = 0; j < par.words.length; j++) {
		alert(par.words[j].contents);
	}
}

You can think of the ID DOM as a flow chart. You can access the application and its options the documents. the active document. All pages from a document and all text frames on a page. or all words in a line from a paragraph that is part of a story. This chart shows just a part of the interconnection. It is not automatically generated. Just written up from my head.

the dom

Home

Clone this wiki locally