Introduction to Scripting InDesign
Volume Number: 22 (2006)
Issue Number: 11
Column Tag: AppleScript Essentials
Introduction to Scripting InDesign
by Benjamin S. Waldie
In last month's column, we discussed scripting page layout applications in order to automate your desktop publishing workflow. Specifically, we focused on getting started with scripting QuarkXPress <http://www.quark.com>. This month, we will be discussing another popular and well-known page layout application, Adobe InDesign <http://www.adobe.com/products/indesign/>.
Getting Started
Before we begin scripting InDesign, I'd like to briefly discuss InDesign's AppleScript support. When you open InDesign's dictionary for the first time, one of the things you may notice is that it is quite long. See figure 1.
Figure 1. InDesign's AppleScript Dictionary
InDesign contains extensive AppleScript support for automating almost anything that you can do manually. Sure, you may come across a feature here and there that doesn't have corresponding AppleScript support. However, these situations are certainly few and far between. Furthermore, InDesign's AppleScript support is constantly being revised, improved, and expanded with each new release of the application, so it just keeps on getting better.
Working with Documents
Within InDesign, you will most likely want to automate tasks that involve documents, so that is what we will focus on here. If you need to automate books, you are encouraged to explore InDesign's dictionary for the functionality you require.
Referring to Documents
A document is referenced using the document class, which can be found in the Basics Suite, in InDesign's dictionary. Documents may be referenced using their index (front to back positioning) or by their name. The following example code demonstrates how a document would be referenced using its index.
tell application "Adobe InDesign CS2"
tell document 1
-- Do something
end tell
end tell
Similarly, the following code would reference a document by its name.
tell application "Adobe InDesign CS2"
tell document "My Document.indd"
-- Do something
end tell
end tell
In most cases, unless you will always only have one document opened in InDesign, it is usually the safest to refer to a document by its name. This way, if the front to back positioning of a document changes, your script will continue to target the correct document.
Throughout this month's column, however, we will be referring to documents by their index. Specifically, we will reference document 1, which will refer to the frontmost document. Another way to target the frontmost document is to reference the active document property of the application class. For example:
tell application "Adobe InDesign CS2"
tell active document
-- Do something
end tell
end tell
Checking for the Existence of a Document
Before your AppleScript begins interacting with a document, it is often a good idea to make sure that the document exists. This may be done using the exists command, as follows.
tell application "Adobe InDesign CS2"
document 1 exists
end tell
--> true
As the example code above demonstrates, the result of the exists command is a true or false Boolean value indicating whether or not the document exists.
Creating Documents
Depending on your workflow, you may not need to work within an existing document, but within a new document. To create a new document via AppleScript, use the make command, as demonstrated below.
tell application "Adobe InDesign CS2"
make new document
end tell
--> document "Untitled-1" of application "Adobe InDesign CS2"
The result of the make command is a reference to the newly created document, which may be placed in a variable and referenced later in order to perform additional tasks within the document.
Please note that in the example code above, we did not specify the size of the document to be created. In this situation, the document would be created using InDesign's default document size. To specify a size for the document, you may optionally specify values for the page width and page height properties, which are actually properties of the document preferences property of the document class. Here is an example of how this would be done:
tell application "Adobe InDesign CS2"
make new document with properties {document preferences:{page width:8.5, page height:11}}
end tell
--> document "Untitled-1" of application "Adobe InDesign CS2"
Again, make note of the example code above. Here, although we have specified a size for the document, we have not specified unit of measurement, i.e. inches, points, centimeters, millimeters, etc. Because of this, the default unit of measurement will be used when creating the document. In other words, if InDesign's default unit of measurement is set to inches, then an 8.5" x 11" document would be created.
You may optionally choose to specify the unit of measurement when creating the document, as demonstrated below.
tell application "Adobe InDesign CS2"
make new document with properties {document preferences:{page width:"8.5in", page height:"11in"}}
end tell
--> document "Untitled-1" of application "Adobe InDesign CS2"
Another way to ensure that the proper unit of measurement will be used when the document is created is to modify the default unit of measurement. This is done by setting the value of the horizontal measurement units and vertical measurement units properties of the document's view preferences to the desired unit type. For example, the following sample code will set the default unit of measurement to inches, and then create the document, ensuring an 8.5" x 11" document.
tell application "Adobe InDesign CS2"
tell view preferences
set horizontal measurement units to inches
set vertical measurement units to inches
end tell
make new document with properties {document preferences:{page width:8.5, page height:11}}
end tell
--> document "Untitled-1" of application "Adobe InDesign CS2"
Since InDesign's default unit of measurement may vary from user to user, changing the default unit of measurement to the desired value at the beginning of an InDesign-specific AppleScript is usually good practice. In addition to ensuring that a newly created document will be the correct size, specifying the default unit of measurement at the beginning of your script will help to ensure that resizing or creating other elements, such as text frames, rectangles, etc., will be done using the desired unit of measurement.
Working with Text
Developers that are automating InDesign will often have the need to interact with text frames in InDesign documents, whether that need is to insert text, extract text, format text, or more. We will now discuss a number of ways to interact with text frames in InDesign.
Creating a Text Frame
First and foremost is creating new text frames. This will be necessary if you intend to add text to a newly created document.
Before creating a text frame, the first thing you will want to do is identify where the text frame will be created, and how large it will be. Once you have determined this information, you will need to translate it into a list of bounds, which can be specified via AppleScript when the text frame is created. Bounds of a text frame will be specified as a list of four items, formatted as follows:
{top position, left position, bottom position, right position}
Once you have determined the desired bounds for a text frame, use the make command to create the text frame. In doing so, specify the bounds for the text frame using the geometric bounds property of the text frame, as demonstrated below.
tell application "Adobe InDesign CS2"
tell page 1 of document 1
make new text frame with properties {geometric bounds:{1, 1, 3, 6}}
end tell
end tell
--> text field id 191 of page id 159 of spread id 154 of document "Untitled-1" of
application "Adobe InDesign CS2"
Assuming that the default unit of measurement is set to inches, the code above would create a 5" x 2" text frame that is 1" down and 1" across on the first of page of the frontmost document.
Placing Text
Now that you have a text frame, you are ready to insert text into it. To insert text into a text frame, replacing any existing content, set the contents property of the text frame's parent story to the desired text.
tell application "Adobe InDesign CS2"
tell parent story of text frame 1 of page 1 of document 1
set contents to "My Project Text"
end tell
end tell
It is also possible to insert text into a specific location within a text frame, appending it to existing text. This is done by setting the contents property of a specified insertion point within the parent story of the text frame to a specified value. For example, the following code would append the text "My Project Text" to the end of any existing text within the specified text frame, without replacing the existing text.
tell application "Adobe InDesign CS2"
tell parent story of text frame 1 of page 1 of document 1
set contents of insertion point -1 to "My Project Text"
end tell
end tell
Styling Text
Text in InDesign possesses numerous properties, including font, point size, color, and much more, which are accessible via AppleScript. The following example code demonstrates one way that these properties could be modified. This particular code will set the font of the text within the specified text frame to "Arial", the point size of the second word to 24, and the color of the first three words to specified values.
tell application "Adobe InDesign CS2"
tell parent story of text frame 1 of page 1 of document 1
set applied font to "Arial"
set point size of word 2 to 24
set fill color of word 1 to "C=0 M=0 Y=100 K=0"
set fill color of word 2 to "C=100 M=0 Y=0 K=0"
set fill color of word 3 to "C=0 M=100 Y=0 K=0"
end tell
end tell
Please note that, in the above example, the colors specified correspond to the names of colors in InDesign's Swatches palette. See figure 2.
Figure 2. InDesign's Color Swatches Palette
Figure 3 shows the result of executing the previous code on a text frame that contains the text "My Project Text".
Figure 3. Styled Text in InDesign
Working with Graphics
Interaction with graphics is often another important aspect of scripting InDesign. In InDesign, graphics are typically placed within rectangles. However, it is also possible to place them into text frames. For the sake of reducing confusion, in this column, we will discuss working with graphics in rectangles.
Creating a Graphic Frame
Like text frames, rectangles may be created via AppleScript by using the make command, and specifying the desired bounds for the rectangle. For example, assuming the default unit of measurement is set to inches, the following code would create a 3" x 5" rectangle 1" across and 3" down.
tell application "Adobe InDesign CS2"
tell page 1 of document 1
make new rectangle with properties {geometric bounds:{3, 1, 6, 6}}
end tell
end tell
--> rectangle id 385 of page id 159 of spread id 154 of document "Untitled-1" of
application "Adobe InDesign CS2"
Again, here, the result of the make command is a reference to the newly created rectangle.
Placing a Graphic
Once a rectangle exists, the place command may be used to place a graphic within the rectangle. The place command requires a reference to the graphic file to be placed. For example:
set theImage to choose file with prompt "Please select an image to place:" without
invisibles
tell application "Adobe InDesign CS2"
tell rectangle 1 of page 1 of document 1
place theImage
end tell
end tell
--> image id 391 of rectangle id 385 of page id 159 of spread id 154 of document "Untitled-1" of
application "Adobe InDesign CS2"
Here, the result of the place command is a reference to the newly placed image, within the rectangle. Figure 4 shows an example of a placed graphic within a rectangle on an InDesign document page.
Figure 4. A Placed Graphic
Labeling Page Items
Throughout this column, we have referenced text frames and rectangles by index. When we discussed referencing documents, I mentioned that a more accurate way of referring to documents was by name. The same rule applies to text frames, rectangles, and other page items within InDesign documents. The reason for this is that, if a new page item is created, or page items are repositioned within the document, the index of a page item may change.
To always ensure that your script is referencing the correct page item, you may apply a script label to the item. This may be done via AppleScript, for example:
tell application "Adobe InDesign CS2"
tell text frame 1 of page 1 of document 1
set label to "myTextFrame"
end tell
end tell
Applying script labels to page items may also be done manually within InDesign by using the Script Label palette, which can be made visible via the Window > Automation menu. See figure 5.
Figure 5. InDesign's Script Label Palette
Once a script label has been applied to a page item, you may reference it by that label, rather than by its index. For example:
tell application "Adobe InDesign CS2"
tell text frame "myTextFrame" of page 1 of document 1
-- Do something
end tell
end tell
Next Steps and Resources
Documentation and Support
If you plan to continue scripting InDesign in order to automate processes in your own workflow, there are a number of resources available to you for continued learning.
First and foremost, Adobe provides detailed documentation for scripting InDesign. A very comprehensive InDesign Scripting Reference and InDesign Scripting Guide may be downloaded from the Adobe website at <http://www.adobe.com/products/indesign/scripting.html>. These documents contain extensive documentation with regard to all of InDesign's scripting features, and will no doubt prove to be an important addition to any InDesign scripter's arsenal.
The online Adobe support forums at <http://www.adobe.com/support/forums/> are a tremendous resource for anyone using or scripting InDesign, or any other Adobe application for that matter. Here, you will find numerous application-specific forums, including the InDesign Scripting forum, where you may post your questions to other InDesign scripters.
Expanding InDesign's AppleScript Support
While InDesign's AppleScript support is quite extensive, there's always room for improvement, right? Well, with InDesign's plug-in architecture, it is actually possible to expand its AppleScript support with the addition of scriptable plug-ins. There are numerous scriptable plug-ins available for InDesign, including InCatalog and InData, available from Em Software (http://www.emsoftware.com/), which can be used to automate many complex data-driven publishing tasks. For a list of many available InDesign plug-ins, visit the InDesign plug-ins page on Adobe's website at http://www.adobe.com/products/plugins/indesign/. Also, be sure to check out the Adobe Studio Exchange at http://www.adobestudioexchange.com/.
In Closing
For those desktop publishers currently using InDesign and looking to become more efficient, hopefully, this month's column has helped to shed some light on the possibilities. Be sure to continue exploring InDesign's AppleScript support on your own, and don't forget to check out the resources that I have mentioned above.
Until next time, keep scripting!
Ben Waldie is the author of the best selling books "AppleScripting the Finder" and the "Mac OS X Technology Guide to Automator", available from http://www.spiderworks.com, as well as an AppleScript Training CD, available from http://www.vtc.com. Ben is also president of Automated Workflows, LLC, a company specializing in AppleScript and workflow automation consulting. For years, Ben has developed professional AppleScript-based solutions for businesses including Adobe, Apple, NASA, PC World, and TV Guide. For more information about Ben, please visit http://www.automatedworkflows.com, or email Ben at ben@automatedworkflows.com.