Often when you create artwork for use as part of your making a living you don’t charge for it and just keep it to yourself. You also have to show it to the customer for approval, but sending them the original art means risking them taking it Someplace Else. You can of course charge up front or after the fact, but you still risk being out priced by the shop not doing the layout. So my best practice has been to create a lower than optimal resolution image with a watermark (aka stamp) placed over the artwork. Continue reading
Tag Archives: AppleScript
ps2pdf droplet
The long running gag around here is I use old software that works with old hardware. Fun. Recently I was sent a PostScript file to output to film, but the version of Distiller I use choked on it. Illustrator CS2 could open it, but unbeknownst to me it only imports the first page. More fun.
Inkscape will import PostScript files and will ask you which page you’d like to open. Unfortunately Inkscape version 1.1 on macOS will not because… reasons?
Luckily the tool it uses to convert PS to PDF still works– ps2pdf
. If you have Ghostscript installed you should have ps2pdf available as well.
This AppleScript is set to use ps2pdf
installed via macports.
Of note is replacing the “.ps” extension using text item delimiters. Relevant lines being:
set my text item delimiters to {"."}
...
set target_path to (text items 1 thru -2 of source_path) & "pdf" as string
I’ve seen people write complete paragraph weight routines to do that, so tuck this away in your bag-of-tricks. 😉
(*
http://strawhousepig.net/
*)
-- Path to your ps2pdf script.
property path2ps2pdf : "/opt/local/bin/ps2pdf " -- Don't forget the trailing space!
on run
tell application "Finder"
try
set cwd to folder of window 1
on error
set cwd to home
end try
end tell
open {choose file with prompt ¬
"Choose PostScript files to convert:" default location cwd as alias with multiple selections allowed}
end run
on open the_files
set my text item delimiters to {"."}
repeat with _file in the_files
if name extension of (info for _file) is "ps" then
try
set source_path to POSIX path of (_file as alias)
set target_path to (text items 1 thru -2 of source_path) & "pdf" as string
do shell script path2ps2pdf & quoted form of source_path & " " & quoted form of target_path
on error theErr
if theErr is not "User canceled." then display dialog theErr
end try
end if
end repeat
end open
AppleScript to write Finder tag from folder name
This is a weird one that came from a request on reddit.
Not really useful (to me) as intended, but I envision it could be re-worked to a FolderAction that would help tag photos. Especially if coupled with a file sorter. But incorporating the tag writing into the sorter would be much more sane.
The commented out do shell script
lines were meant as a way to read existing tags and then add the folder name after them. That didn’t work out thanks to xattr -p
spitting out hexadecimal instead of a plist array, which is the format used when writing the tags. WTF, Apple…
-- http://strawhousepig.net/
on run
set _drop to {}
set end of _drop to (choose folder)
my do_it(_drop)
end run
on open _drop
my do_it(_drop)
end open
on do_it(_drop)
display dialog "WARNING: This script will overwrite ALL tags of files in or targeted from the opened folder with the name of the opened folder." with icon 0
repeat with d in _drop
if folder of (info for d) is true then
set f to {}
try
tell application "Finder"
set _tag to "
set _files to (every item in d)
repeat with f in _files
if alias of (info for f as alias) is true then
set f to original item of f as alias
end if
-- 'xattr -p' will print the value for a named metadata ID. Naturally that value is printed as hexadecimal. :|
-- set f_plist to (do shell script "xattr -p com.apple.metadata:_kMDItemUserTags " & quoted form of POSIX path of (f as alias))
-- set _tag to (do shell script "echo \"" & f_plist & "\" | egrep -o \"
set tag_plist to "
do shell script "xattr -w com.apple.metadata:_kMDItemUserTags " & quoted form of tag_plist & " " & quoted form of (POSIX path of f)
end repeat
end tell
on error _err
display dialog _err
end try
end if
end repeat
end do_it
Parsing e-mail for info
[UPDATE] Added a version that works on OS X 10.4 to the bottom of this post. Does some different logging and is tighter, so I’ll have to go back to the original and update again.
This was done earlier, but I have since had to change it to match changes in the incoming data. Some of which is a big mystery. In particular a new line character that is input as the “line separator” Unicode character. It would end up in the clipboard as line feed, so I just started plugging in white space character id’s until one hit the mark. Lucky me.
Continue reading
Convert PDF to grayscale using GhostScript
[UPDATE] Huge caveat! While this is really meant to deal with RGB documents or objects, it does also convert CMYK and spot colors to grayscale. Unfortunately spot colors remain as separate plates that retain their name. This results in them being printed in color though on screen they appear gray. At least the colors (Pantone) and printer I tested on took spot channels and ripped them according to what they are named. If your printer does not have it’s own rendering library that matches your spot color names then I’m guessing they will print as grayscale.
It is possible to rasterize the art, which results in a pure grayscale, but you need such a high resolution even a simple business card with type and line art increases in size at least 30 times. I knew this was all too easy…
This script / app / droplet will convert a PDF or PostScript (.ps) document from whatever colorspace it lives in to grayscale. Has not been thoroughly tested. I mean, I ran it against a couple of files. One to work out the gs
command, the other to test if it actually made a grayscale duplicate. That file was generated by MS Word so was of course RGB. The converted document was in fact true grayscale. I would say it converted to what you would get if you used a gray gamma 2.2 profile.
Continue reading
Symlink creation in the Finder AppleScript
This script can be run from the script menuextra, or also as an app or droplet if saved as a app. Has not been tested for use beyond OS X 10.6.8 (not sure which useless, silly nickname this version has – still cats at this point, though – I’ve never seen the point in memorizing that garbage). Continue reading
Convert PDF to JPEG using (old version of) Acrobat
This script will use Acrobat’s built in conversion settings (set in Acrobat’s preferences) to convert an open PDF to a new JPEG file and place that file in the folder of said PDF. If a file with the same name (including extension) exists it will prompt for a new name, at which point you may enter a new name or keep it the same and replace the old file.
Not allowing Acrobat to name the new file because, on Macintosh, Acrobat has a ridiculously low character limit when auto-generating a file.
Has not been tested with multi-page PDF’s, but I do not think it will handle them correctly [it does not]. Acrobat will do it, but the extra file shuffling will not. Also unknown if having a window (document) minimized will cause any shenanigans.
Also note this is written for Acrobat 7. Why? Because old hardware needs old software.
[UPDATE] Changed to allow multiple selections.
tell application "Adobe Acrobat 7.0 Professional"
try
set _docs to name of every document
if (count of _docs) is greater than 1 then
set _docs to (choose from list _docs with prompt "Select file(s) to convert:" with multiple selections allowed) as list
end if
repeat with i in _docs
set _doc to (every document whose name is i)
set _path to file alias of item 1 of _doc
set _temp to (path to temporary items folder as text) & "acrobat_tmp_jpg"
save item 1 of _doc to file _temp using conversion "com.adobe.acrobat.jpeg"
tell application "Finder"
set _name to (text items 1 thru -5 of i) & ".jpg"
set _proof to ((container of file _path) as text) & _name
if (exists _proof) then
set _name to text returned of (display dialog "File '" & _name & "' already exists. Please enter a new name (or leave the same to replace):" default answer _name as text)
set _proof to ((container of file _path) as text) & _name
end if
do shell script "mv " & quoted form of POSIX path of _temp & " " & quoted form of POSIX path of _proof
reveal file _proof
end tell
end repeat
end try
end tell
Video re-encode script
The purpose of this long, arduous venture was to find a way to simply reduce the size of video files recorded with a Canon ELPH 330 HS digicam. This camera, and surely others, records 720p, 30fps video at a bitrate of 24Mbps, which is at least twice as much as should be necessary. Remember this is a consumer level point-&-shoot whose main draws were: 10x optical zoom; pocketable. This high bitrate results in a 6 minute video being over 1GB. Too much.
Continue reading
Copy video create date from original file
This is the companion script for: Video re-encode script
It uses exiftool to copy the video date atom(s) and setfile (is or was included with Apple’s Developer Tools) to change the file system dates. It will more than likely throw exiftool “File not found” errors and I’m not quite sure why. It has never failed to actually work despite this in my experience, however be very careful to not use this on your original source videos.
Hopefully the settings and prompts make sense.
(* http://strawhousepig.net/
This uses Apple's command line developer tools command 'setfile' to set the filesytem dates.
https://developer.apple.com/download/more/
I believe an Apple Developer account is required for that, but I am not sure.
Uses 'exiftool' to set track date atoms.
https://www.sno.phy.queensu.ca/~phil/exiftool/
*)
-- Set to 'false' to omit initial dialog prompts. Does not affect final confirmation prompt.
property prompt_me : true
-- UTC timezone. Leave blank ("") to not use the timezone setting.
property tzone : "-8:00"
on run
do_it(false)
end run
on do_it(redo)
repeat
if tzone is not "" then set tzone to "-timezone=\"" & tzone & "\" " -- There is a trailing space here.
if prompt_me is true then
if button returned of (display dialog "Choose a TARGET file to set creation and modification dates of.") is "OK" then
set newfile to choose file with prompt "Select TARGET file to set creation and modified dates of:"
end if
else
set newfile to choose file with prompt "Select TARGET file to set creation and modified dates of:"
end if
set filepath to newfile as string
if prompt_me is true then
if button returned of (display dialog "Choose a SOURCE file to *get* creation and modification dates from.") is "OK" then
set oldfile to choose file with prompt "Select SOURCE file to get dates from: " & filepath
end if
else
set oldfile to choose file with prompt "Select SOURCE file to get dates from: " & filepath
end if
set newfilename to name of (info for of newfile)
if newfilename is not (name of (info for of oldfile)) then
set warn_button to button returned of (display alert "File names do not match. Proceed?" as warning buttons {"Cancel", "Start Over", "Proceed"})
if warn_button is "Cancel" then
return
else
if warn_button is "Start Over" then
set redo to true
exit repeat
end if
end if
end if
tell application "System Events" to set [c_date, m_date] to [creation date of oldfile, modification date of oldfile]
set [p_date_c, p_date_m] to [c_date, m_date] -- Saving "pretty" date for dialog prompt.
set c_date to ((month of c_date as integer) & "/" & day of c_date & "/" & year of c_date & " " & hours of c_date & ":" & minutes of c_date & ":" & seconds of c_date) as string
log c_date
set m_date to ((month of m_date as integer) & "/" & day of m_date & "/" & year of m_date & " " & hours of m_date & ":" & minutes of m_date & ":" & seconds of m_date) as string
log m_date
if button returned of (display dialog "This will set the creation and modification dates of file " & filepath & " to:" & return & return & p_date_c & return & p_date_m & return & return & "Proceed?") is "OK" then
try
-- Have to include full path to exiftool binary because AppleScript uses the Bourne shell which doesn't have /usr/local/bin in its path? *rolls eyes*
do shell script "/usr/local/bin/exiftool " & tzone & "-*date=\"`/usr/local/bin/exiftool -time:CreateDate " & quoted form of POSIX path of oldfile & "`\" -wm w " & quoted form of POSIX path of newfile
on error theErr
-- Will throw a "File not found" error if this takes over a certain amount of time. rm must be running faster than exiftool can finish?
display dialog "The 'exiftool' command said: " & theErr
end try
delay 1
try
-- Ready for this, exiftool adds "_original" to the end of the file it's going to modify tags/atoms of. This is still 'newfile' but with a new name.
-- If we manually add "_original" to 'newfile' rm will throw an error looking for newfile_original_original... Wha?
do shell script "rm " & quoted form of POSIX path of newfile
on error theErr
display dialog "The 'rm' command said: " & theErr
end try
delay 1
try
-- Ready again? The original path to 'newfile' is valid again for this... Wha??
do shell script "setfile -d '" & c_date & "' -m '" & m_date & "' " & quoted form of POSIX path of newfile
on error theErr
display dialog "The 'setfile' command said: " & theErr
end try
end if
exit repeat
end repeat
if redo then do_it(false)
end do_it
Walk down a directory to label (and reveal) zero byte files
_count is not working and I’m not sure why. :/
The walkFolder()
function is recursive, so be careful where you choose to run this. Made to help identify corrupt old archives that have been copied (and copied) from Mac to WINDOWS to CDs and back.
on walkFolder(f, _count)
list folder f
repeat with i in the result
set _item to (alias (f & i))
if folder of (info for _item) then
walkFolder(f & i & ":", _count)
else
if first character of i is not "." then
if size of (info for _item) is 0 then
tell application "Finder"
set label index of _item to 7 -- Gray. Perhaps adding a spotlight comment would be better...
reveal _item -- Comment this out if you expect a lot of results.
end tell
set _count to _count + 1
end if
end if
end if
end repeat
return _count
end walkFolder
on run {}
set _count to 0
try
tell application "Finder" to set cwd to folder of window 1 as alias
on error
set cwd to path to desktop folder
end try
set theFolder to (choose folder "Select a folder to list:" default location cwd) as string
my walkFolder(theFolder, _count)
display dialog (_count as text) & " files found to be 0 bytes" giving up after 600
end run
Apologies for formatting errors as I’m editing this post on Safari from OS X 10.5 which doesn’t work well with WordPress’ auto-drafting.