通常,当您编写.jsx脚本以自动化Adobe产品(如InDesign,Illustrator或Photoshop)时,您可以从ExtendScript IDE编写,调试和执行脚本.是否可以绕过ExtendScript并从第三个程序运行脚本?
我认为Adobe产品有一个内置的JavaScript解释器,ExtendScript可以连接到它来访问Adobe对象模型并自动化他们的软件.我希望能够像在ExtendScript中一样直接连接到该解释器并运行jsx文件.
当我在ExtendScript中捕获错误时,我希望能够记录其堆栈跟踪.似乎错误在ExtendScript中不包含堆栈跟踪,所以我正在尝试将错误添加到堆栈跟踪.
我知道获得堆栈跟踪的唯一方法是$.stack.该字段$.stack包含您访问该字段时的当前堆栈跟踪.
我的第一次尝试是创建自己的包含堆栈的错误对象.该Error对象非常特殊,因为它可以获取创建它的代码的行和文件名.例如,
try {
throw new Error("Houston, we have a problem.");
}
catch (e) {
$.writeln("Line: " + e.line);
$.writeln("File: " + e.fileName);
$.writeln("Message: " + e.message);
}
Run Code Online (Sandbox Code Playgroud)
将打印:
Line: 2
File: ~/Desktop/Source1.jsx
Message: Houston, we have a problem.
Run Code Online (Sandbox Code Playgroud)
我不认为用这种能力创建你自己的对象是可能的.我能得到的最接近的是:
function MyError(msg, file, line) {
this.message = msg;
this.fileName = file;
this.line = line;
this.stack = $.stack;
}
try {
throw new MyError("Houston, we have a problem.", $.fileName, $.line);
}
catch (e) { …Run Code Online (Sandbox Code Playgroud) 我是Adobe InDesign Server的新手,我很难找到一个好的厨房水槽应用程序.我从SDK获得的所有示例似乎都部分有效.我要做的就是从服务器端使用InDesign的母版页并编辑某些文本字段.例如,在特定文本字段中放置名字和姓氏.有没有人知道一个好的地方获得显示所有功能的示例代码或我将如何处理此问题?
到目前为止我发现的唯一区别是:如果运行的脚本app.doScript返回错误,则错误的文件和行号将被app.doScript调用的文件和行号覆盖.
还有其他我应该知道的差异吗?
以下是演示上述差异的示例代码:
首次运行InDesign:
c:
cd "C:\Program Files\Adobe\Adobe InDesign CS6 Server x64"
InDesignServer.com -port 12345
pause
Run Code Online (Sandbox Code Playgroud)
接下来创建一个批处理文件来运行脚本:
c:
cd "C:\Program Files\Adobe\Adobe InDesign CS6 Server x64"
sampleclient -host localhost:12345 -server "C:/doscript_vs_evalfile/call_doScript.jsx"
pause
Run Code Online (Sandbox Code Playgroud)
这是"call_doScript.jsx",它将调用app.doScript.
try {
app.doScript(new File("/c/doscript_vs_evalfile/called_by_doScript.jsx"));
"Success";
}
catch (e) {
var sError = "Encountered " + e.name + " #" + e.number + " at line " + e.line + " of file " + e.fileName + "\n" + e.message;
app.consoleout(sError);
sError;
}
Run Code Online (Sandbox Code Playgroud)
这是"called_by_doScript.jsx",由前一个脚本调用:
app.consoleout("Running …Run Code Online (Sandbox Code Playgroud) 我正在创建一个用于Indesign Server(CS3)的Javascript脚本.
试图找到文档中的所有textareas并找到它们的内容.
我可以使用Adobe提供的功能轻松遍历所有textareas.
但是,当我尝试获取TextArea的内容时,我只获取该textarea中可见的内容,而不是输出端口文本.
document.TextAreas[0].contents
Run Code Online (Sandbox Code Playgroud)
换句话说,如果Indesign文档包含带有小加号的textarea,表示有更多文本,但它不适合,那么我的脚本不会返回隐藏文本.
或者,再说一遍.当'textarea'的'overflows'属性为false时,我能获得整个内容吗?
完整代码:
function FindAllTextBoxes(){
var alertMessage;
for (var myCounter = myDoc.textFrames.length-1; myCounter >= 0; myCounter--) {
var myTextFrame = myDoc.textFrames[myCounter];
alertMessage += "\nTextbox content: " + myTextFrame.contents;
alertMessage += "\nOverflow:" + myTextFrame.overflows;
alert(alertMessage);
}
}
Run Code Online (Sandbox Code Playgroud)
我怎样才能阅读Textarea的全部内容?
我正在尝试使用inDesign JSX脚本将以下数据插入到文档中:
data = [{heading:"Heading 1", content: ["Some content"]},
{heading:"Heading 2", content: ["Some other content with", "Multiple paragraphs"]}]
Run Code Online (Sandbox Code Playgroud)
数据必须放在单个TextFrame中,但在标题和内容上具有不同的样式.
我可以看到添加文本的唯一方法是通过textFrame.contents变量一次性:
allContent = "";
headingParagraphs = []; // keep track of which paragraphs are headings
paragraph = 0;
for (var i = 0; i < data.length; i++) {
allContent += data.heading + "\r"; // Use a newline to split the paragraph
headingParagraphs.push(paragraph);
paragraph++;
for (var j = 0; j < data.content.length; j++) {
allContent += data.content[j] + "\r"; // …Run Code Online (Sandbox Code Playgroud) 我正在编写一些JS代码来重新链接图像,然后调整它以适应包含的对象.简化版代码:
var image = (get image);
try {
image.itemLink.relink(File(new_filename));
}
catch(e) {
(log it);
}
var image = (find image again because after the relink it would otherwise cause error "Object no longer exists")
(work out new width, height, v offset, h offset);
try {
if(image.locked) {
lock_later = true;
image.locked = false;
}
}
catch(e) { }
// Resize and reposition image
image.geometricBounds = [(rectangle.geometricBounds[0] + h_offset) + "mm", (rectangle.geometricBounds[1] + w_offset) + "mm", (rectangle.geometricBounds[2] - h_offset) + "mm", …Run Code Online (Sandbox Code Playgroud)