scripts javascript adobe extendscript jsx indesign-server

javascript - adobe scripts



¿Es posible ejecutar scripts JSX desde ExtendScript externo? (5)

Normalmente, cuando escribe un script .jsx para automatizar un producto de Adobe (como InDesign, Illustrator o Photoshop), escribe, depura y ejecuta el script desde el IDE de ExtendScript. ¿Es posible omitir ExtendScript y ejecutar el script desde un tercer programa?

Creo que los productos de Adobe tienen un intérprete de JavaScript incorporado al cual se puede conectar ExtendScript para acceder a los modelos de objetos de Adobe y automatizar su software. Me gustaría poder conectarme directamente a ese intérprete y ejecutar archivos jsx como lo haría en ExtendScript.


Esto funciona en windows:

"C: / Archivos de programa (x86) / Adobe / Adobe Photoshop CS5 / Photoshop.exe" C: / completepathto / my.jsx

Presta atención al camino de Photoshop. Debe citarse ya que contiene espacios.

Hay muchos trucos para descubrir dónde se carga Photoshop. Aquí hay uno que encuentra todas las ubicaciones donde se ha cargado Photoshop y las coloca en x.lst

@REM The Presets/Scripts doesn''t really restrict where the loop is looking, @REM thus the "IF EXIST" is needed. The FIND makes sure that the @for /R "%ProgramFiles(x86)%/Adobe" %%f in (Presets/Scripts) DO @IF EXIST %%f (echo %%f | FIND /I "Adobe Photoshop C" >> x.lst )

A continuación, puede procesar cada línea en x.lst. NOTA: Todo el "@for" debe estar en UNA línea, lo dividí en varias líneas para facilitar la lectura.

Si crees que solo habrá un Photoshop (y no Elementos), entonces puedes cambiar "echo %% f" a

"%%f/../../Photoshop.exe" C:/completepathto/my.jsx


La respuesta directa es . Illustrator, InDesign y Photoshop pueden ejecutarse mediante scripts a través de COM. Cualquier programa que realice que pueda acceder a COM (como un lenguaje .net, C ++, BCX, Autohotkey o Powerpro) puede decirle a Illustrator, InDesign o Photoshop que haga cosas.

Aquí hay un ejemplo para Powerpro (necesitará el complemento com de powerpro), y esto funciona en CS4 y CS5:

Function ComLoad() ;;MAKE SURE TO CALL .@ComUnload WHEN EXITING FUNCTION CALLS! static objname="Illustrator.Application" static com_status, com_type static appRef=com.create_object(objname) endfunction Function ComUnload();;this is end the com calls and unload com com.unload endfunction

Después de usar la función ComLoad (), ejecuta cualquier tipo de método o función que ofrece la biblioteca COM. Aquí es cómo usar Powerpro para decirle a Illustrator que ejecute su archivo jsx o js:

;Run a script from anywhere Function RunOtherScript(whatscript) If (file.Validpath(whatscript) == 0)do messagebox("ok","Whoops! That script doesn''t exist!","ILL Runscript") quit endif .@ComLoad() appRef.DoJavaScriptFile(whatscript) .@ComUnload() quit

Aquí hay una imagen de una barra de herramientas flotante que hice con Powerpro. Los botones están todos conectados a las funciones com. La mayoría del tiempo uso las funciones com para ejecutar scripts jsx externos.

[editar]

¡Hay otra manera! Puede usar el Configurador de Adobe para crear nuevos paneles que sean capaces de lanzar scripts. Puede diseñar el panel de la forma que desee y los resultados son bastante similares a los de la barra de herramientas powerpro que he descrito anteriormente. De hecho, me mudé de la barra de herramientas de powerpro a un Panel de configuración de Adobe.


Para usuarios de Windows, puede usar un script vbs. Pase los argumentos al script .jsx proporcionando argumentos al comando cscript forma: cscript test.vbs "hello" . test.vbs podría verse así:

Dim appRef Dim javaScriptFile Dim argsArr() Dim fsObj : Set fsObj = CreateObject("Scripting.FileSystemObject") Dim jsxFile : Set jsxFile = fsObj.OpenTextFile("C:/Users/path/test.jsx", 1, False) Dim fileContents : fileContents = jsxFile.ReadAll jsxFile.Close Set jsxFile = Nothing Set fsObj = Nothing javascriptFile = fileContents & "main(arguments);" Set appRef = CreateObject("Illustrator.Application") ReDim argsArr(Wscript.Arguments.length-1) For i = 0 To Wscript.Arguments.length-1 argsArr(i) = Wscript.Arguments(i) Next Wscript.Echo appRef.DoJavaScript(javascriptFile, argsArr, 1)

