something you can’t automate…

so far this site has dealt almost exclusively with workflow optimisation and automation — finding ways to minimise the monkey-work, particularly in the advertising and publishing industries.

unfortunately there are one or two things which can’t be optimised (not much anyway) — there are no magic bullets or tricky shortcuts.

one of them, of course, is design. but if you’re one to bemoan having to do design the long way, then you’re really in the wrong job.

the other main one — equally important but not equally loved — is proofreading. you simply cannot do proofreading the easy way and anyone who tries to is a loony.

do yourself a favour — get better at proofreading :

Proofreading is not a job for the the people who  don’t pay attention.

macgrunt icon

InDesign scripting : bringing it together

this post is a response to a question from Tom :

I am working towards a compilation of scripts to take customer supplied Indd documents – Drop them on applet or automator – Print 1 laser / create 3 PDF files (different settings) / email the low res proof to CSR. … What I picture in my head is getting the email PDF proof script running the way I want – Put it into automator as part of a larger workflow. Then get the other elements as scripts – put those into the same workflow – ??

two things to note straight up — you don’t need separate scripts and you don’t need automator. but this is a great little example because all we need to do is pull together a bunch of script snippets already scattered around this site. as you read through you’ll see highlighted bits that link back to posts with more details.

let’s go … first things first — we want this to be a droplet (so you can drag and drop files onto the app for processing) so the whole script will be wrapped in an on open handler. and you’ll need to wrap it in a repeat loop so it can handle more than one dropped file at a time. and it would be a good idea to alert the user when the script has finished doing its thing. so the initial bits will look something like this :

on open mgItems
  repeat with mgThisItem in mgItems
    -- rest of script here
  end repeat
  display dialog "some kind of confirmation message here"
end open

then we need InDesign to open and process each file. but we should put this in a try block to ensure the script doesn’t crash if a different file type is dropped on it inadvertently :

on open mgItems
  repeat with mgThisItem in mgItems
    tell application id "com.adobe.InDesign"
      try
        open mgThisItem
        tell active document
          -- do printing and pdf stuff in InDesign
        end tell
        close active document
      on error
        -- decide what kind of error handling you want to include if the file won't open
      end try
    end tell
    -- rest of script for email processing here
  end repeat
  display dialog "some kind of confirmation message here"
end open

the observant will notice that the tell application command is different from previous scripts on this site. this is the way to address any version of InDesign — but be aware that other parts of this script may have terms or syntax that may need to be adjusted for your particular version of InDesign.

ok — next comes the printing bit. if you’re using only one print preset for this workflow you’d use a simple line :

print using "name_of_print_preset" without print dialog

but if you need to change the print preset based on the file specs you’d need something more complex like in InDesign scripting : lesson 24.

exporting pdfs is covered in lessons 08, 09, 10, 11, and 12 and cover a few different ways to approach the problem. three basic things need to be determined : the export preset to be used, the name of the pdf and the location to save it to.

the simplest version of this part of the workflow might look like this (but depends on Tom’s specific needs) :

set mgDocName to name of active document
set text item delimiters of AppleScript to " "
set mgShortName to text item 1 of mgDocName
set text item delimiters of AppleScript to ""
set mgHRFilePath to "path:to:highres:folder:" & mgShortName & "_HR.pdf" as string
set properties of PDF export preferences to properties of PDF export preset "HighRes"
tell active document
  export format PDF type to mgHRFilePath without showing options
end tell
set mgHRDigitalFilePath to "path:to:highresdigital:folder:" & mgShortName & "_HRD.pdf" as string
set properties of PDF export preferences to properties of PDF export preset "HighResDigital"
tell active document
  export format PDF type to mgHRDigitalFilePath without showing options
end tell
set mgProofFilePath to "path:to:proof:folder:" & mgShortName & "_proof.pdf" as string
set properties of PDF export preferences to properties of PDF export preset "Proof"
tell active document
  export format PDF type to mgProofFilePath without showing options
