A couple of years ago, we needed an easy way for our editors to create PDF files from InDesign documents. This script allows users to drag over InDesign documents for PDF creation. The script arranges pages in string order so each page needs to be named 01XXXX or 02XXXXX. If you name a page 1XXXX, it will be arranged with page 10XXXX, and so forth.
This script uses Acrobat to create the PDFs. Earlier attempts using the onboard PDF creation capabilities of Leopard & Snow Leopard proved incapable of rendering transparencies correctly.
This script asks if the user wants spreads or single pages or a specific print preset.
It was my first AppleScript so I have little doubt that major improvements could be made.
Thanks to Chris Paveglio at chris.paveglio.com, the author of PDF Bee, for providing the Acrobat part of the script that does the heavy lifting.
-- ****************************************************************************
-- CREATE & COMBINE PDFs FROM INDESIGN
-- Version 2.3
-- Drew Grgich
-- McMurry
-- * Acrobat related Applescript contributed by Chris Paveglio *
-- * Author of PDF Bee *
-- * http://chris.paveglio.com/ *
-- CHANGELOG:
-- 2.3 - Removed property type_list; we now work with all indd files; remove interactive pdf features
-- 2.2 - cleaned up some variable names, moved global definitions to a better grouping
-- 1.1 - added ability to choose file location, spreads/no spreads, combined/single
-- ****************************************************************************
-- We want this script to only work with INDD files or folders of INDD files for now
-- We're going to check file extensions
property extension_list : {"indd"}
-- Our globals for this fine script
global PDFPath
-- Let's define variables to determine if we are going to use spreads, single pages, or a specific print preset
global spreadsChoice
global combinedChoice
global presetChoice
-- Let's define combinedPDFFileName as the name of the combined PDF at the end.
-- We want to determine this early in the process and refer to it late in the process
global combinedPDFFileName
global singlesFolder
global numberOfPDFs
on run
display dialog "I don't do too much unless you drag InDesign files on top of me."
end run
on open filesToConvert
-- Let's set our print preset variables
-- Because I'm not using AppleScript Studio to make a GUI,
-- we'll have to set these variables with questions
-- Spreads
set spreadsChoice to (display dialog "Do you want spreads?" buttons {"You Betcha", "Nope"} default button 2)
-- Combined file or singles?
set combinedChoice to (display dialog "Combined PDF or Single PDF Files?" buttons {"Combined", "Singles"} default button 1)
-- Chosen Print Preset
set presetChoice to (display dialog "Which Print Preset do you want?" buttons {"Smallest File Size", "High Quality Print"} default button 1)
-- Let's name our combined PDF file if the user wants a combined PDF
-- or pick/create a folder for single files if these are requested
if button returned of combinedChoice = "Combined" then
set comboORSingles to "combo"
set combinedPDFFileAlias to choose file name with prompt "Where would you like to save the combined PDF?" default location (path to desktop folder) default name "Combined.pdf"
set combinedPDFFileName to combinedPDFFileAlias as string
else if button returned of combinedChoice = "Singles" then
set comboORSingles to "singles"
set singlesFolderAlias to choose folder with prompt "Where would you like to save your individual PDFs?" default location (path to desktop folder)
set singlesFolder to singlesFolderAlias as string
end if
-- make a folder for us to store PDFs in for compilation with Chris' script
-- this will be a custom subroutine
makeTempFolder("PDF")
-- now let's loop through whatever was dropped here and process it all individually
-- note that InDesign files or folders containing InDesign files can be dragged here
-- we'll process everything individually and ignore any non-InDesign files
-- you can even drop nested folders here
-- everything is combined at the end into one big file ordered by filename
repeat with i from 1 to the count of filesToConvert
set this_item to item i of filesToConvert
set the item_info to info for this_item
-- we'll need a few custom subroutines to do the magic
-- starting with this one here
do_processing(this_item, item_info)
end repeat
-- We need to determine if no InDesign files get converted to PDFs so we can catch an error before it happens
tell application "Finder"
set numberOfPDFs to count of (files in folder PDFPath)
end tell
if numberOfPDFs = 0 then
display dialog "No PDFs to process - there appears to have been a problem with one of your INDD files." with icon 1 buttons {"Ponder This Quandry"}
return
end if
-- Finally, do we want to make combined files or copy some of our PDFs to a designated folder?
if comboORSingles = "combo" then
combine_PDFS(PDFPath)
else if comboORSingles = "singles" then
copy_files(singlesFolder)
end if
end open
-- a subroutine to make a Temp folder with the defined name
-- This folder is placed in the User:Library:Caches:TemporaryItems folder
-- If created here initially, the folder will of course be empty
--If the folder already exists, all files inside of it are moved to the Trash
--Either way, the folder will be empty and PDFification can begin
on makeTempFolder(theNewFolderName)
set tempPath to (path to temporary items folder from user domain)
tell application "Finder"
if not (exists folder theNewFolderName of tempPath) then
make new folder at tempPath with properties {name:theNewFolderName}
end if
display dialog "This script is now emptying its PDF Storage Folder. You may hear a 'Move to Trash' sound." buttons {"Groovy"} default button 1 giving up after 3
delete items of folder theNewFolderName of tempPath
end tell
-- Here's where we define where we're going to store our files
set PDFPath to (tempPath as string) & theNewFolderName & ":"
end makeTempFolder
-- a subroutine to handle determining if our dropped items are folders or files
on do_processing(this_item, item_info)
if folder of the item_info is true then
process_folder(this_item)
-- Here's now where we verify that we are working with InDesign files only
else if (the name extension of the item_info is in the extension_list) then
process_item(this_item)
end if
end do_processing
-- a subroutine to process folders
on process_folder(this_folder)
set these_items to list folder this_folder without invisibles
repeat with i from 1 to the count of these_items
set this_item to alias ((this_folder as text) & (item i of these_items))
set the item_info to info for this_item
do_processing(this_item, item_info)
end repeat
end process_folder
-- a subroutine to process individual items
on process_item(this_item)
-- First, we need to know the file name of each item
-- The PDF will be named to match the file name of the InDesign file
-- I'm using Finder for this for now as I don't know how to do this in InDesign and I'm sleepy as I write this
tell application "Finder"
-- make 'myName' the name of the item we're working with now
set myName to name of this_item
-- make clipPoint the numeric position of the dot in the file name before the extension
set clipPoint to offset of "indd" in myName
-- count up to the dot and make everything before it the now trimmed file name
-- example4325.indd nows becomes the trimmedName string "example4325"
try
set trimmedName to (characters 1 thru (clipPoint - 1) of myName) as string
on error
display dialog "I am not able to read the filename correctly" with icon 0
end try
end tell
-- And now the PDFication begins . . .
tell application "Adobe InDesign CS5.app"
-- let's ignore modal warnings
set «class UIAc» of «class pScr» to «constant elnteNvr»
activate
set myDocument to open this_item
-- PDF Preferences creation time!
-- These will be based on the choices made at the top of the script
-- We'll start by dumping a premade pref list to our own list of preferences
-- If the user wants spreads, we'll add that to the list of preferences
-- We'll then export the PDFs using this set of preferences
-- I've tried to pull these out into a subroutine that I call at the beginning
-- to create a preset. The trouble is deleting the preset once I make it.
-- I don't want to leave junk around!
-- I'm thus looping this creating process through for each file . . .
-- . . . not the most efficient!
-- pick preset quality and use it to define our PDF export prefs
if button returned of presetChoice = "Smallest File Size" then
set theProps to «class qpro» of «class PFst» "[Smallest File Size]"
else if button returned of presetChoice = "High Quality Print" then
set theProps to «class qpro» of «class PFst» "[High Quality Print]"
end if
set «class qpro» of «class DFpf» to theProps
-- pick spreads or no spreads
if button returned of spreadsChoice = "You Betcha" then
set «class rdsF» of «class DFpf» to true
else if button returned of spreadsChoice = "Nope" then
set «class rdsF» of «class DFpf» to false
end if
-- Let's do the whole range (thanks, Erica!)
set «class pcty» of «class DFpf» to «constant prngprna»
-- We now need to make sure this isn't exported
-- as an interactive PDF
set «class IAEo» of «class DFpf» to «constant IEOsDNIc»
«event K2 expt» myDocument without «class imot» given «class exft»:«constant eXftt_PD», «class kfil»:(PDFPath & trimmedName & "pdf")
«event CoReclos» myDocument
end tell
end process_item
-- let's combine the PDFs now
-- this piece courtesy of Chris Paveglio
-- author of PDF Bee
-- http://chris.paveglio.com/
on combine_PDFS(theFolder)
-- We know where we're storing the PDFs
-- This can be changed for further customization
set theFolder to PDFPath
set fileNames to list folder theFolder without invisibles -- all files
set firstFile to (theFolder as string) & (item 1 of fileNames) -- complete path
tell application "Adobe Acrobat Pro.app"
activate
open firstFile with «class nvis»
repeat with m from 2 to count of items of fileNames
set theFile to (theFolder as string) & item m of fileNames -- complete path
try
set countPages to count each «class cpag» of document (item 1 of fileNames)
open theFile with «class nvis»
--display dialog theFile
set countPages2 to count each «class cpag» of document (item m of fileNames)
«event CAROinpg» document (item 1 of fileNames) given «class srdc»:document (item m of fileNames) ¬
, «class stpg»:1, «class nmpg»:countPages2, «class inaf»:countPages
close document (item m of fileNames) saving no
end try
end repeat
save document (item 1 of fileNames) in file combinedPDFFileName with «class svln»
beep
display dialog "Combination Complete!" with icon 1 buttons {"Super!"} default button 1 giving up after 3
end tell
end combine_PDFS
on copy_files(theFolder)
repeat with i from 1 to numberOfPDFs
tell application "Finder"
set fileToCopy to the item i in folder PDFPath
duplicate fileToCopy to singlesFolder with replacing
end tell
end repeat
display dialog "Your PDF files await your perusal" with icon 1 buttons {"I can't be more excited!"} default button 1 giving up after 3
end copy_files