Embedded Image Report

Your client has just sent you a stack of files written in Word format (.doc or .docx). Upon placing the first of the files in an InDesign document, it becomes evident that there is a fair amount of work to do. Images, of course, are embedded and anchored to text. Captions are all over the place. The first task concerns the images. Were images resampled at 300 dpi before being added to the Word document? A cursory glance into InDesign’s Links panel gives you the answer you anticipated: of course not. And there are lots of them!

Time to think “script.”

SCRIPT TO THE RESCUE

Open the Script Editor for AppleScript and paste in the following script:

Image Report

(*Returns a list of linked image file names, parent page and 
container, actual resolution (ppi), and current scale factors. *)
set thisText to ""
tell application "Adobe InDesign CC 2017"
   set measurement unit of script preferences to points
   set docRef to document 1
   set s to stories of docRef
   repeat with i from 1 to length of s
	set rectList to spline items of item i of s
	if length of rectList > 0 then
	   repeat with thisRect in rectList
		set thisID to id of thisRect
		if exists (image 1 of thisRect) then
		   set thisImage to image 1 of thisRect
		   set thisLink to item link of thisImage
		   try
		      set thisName to name of thisLink
		   on error
		      set thisName to "no name"
		      set thisSize to "NA"
		   end try
		   try
		      set aPpi to effective ppi of thisImage
		      set thePpi to "" & item 1 of aPpi & " " & item 2 of aPpi
		   on error
		      set thePpi to "NA"
		   end try
		   set thePage to name of parent page of thisImage
		   try
		      set hScale to (absolute horizontal scale of thisImage)
		      set vScale to (absolute vertical scale of thisImage)
		      set hs to round hScale
		      set vs to round vScale
		   on error
		      set hs to "NA"
		      set vs to "NA"
		   end try
		   set vBounds to geometric bounds of thisRect
		   set wid to round ((item 4 of vBounds) - (item 2 of vBounds))
		   set hgt to round ((item 3 of vBounds) - (item 1 of vBounds))
		   set thisEntry to "Image " & thisName & " of rect " & thisID & ¬
" of page " & thePage & " PPI: " & thePpi & " size: " & wid & " x " & hgt ¬
& " pts" & " image scale: " & hs & " x " & vs
		   set thisText to thisText & thisEntry & return
		end if
	   end repeat
	end if
   end repeat
end tell
thisText

The script is fairly self-explanatory. It simply gets a list of all anchored images in each of the document stories. If anchored images are found, the list is processed and values for the various properties are stored in a string. At the end of the script, the string is placed in the Result window for the editor.

Each entry of the script will read similar to the following.

Image Image501.PNG of rect 500 of page 1 PPI: 508.0 1137.0 size: 362 x 209 pts image scale: 59 x 26

This will work fine for a one time script that you will be executing. But if you need to hand the script off to someone, or you decide to save the script for use in the future, you will need to add some refinements.

Inside the tell statement to InDesign, you will want to test for the existence of a document and, if it exists, place its reference in a variable. Replace the set docRef to document 1 statement with the following:

try
   set docRef to my getDocRef()
on error errStr
   activate
   display alert "Error: " & errStr
   return
end try

Next, place the following before the end tell statement at the end of the script

--get path to folder containing the document
set folderPath to (file path of docRef) as string
--create a file path for text file generation using name of document and file path
set fileName to name of docRef
if fileName contains "." then
   set oset to (offset of "." in fileName) - 1
   set fileName to (text 1 thru oset) of fileName
end if
set filePath to folderPath & fileName & ".txt"
--open the file for writing
set fileRef to open for access file filePath with write permission
--write the string created by the script to the file
set eof fileRef to 0
write thisText to fileRef starting at eof
close access fileRef 

Lastly, add the getDocRef handler to the bottom of the script

on getDocRef()
   set errStr to "Requires saved active document " & return
   set errStr to errStr & "Make sure your document is saved and try again"
   tell application "Adobe InDesign CC 2017"
      if (not (exists active document)) or (saved of active document is false) then
	  error errStr
      end if
      return active document
   end tell
end getDocRef

Test the script with a sample document. Open the file created in a plain text editor (it will be in the same folder as the InDesign document). You may wish to print the file out as a handy reference for the person responsible for resampling and refining the image files.

UNEMBED THE IMAGES

Now that you have a list of the files embedded in the document, you need to unembed the files. Select the files to unembed in InDesign’s Links panel. Right click (Control click) on the selection and choose Unembed Link from the context menu. You are then presented a dialog to determine if files are to be relinked to original or placed in a chosen folder.

…Click No when presented this dialog

Since you do not have the originals, respond by clicking No. You are then presented a choose folder dialog at which time you can either create a folder or navigate to a folder designated for the images. When you click Open, InDesign will then place the image files in the chosen folder for processing while maintaining the links to the files.

It is heartily suggested that a duplicate folder of these image files be kept in a safe location prior to processing. This is just in case of a later need to have access to an original file.

Once the image files have been processed (resampled, and otherwise fixed), the files will relink when you open the InDesign document.

ONWARD AND UPWARD

Should you wish to release the anchored images, a similar script can be written to get a list of all anchored images and release the anchor. As part of that script, however, you will probably want to assign an object style for text wrap and stroke. We will save that script for our next blog, so keep tuned in.

Disclaimer: Code samples are to be used as a guide for users to create their own real world scripts and is provided “AS IS”. No representation is made as to the accuracy or completeness of the code. Use of the code and its operation is at the discretion and responsibility of the user.