end tell

that’s it for the InDesign bits. now to email that third pdf. first get a reference to the file, then create the message — Tom’s using Entourage (thanks to Ben Waldie at MacTech for the Entourage code) :

tell application "Finder"
  set mgFile to mgProofFilePath as alias
end tell
set mgSubject to "proof of job " & mgShortName as string
tell application "Microsoft Entourage"
   set theRecipients to {{address:{display name:"CSR Name", address:"CSR@tomsplace.com"}, recipient type:to recipient}}
   set theMessage to make new outgoing message with properties {recipient:theRecipients, subject:"mgSubject", content:"here's your proof dude", attachments:mgFile}
   send theMessage
end tell

again, this is pretty much the simplest form this part of the workflow could take. Tom will need to expand it to encompass his particular requirements.

the final basic structure could look something like this :

on open mgItems
  repeat with mgThisItem in mgItems

    tell application id "com.adobe.InDesign"
      try
        open mgThisItem
        tell active document
          print using "name_of_print_preset" without print dialog
        end tell
        set mgDocName to name of active document
        set text item delimiters of AppleScript to " "
        set mgShortName to text item 1 of mgDocName
        set text item delimiters of AppleScript to ""
        set mgHRFilePath to "path:to:highres:folder:" & mgShortName & "_HR.pdf" as string
        set properties of PDF export preferences to properties of PDF export preset "HighRes"
        tell active document
          export format PDF type to mgHRFilePath without showing options
        end tell
        set mgHRDigitalFilePath to "path:to:highresdigital:folder:" & mgShortName & "_HRD.pdf" as string
        set properties of PDF export preferences to properties of PDF export preset "HighResDigital"
        tell active document
          export format PDF type to mgHRDigitalFilePath without showing options
        end tell
        set mgProofFilePath to "path:to:proof:folder:" & mgShortName & "_proof.pdf" as string
        set properties of PDF export preferences to properties of PDF export preset "Proof"
        tell active document
          export format PDF type to mgProofFilePath without showing options
        end tell
        close active document
      on error
        -- decide what kind of error handling you want to include if the file won't open
      end try
    end tell

    tell application "Finder"
      set mgFile to mgProofFilePath as alias
    end tell
    set mgSubject to "proof of job " & mgShortName as string
    tell application "Microsoft Entourage"
      set theRecipients to {{address:{display name:"CSR Name", address:"CSR@tomsplace.com"}, recipient type:to recipient}}
      set theMessage to make new outgoing message with properties {recipient:theRecipients, subject:"mgSubject", content:"here's your proof dude", attachments:mgFile}
      send theMessage
    end tell

  end repeat
  display dialog "some kind of confirmation message here"
end open

of course, this isn’t a definitive solution — it’s simply a demonstration of one possible approach to the problem.

once you’re done compiling the perfect script, save it as an app and drag it onto your sidebar so it’s easily accessible — then start dropping those indd files.

macgrunt icon

InDesign scripting : lesson 24

waaay back in lesson 04 we looked at a script to automate printing (and lessons 05 and 06 explained how some of the script elements worked).

well, finally, it’s time to take printing automation to the next level. the original script prompts the user to select a print preset from a list. but that’s too much like hard work. what if the script could automatically decide which preset to use based on the document specs?

apologies to you lovely people in the States — we’re going to be using metric for this example because, well, it is the twenty first century after all and anything referred to as ‘imperial’ should be long dead.

the first part of the script captures a few bits of information from the document preferences. facing pages is boolean, so it returns true or false. page orientation returns landscape or portrait (square pages return portrait too). page height and width return real numbers in whatever measurement unit you’re using :

tell application "Adobe InDesign CS6"
  tell active document
    set mgPgFace to facing pages of document preferences as string
    set mgPgOrnt to page orientation of document preferences as string
    set mgPgHght to page height of document preferences
    set mgPgWdth to page width of document preferences
  end tell
end tell

