harrison-matt Posted November 16, 2010 Posted November 16, 2010 Hello All, Ok, I am trying to open a PDF in a specific folder and add an argument to navigate to a bookmark or page. I know this can be done using outlook for example: (startapp "C:\\Program Files (x86)\\Microsoft Office\\Office12\\OUTLOOK.EXE" [email="email@server.com"]mailto:email@server.com[/email])) Any thoughts? Thanks, Matt Quote
The Buzzard Posted November 16, 2010 Posted November 16, 2010 Hello All, Ok, I am trying to open a PDF in a specific folder and add an argument to navigate to a bookmark or page. I know this can be done using outlook for example: (startapp "C:\\Program Files (x86)\\Microsoft Office\\Office12\\OUTLOOK.EXE" [email="email@server.com"]mailto:email@server.com[/email])) Any thoughts? Thanks, Matt You must add the location of outlook.exe to the AutoCAD Search Support Path in your options. Quote
The Buzzard Posted November 16, 2010 Posted November 16, 2010 You could also do this: http://www.afralisp.net/archive/Tips/code107.htm Quote
Lee Mac Posted November 16, 2010 Posted November 16, 2010 I've delved into interfacing with Adobe using OLE Automation in the past to no avail, but I believe some of the application string do work. However, to open PDF files, I've always found this to be reliable: [i][color=#990099];;----------------------=={ Open File }==---------------------;;[/color][/i] [i][color=#990099];; ;;[/color][/i] [i][color=#990099];; Uses the 'Open' method of the Shell Object to open the ;;[/color][/i] [i][color=#990099];; specified file. ;;[/color][/i] [i][color=#990099];;------------------------------------------------------------;;[/color][/i] [i][color=#990099];; Author: Lee McDonnell, 2010 - www.lee-mac.com ;;[/color][/i] [i][color=#990099];; ;;[/color][/i] [i][color=#990099];; Copyright © 2010 by Lee McDonnell, All Rights Reserved. ;;[/color][/i] [i][color=#990099];; Contact: Lee @ lee-mac.com ;;[/color][/i] [i][color=#990099];; Forums: Lee Mac @ TheSwamp.org, CADTutor.net, AUGI.com ;;[/color][/i] [i][color=#990099];;------------------------------------------------------------;;[/color][/i] [i][color=#990099];; Arguments: ;;[/color][/i] [i][color=#990099];; filename - filename of file to open ;;[/color][/i] [i][color=#990099];;------------------------------------------------------------;;[/color][/i] [i][color=#990099];; Returns: T if file opened successfully, else nil ;;[/color][/i] [i][color=#990099];;------------------------------------------------------------;;[/color][/i] [b][color=RED]([/color][/b][b][color=BLUE]defun[/color][/b] LM:OpenFile [b][color=RED]([/color][/b] filename [b][color=BLUE]/[/color][/b] Shell result [b][color=RED])[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]vl-load-com[/color][/b][b][color=RED])[/color][/b] [i][color=#990099];; © Lee Mac 2010[/color][/i] [b][color=RED]([/color][/b][b][color=BLUE]setq[/color][/b] Shell [b][color=RED]([/color][/b][b][color=BLUE]vla-getInterfaceObject[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]vlax-get-acad-object[/color][/b][b][color=RED])[/color][/b] [b][color=#a52a2a]"Shell.Application"[/color][/b][b][color=RED]))[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]setq[/color][/b] result [b][color=RED]([/color][/b][b][color=BLUE]and[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]setq[/color][/b] filename [b][color=RED]([/color][/b][b][color=BLUE]findfile[/color][/b] filename[b][color=RED]))[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]not[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]vl-catch-all-error-p[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]vl-catch-all-apply[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]function[/color][/b] [b][color=BLUE]vlax-invoke[/color][/b][b][color=RED])[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]list[/color][/b] Shell [b][color=DARKRED]'[/color][/b][b][color=BLUE]Open[/color][/b] filename[b][color=RED])[/color][/b] [b][color=RED])[/color][/b] [b][color=RED])[/color][/b] [b][color=RED])[/color][/b] [b][color=RED])[/color][/b] [b][color=RED])[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]vlax-release-object[/color][/b] Shell[b][color=RED])[/color][/b] result [b][color=RED])[/color][/b] Quote
harrison-matt Posted November 16, 2010 Author Posted November 16, 2010 Well, I use this quite often to open a file, my problem is i need to then navigate to a specific page: (startapp "Explorer" "M:\\Standards\\Admin-Reference Material\\Documentation\\Plumbing - User Manual.pdf") As an example. Matt Quote
Lee Mac Posted November 16, 2010 Posted November 16, 2010 Ok, I think I have something working... You can find the location of the shell command string which can be used to open the pdf document in the registry, under: HKEY_CLASSES_ROOT\\.pdf This will point you to another location under HKCR, something like 'AcroExch.Document'. Navigate to the Shell Open Command Key under this entry: HKEY_CLASSES_ROOT\\AcroExch.Document\\Shell\\Open\\Command There you will find the command string to open the pdf document, something like: "C:\Program Files\Adobe\Reader 8.0\Reader\AcroRd32.exe" "%1" Where "%1" is the filename of the PDF. Now, after a bit of research, there are quite a few PDF Open parameters you can use with this string, so to open to a specific page (page 3 in this case), you can use: (startapp "\"C:\Program Files\Adobe\Reader 8.0\Reader\AcroRd32.exe\" /A \"page=3\" \"C:\\MyPDF.pdf\"") Lee Quote
rkmcswain Posted November 16, 2010 Posted November 16, 2010 Maybe this info will help? http://partners.adobe.com/public/developer/en/acrobat/PDFOpenParameters.pdf Quote
alanjt Posted November 16, 2010 Posted November 16, 2010 I've delved into interfacing with Adobe using OLE Automation in the past to no avail, but I believe some of the application string do work. However, to open PDF files, I've always found this to be reliable: Is there any advantage to using (vla-getInterfaceObject (vlax-get-acad-object) "Shell.Application") over (vlax-create-object "Shell.Application") ? I've used vlax-create-object to successfully open files, on many occasions. Quote
harrison-matt Posted November 16, 2010 Author Posted November 16, 2010 Now, Lee that is exactly what i am looking for, now thank you for bringing up the registry items for opening the PDF not everyone has the same program. Just brilliant, brilliant! Alright this is what i have: (setq opdoc (vl-registry-read "HKEY_CLASSES_ROOT\\.pdf")) (setq opstr (vl-registry-read (strcat "HKEY_CLASsES_ROOT\\" OPDOC "\\shell\\open\\command"))) Now I would like to get the path of the executable only, how would i go about that? Matt Quote
Lee Mac Posted November 16, 2010 Posted November 16, 2010 Is there any advantage to using (vla-getInterfaceObject (vlax-get-acad-object) "Shell.Application") over (vlax-create-object "Shell.Application") ? I've used vlax-create-object to successfully open files, on many occasions. I'm not sure there is too much difference, but I've noticed a difference with ObjectDBX Objects on some versions. Well, that said, I'm sure someone with more knowledge will be able to point out the difference Quote
Lee Mac Posted November 16, 2010 Posted November 16, 2010 Now I would like to get the path of the executable only, how would i go about that? Maybe something similar to this? (defun GetAdobePath ( / AcroDoc AcroPath ) (vl-load-com) (if (and (setq AcroDoc (vl-registry-read "HKEY_CLASSES_ROOT\\.pdf")) (setq AcroPath (vl-registry-read (strcat "HKEY_CLASSES_ROOT\\" AcroDoc "\\Shell\\Open\\Command") ) ) ) (car (LM:str->lst AcroPath "\"")) ) ) ;;-------------------=={ String to List }==-------------------;; ;; ;; ;; Separates a string into a list of strings using a ;; ;; specified delimiter string ;; ;;------------------------------------------------------------;; ;; Author: Lee McDonnell, 2010 ;; ;; ;; ;; Copyright © 2010 by Lee McDonnell, All Rights Reserved. ;; ;; Contact: Lee Mac @ TheSwamp.org, CADTutor.net ;; ;;------------------------------------------------------------;; ;; Arguments: ;; ;; str - string to process ;; ;; del - delimiter by which to separate the string ;; ;;------------------------------------------------------------;; ;; Returns: A list of strings ;; ;;------------------------------------------------------------;; (defun LM:str->lst ( str del / pos ) ;; © Lee Mac 2010 (if (setq pos (vl-string-search del str)) (vl-remove "" (cons (substr str 1 pos) (LM:str->lst (substr str (+ pos 1 (strlen del))) del))) (list str) ) ) Quote
alanjt Posted November 16, 2010 Posted November 16, 2010 I'm not sure there is too much difference, but I've noticed a difference with ObjectDBX Objects on some versions. Well, that said, I'm sure someone with more knowledge will be able to point out the difference Interesting. OK. Quote
Lee Mac Posted November 16, 2010 Posted November 16, 2010 Interesting. OK. I think the rule would be: If you want it to run within AutoCAD, then vla-getinterfaceobject (such as for BrowseForFolder/ObjectDBX), else vlax-get-or-create-object/vlax-create-object (such as for Excel apps etc) - but that's just a guess tbh. Quote
alanjt Posted November 16, 2010 Posted November 16, 2010 I think the rule would be: If you want it to run within AutoCAD, then vla-getinterfaceobject (such as for BrowseForFolder/ObjectDBX), else vlax-get-or-create-object/vlax-create-object (such as for Excel apps etc) - but that's just a guess tbh. Hard to say. I've seen the same function executed with both. Quote
seawind Posted June 28, 2023 Posted June 28, 2023 (edited) As always inspired from Master Lee the general function for every app ;; ext - application files extension (e.g. for excel use xlsx) ;; (defun GetAppPath ( ext / AppDoc AppPath ) (vl-load-com) (if (and (setq AppDoc (vl-registry-read (strcat "HKEY_CLASSES_ROOT\\." ext))) (setq AppPath (vl-registry-read (strcat "HKEY_CLASSES_ROOT\\" AppDoc "\\Shell\\Open\\Command") ) ) ) (car (LM:str->lst AppPath "\"")) ) ) Edited June 28, 2023 by SLW210 Added Code Tags! <> Quote
SLW210 Posted June 28, 2023 Posted June 28, 2023 Also, please use Code Tags (<> in the reply toolbar) in the future. Quote
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.