(*
strawhousepig.net
Hot folder action! The jokes write themselves.
Takes the name of the folder it is attached to and sends received items to the
corresponding printer.
How to: Find a place to keep a folder that is named as the printer ID (not the name), which
can be found using 'lpstat -v', or seen in the cups web interface, or as "Device name"
in the GUI printer settings, and attach this script to it as a Folder Action. The run handler
is here just for testing, but could be set-up to send files selected in the Finder.
I keep my hot folders in a child folder of the Desktop, so it's fairly convenient to drop
items into. If dropping isn't your bag, you could place the hot folder in ~/Library/PDF Services,
or write a seperate script or workflow in PDF Services to have the best of both worlds.
*)
on adding folder items to this_folder after receiving these_items
my do_thing(these_items, this_folder)
end adding folder items to
on run
set this_folder to (choose folder)
set these_items to {}
tell application "System Events" to set these_items to every item of (this_folder)
my do_thing(these_items, this_folder)
end run
on do_thing(these_items, this_folder)
repeat with i in these_items
set i to quoted form of POSIX path of (i as alias) -- Undo this and the shell scripting if you want to try the "System Events" route.
set _script to "lp -d " & name of (info for this_folder) & " " & i & "; mv " & i & " ~/.Trash/"
--log _script --for debuging
do shell script _script
-- tell application "System Events" to print i with properties {target printer:this_printer} -- Bugged. Does not work. *smh*
end repeat
end do_thing
Tag Archives: AppleScript
AppleScript + friends to generate proof image of PDF
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
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.
Continue readingAppleScript 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 "" & name of (info for d) & ""
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 \"*\"") & _tag
set tag_plist to "" & _tag & ""
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.
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.
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 readingConvert 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