display dialog (mgPgHght as string) & " : " & (mgPgWdth as string) & " : " & mgPgOrnt & " : " & mgPgFace

so, for a single A4 page the resulting dialog will look something like this :
screen grab of initial dialog box showing captured data

now, if you’re a neat freak (and aren’t we all?) you may prefer your real numbers converted to integers. notice that you can’t coerce a real to an integer as it is captured — the conversion has to be done separately :

tell application "Adobe InDesign CS6"
  tell active document
    set mgPgFace to facing pages of document preferences as string
    set mgPgOrnt to page orientation of document preferences as string
    set mgPgHght to page height of document preferences
    set mgPgWdth to page width of document preferences
    set mgPgHght to mgPgHght as integer
    set mgPgWdth to mgPgWdth as integer
  end tell
end tell

display dialog (mgPgHght as string) & " : " & (mgPgWdth as string) & " : " & mgPgOrnt & " : " & mgPgFace

then you’ll have neat (not necessary, but neat) :
screen grab of second dialog box showing altered data
…and you can get rid of that display dialog line now — dialogs are a handy way to check your progress when developing a script.

ok, now, the complexity of the next bit is dependant on the complexity of your workflow. the workflow this script was developed for has only eight possible scenarios, roughly like so :
table showing print preset options for various document types

so, all we need to do is find out which of the scenarios our document falls into and select the corresponding print preset (which we’ll capture into the variable mgPrintPreset). let’s start with the two facing pages options (printed as spreads) :

if mgPgFace is "true" then --print document as spreads
  if mgPgHght is greater than 277 or mgPgWdth is greater than 200 then --use A3 fit preset
    set mgPrintPreset to "A3S fit"
  else --use A3 100% preset
    set mgPrintPreset to "A3S 100%"
  end if
else --print document as single pages
  --(scripting bits for single page options go here)
end if

this shows the basic approach to these kinds of problems — if/then/else. if something is true, then do this thing, else (otherwise) do this other thing. we just need to break the problem down into pairs of options.

and we can still use this method for eight different scenarios because if statements can also be nested — ifs within ifs. the full code for dealing with all eight possibilities looks like this :

if mgPgFace is "true" then --print document as spreads
  if mgPgHght is greater than 277 or mgPgWdth is greater than 200 then --use A3 fit preset
    set mgPrintPreset to "A3S fit"
  else --use A3 100% preset
    set mgPrintPreset to "A3S 100%"
  end if
else --print document as single pages
  if mgPgOrnt is "portrait" then --use one of the vertical presets
    if mgPgHght is greater than 277 or mgPgWdth is greater than 200 then --use one of the A3 presets
      if mgPgHght is greater than 400 or mgPgWdth is greater than 277 then --use A3 fit preset
        set mgPrintPreset to "A3V fit"
      else --use A3 100% preset
        set mgPrintPreset to "A3V 100%"
      end if
    else --use A4 vertical preset
      set mgPrintPreset to "A4V"
    end if
  else --use one of the horizontal presets
    if mgPgHght is greater than 200 or mgPgWdth is greater than 277 then --use one of the A3 presets
      if mgPgHght is greater than 277 or mgPgWdth is greater than 400 then --use A3 fit preset
        set mgPrintPreset to "A3H fit"
      else --use A3 100% preset
        set mgPrintPreset to "A3H 100%"
      end if
    else --use A4 horizontal preset
      set mgPrintPreset to "A4H"
    end if
  end if
end if

but it’s easier to understand in a screen grab of the code in script editor :
screen grab of this section of code in script editor

the bits in quotation marks are the names of the InDesign print presets, the green elements are the variables (remember you can name variables anything you like, just as long as it’s not a term reserved by applescript), and the other coloured bits are comments to help us keep track of what we’re doing. comments are preceded by two hyphens and are not actually part of the code — they’re little reminders that are especially helpful when revisiting the script sometime in the future.

the last line of code simply tells the document to print using the selected print preset :

