Hi there, this script opens the DEVONthink record for the PDF currently viewed in PDF Expert.
It’s meant to add a comment, an annotation, custom metadata or whatever you need DEVONthink for at this moment.
Enjoy
-- Open DEVONthink record for current PDF Expert tab
-- solution for umlauts ("iconv -t UTF8-MAC") found here: https://stackoverflow.com/questions/23219482/bash-ps-grep-for-process-with-umlaut-os-x/23226449#23226449
tell application "System Events"
try
tell application process "PDF Expert"
tell window 1
set theFileName to value of attribute "AXTitle" & ".pdf"
if theFileName starts with "* " then set theFileName to characters 3 thru -1 in theFileName as string
end tell
set PID to unix id
end tell
on error error_message number error_number
if the error_number is not -128 then
display alert "System Events" & space & error_number message error_message as warning
return
end if
end try
end tell
set theOpenFiles to (do shell script "lsof -p " & PID)
set convertedOutput to (do shell script "iconv -t UTF8-MAC <<<$" & quoted form of theOpenFiles)
set theLines to paragraphs of convertedOutput
repeat with thisLine in theLines
if thisLine contains theFileName then
set thePath to characters (offset of "/" in thisLine) thru -1 in thisLine as string
exit repeat
end if
end repeat
tell application id "DNtp"
try
set theDatabases to databases
set theResults to {}
repeat with thisDatabase in theDatabases
set thisDatabasesResults to lookup records with path thePath in thisDatabase
set theResults to theResults & thisDatabasesResults
end repeat
if theResults = {} then
display notification "Pfad nicht in offenen Datenbanken enthalten!" with title "Lookup DEVONthink"
return
else
open window for record (item 1 of theResults)
activate
end if
on error error_message number error_number
if the error_number is not -128 then
display alert "DEVONthink Pro" & space & error_number message error_message as warning
return
end if
end try
end tell
Now it’s possible to go back from reading a PDF in PDF Expert to the corresponding record in DEVONthink with a shortcut. No need to search the PDF in DEVONthink anymore.
It’s even possible to set up e.g. Keyboard Maestro in a way that hitting the shortcut not only opens the DEVONthink record but also opens e.g. DEVONthinks info popup window to instantly add a comment, an annotation or custom metadata
-- Open DEVONthink record for current PDF Expert tab
-- solution for umlauts ("iconv -t UTF8-MAC") found here: https://stackoverflow.com/questions/23219482/bash-ps-grep-for-process-with-umlaut-os-x/23226449#23226449
tell application "System Events"
try
tell application process "PDF Expert"
tell window 1
set theFileName to value of attribute "AXTitle" & ".pdf"
if theFileName starts with "* " then set theFileName to characters 3 thru -1 in theFileName as string
end tell
set PID to unix id
end tell
on error error_message number error_number
if the error_number is not -128 then
display alert "System Events" & space & error_number message error_message as warning
return
end if
end try
end tell
set theOpenFiles to (do shell script "lsof -p " & PID)
set convertedOutput to (do shell script "iconv -t UTF8-MAC <<<$" & quoted form of theOpenFiles)
set theLines to paragraphs of convertedOutput
repeat with thisLine in theLines
if thisLine contains theFileName then
set thePath to characters (offset of "/" in thisLine) thru -1 in thisLine as string
exit repeat
end if
end repeat
tell application id "DNtp"
try
set theDatabases to databases
set theResults to {}
repeat with thisDatabase in theDatabases
set thisDatabasesResults to lookup records with path thePath in thisDatabase
set theResults to theResults & thisDatabasesResults
end repeat
if theResults = {} then
display notification "Pfad nicht in offenen Datenbanken enthalten!" with title "Lookup DEVONthink"
return
else
open window for record (item 1 of theResults)
activate
end if
on error error_message number error_number
if the error_number is not -128 then
display alert "DEVONthink Pro" & space & error_number message error_message as warning
return
end if
end try
end tell
Yes, it takes you right back to the start, so you can act on the PDF in DEVONthink.
PDF Expert has no AppleScript support and the only thing one can get from the app via AppleScript is the window name. I don’t want to rely just on the filename and read about “lsof” last week or so. This was a happy accident
@pete31 By chance, does your script sometimes mistakenly open apps when it’s checking to see if they’re running?
The reason I ask is that I made a script that I run through Alfred and feed to other apps, like DEVONthink (which I think I might have mentioned to you previously) that has this problem. After restarting or shutting down my computer, the first time I run the script, it always does this - opening some of the apps that are not running, though it ultimately still grabs the correct file path, etc. After it’s run once, however, it works perfectly fine. It’s super annoying!
In any case, my code’s a little different from yours, so I was considering checking if the app is running by converting over to your approach, assuming it doesn’t have this problem. FWIW - While I’m no programmer, I think it’s related to the way that applescripts are compiled (whatever that means), which I’ve seen others complain about elsewhere.
If you’re curious, here’s how my script starts:
global frontApp, frontAppName, windowTitle
set windowTitle to ""
tell application "System Events"
set frontApp to first application process whose frontmost is true
set frontAppName to name of frontApp
end tell
if frontAppName is equal to "Adobe Illustrator" then ... [TONS of apps, etc.]
I’m trying to set up a way to work on the same PDF in Acrobat Pro 2020 and DevonThink, seemlessly opening the currently visible page in the other application via a keyboard maestro hotkey.
While modifying your script from this thread works to open the PDF page from DevonThink in Acrobat, I was not able to get the script above to work.
After replacing PDF Expert with Acrobat Pro 2020 and running the script via a keyboard maestro hotkey in Acrobat, nothing happens at all.
In case there is an easy solution here, your advice would be highly appreciated.
I don’t use Adobe but downloaded a demo. After spending far more time than I thought it would take I’m quite sure Adobe got a serious problem with AppleScript.
This is a vaild statement, I think:
tell application id "com.adobe.Acrobat.Pro"
try
set theWindows to windows
if theWindows = {} then error "Please open a window"
set theDocuments to documents
on error error_message number error_number
if the error_number is not -128 then display alert "Acrobat Pro" message error_message as warning
return
end try
end tell
It’s of course possible I overlooked something but it seems it’s just not possible to get the path of Adobe Pros’s current tab. (I did try a lot more than what’s shown in the script - to no avail)
Your scripts are always helpful—at least for me—even if I don’t have an immediate use for them. I read them and squeeze out the relevant knowledge like juice from an orange. Thanks so much for all your contributions.