El Wscript.Echo devolverá la última línea devuelta por el archivo .jsx. Un ejemplo de archivo .jsx podría ser:

function main(argv) { alert(argv[0]); return "test"; }

Cuando se ejecuta, debe ver la alerta de "hola" de Illustrator (o el programa de adobe) y luego "test" se devolverá a la salida estándar (debe verlo en la ventana del símbolo del sistema).


Si coloca los archivos .jsx en la ubicación correcta

Photoshop folder location: /Applications/Adobe/ Photoshop/ CS5/Presets/Scripts menu location: File > Scripts Illustrator folder location: /Applications/Adobe/ Illustrator/ CS5/Presets.localized/en_GB/Scripts menu location: File > Scripts InDesign folder location: /Users/{user}/Library/Preferences/Adobe/ InDesign/Version/ 7.0/en_GB/Scripts/Scripts/ Panel menu location: Window > Utilities > Scripts

Estas son las rutas en OSX, debería ser fácil encontrar el equivalente en Windows para Photoshop e Illustrator, pero para InDesign podría ser más fácil abrir el Panel de Scripts y abrir la carpeta de scripts usando el menú contextual del Panel.

Sé que puede ejecutar los scripts .jsfl desde la línea de comandos abriendo Flash y pasando la ruta al script .jsfl como un argumento, pero eso no parece funcionar con los archivos .jsx con InDesign.

HTH


¿Estás en una Mac? Si es así, puedes usar AppleScript con la herramienta de osascript para ejecutar tu JavaScript. Aquí hay unos ejemplos:

Ejecutando JSX y devolviendo un valor

Guarda esto como ~ / temp / foo.scpt:

tell application "Adobe Illustrator" -- ''do javascript'' runs any arbitrary JS. -- We''re using the #include feature to run another -- file. (That''s an Adobe extension to JS.) -- -- You have to pass a full, absolute path to #include. -- -- The documentation alleges that ''do javascript'' -- can be passed an AppleScript file object, but -- I wasn''t able to get that to work. do javascript "#include ~/temp/foo.jsx" end tell

Y guarda esto como ~ / temp / foo.jsx:

var doc = app.activeDocument; var numLayers = doc.layers.length; // The last value in the JSX file will be printed out by // osascript. numLayers;

Ahora, desde la línea de comandos, ejecute osascript ~/temp/foo.scpt Se imprimirá el número de capas en el documento activo de Illustrator.

Obtener datos del JavaScript es limitante. No se puede imprimir en stdout desde el JavaScript. En su lugar, coloque el valor que desea devolver como la última declaración del archivo JSX; Será impreso por osascript . (Este es el motivo: el último valor en el archivo JSX es el valor de retorno de la declaración de AppleScript de do javascript . Ese también es el último valor en el archivo de AppleScript, y osascript imprime el valor final).

El valor que devuelve de JavaScript puede ser un número, una cadena, una matriz o cualquier otra cosa que retenga su valor cuando se convierte en una cadena. Si desea devolver un objeto complejo, deberá # .toJSONString() una biblioteca JSON y llamar a .toJSONString() en el objeto.

Pasando Argumentos a JSX

Para pasar argumentos al código JSX, siga este ejemplo:

Archivo ~ / temp / args.scpt:

on run argv tell application "Adobe Illustrator" set js to "#include ''~/temp/args.jsx'';" & return set js to js & "main(arguments);" & return do javascript js with arguments argv end tell end run

Archivo ~ / temp / args.jsx

function main(argv) { var layer = app.activeDocument.activeLayer; app.defaultStroked = true; app.defaultFilled = true; // Top, left, width, height (in points). // Note that parameters start at argv[0]. layer.pathItems.rectangle(argv[0], argv[1], argv[2], argv[3]); }

Y luego ejecute osascript args.scpt 50 30 10 80

Depuración

El comando do javascript también tiene opciones para iniciar el depurador ExtendScript. Para más detalles, abra el diccionario de Illustrator en AppleScript Editor.