print using (mgPrintPreset as string) without print dialog

cobble all those bits together and the complete script for this workflow looks something like this :
screen grab of complete script in script editor

now, obviously you’re not going to be able to use this one straight out of the box — you’ll have to do a little work to update it to your page sizes and print presets and whatnot to suit your workflow.

but once you’ve set it up you can do all your printing with a double click — rather than cmnd-p, click, choose, click, click …

OR, even better, reassign the cmnd-p shortcut to run your script.

bonza.

macgrunt icon

InDesign tip : #26

data merge — ooh, that sounds scary as hell — I’m not even going to think about looking at that.

… well, you probably should — there’s a pretty good chance you’ll have a use for it sometime. like scripting, data merge is just another way of automating a tedious, repetitive task. we’re going to use business cards as our example. first set up a file so it looks the way you want — this will be your basic template :
screen grab of business card layout

this artwork has a few elements that will stay the same across all cards and a few that will change for each card — a perfect job for data merge.
data merge relies on a well-constructed text file. the one for this job started as a spreadsheet that looks like this :
screen grab of spreadsheet of business card details

notice the top line has a label for each type of data element — this is important. that file was exported to a csv file, so it now looks like this :
screen grab of data from spreadsheet in csv form

back to InDesign now … open the data merge panel (in CS6 it’s under window > utilities >) and choose select data source from the dropdown menu to create a reference to your text file :
screen grab of data merge panel with dropdown menu

the data merge panel will now have a bunch of tags corresponding to the labels you created in your text file. add these tags to the relevant positions in your artwork. the easiest way to do this is to select the placeholder text in the artwork then click on the appropriate label in the data merge panel.
screen grab showing how to add tag to artwork
screen grab showing after tag is added to artwork

the preview check box will show you what the first completed card will look like. now you just need to save your template file then click the create merged documents button at the bottom of the panel. you’ll get a window like this to experiment with at your leisure :
screen grab of data merge options window

this will generate a new InDesign file with all your data in place — automatically creating as many pages as required (this example had seven lines of data in the csv, so seven pages were generated in the finished file) :
screen grab of one of the finished cards
awesome.

but that’s not all…
this method is great when it comes time to run out the next batch of business cards too. the text file appears as a link in the links panel of the template file. you can open, edit and update that file the same way as you would any other link :
screen grab of text file in links panel

then click create merged documents again and you’ve got yourself a whole new bunch of cards.

macgrunt icon

turn an applescript into a service

the applescript outlined in email file from finder II takes selected items in the finder and attaches them to a new outgoing email message. it allows for multiple recipients from your address book and automatically adds a subject line and some basic content to the email.

there are a few ways to make that applescript accessible in the finder but the most convenient is to turn it into a service. this method is for OS X 10.6 and later — you can see a similar procedure for earlier operating systems in the post get file path of finder items.

Automator Iconapplescript services can be created through automator — the automation program that comes standard on every mac since OS X 10.4 (you’ll find it in your applications folder).

when you first open automator you’ll see this screen — choose service :
screen grab of automator startup screen

this next screen grab shows a couple of different things you need to do. in the main window on the right are two dropdowns — set the first to files or folders and the second to finder. in the search field on the left type ‘applescript’ to easily find the run applescript action. drag and drop this action into the right window :
screen grab of automator with service being built

then paste your applescript into that action window — you can entirely replace the default script. this is what it should look like after you hit the compile button (hammer) :
screen grab of automator service window with applescript in place

save that out and you’re done. now, whenever you want to email something from the finder just select it and right-click — you’ll see your service near the bottom of the contextual menu :
screen grab showing the service as a contextual menu item

you can also activate it under finder > services :
screen grab of services menu

under that menu you can also access the services preferences. this allows you to even set a keyboard shortcut for your new handy service :
screen grab of services preferences window

of course, services aren’t just restricted to running your applescripts. investigate the full power of automator … and get grunting.

macgrunt icon