Illustrator变量 - 自动化时,动态排列两个文本字符串



我正在自动化Adobe Illustrator中数千个标签的生成。到目前为止,使用可变的虫脚本已经轻松完成了工作,但是现在我已经解决了一个问题。原始计划效果很好,直到要求一行文本具有大胆的文本字符串,然后是正常的重量文本字符串。以前,当字体权重与相同的字体相同时,我可以在将其加载到图纸中之前将CSV文件中的两个文本字符串连接起来,并且它们会彼此相邻出现。现在这是不再可能的,我想不出一个并非令人难以置信的解决方案。

我不太了解Illustrator,所以我认为我可能不知道某些设置,即使另一个人移动时,它也会贴在另一个物体旁边。

好吧,这是我在Adobe论坛和Vasily的帮助下弄清楚如何做到这一点的方式。

首先,如果可能的话,请使用Indesign。最好执行数据合并,并且可以无需您的脚本而执行此操作。

写出在同一文本中需要根据需要格式的<variable1> <variable2>

您将需要在插图中的某个地方放置要放入其中的变量。建议将其放在所有事物后面的隐藏层中。

替换变量1和变量2用您的变量的名称替换functions getVariableContents()在此脚本中调用

中的变量名称。
var idoc = app.activeDocument;
var vars = idoc.variables;
var replace1 = /<variable1>/g;
var replace2 = /<variable2>/g;
// author CarlosCanto on adobe forums
function getVariableContents(variableName) {
    var idoc = app.activeDocument;
    var ivar = idoc.variables.getByName(variableName);
    return ivar.pageItems[0].contents;
}
var replaceWith1 = getVariableContents('variable1'), result;
var replaceWith2 = getVariableContents('variable2'), result;
// regex_changeContentsOfWordOrString_RemainFormatting.jsx
// regards pixxxel schubser
function exchangeWords(s, replacer) {
    var s = s;
    var replacer = replacer;
    var atfs = activeDocument.textFrames;
    for (var i = atfs.length - 1; i >= 0; i--) {
        atf = atfs[i];
        while (result = s.exec(atf.contents)) {
            try {
                aCon = atf.characters[result.index];
                    aCon.length = result[0].length;
                    aCon.contents = aCon.contents.replace(s, replacer);
            } catch (e) {};
        }
    }
}
exchangeWords(replace1,replaceWith1);
exchangeWords(replace2,replaceWith2);

运行脚本

有一种方法可以通过让脚本在批处理输出过程中进行一些处理来实现此目的,而在添加更多方面,在您的文件中增加了一些开销的组织系统文本框以及您的文档额外层。但是 - 这就是您可以拥有的:一个隐藏的层,其中所有变量都在单独的单点文本对象中,以及带有常规模板对象的图层,例如任何点文本或区域文本对象。您的艺术文本对象将需要重新设计,以包含一个带有多个可变占位符的字符串:"Hello, <FirstName> <LastName>"。占位符可以设计样式,然后处理脚本需要用您的真实变量值替换<placeholder>单词。可变值在哪里?它们将填充到您的隐藏层中,该图层具有您的单独的文本对象,并且脚本需要读取每个内容的内容以放入<placeholders>中。~~这些相同的文本字段可以按照您的意愿进行样式,并且脚本在主体中替换为文本时可以将相同的样式应用于您的文本。原始文本框架带有占位符,因此保留样式,但是如果您要使用外部文本文件来保留原始文本,则可能有必要带有所有<placeholders>的原始文本,以便在您的批处理过程中重置每个新数据集的文本。

但是,这在Indesign中要容易得多,您不能将ID用于任务吗?

我从 @tucker-david-grebitus的答案中修改了脚本。因此,现在它获得了所有文本变量,并用百分比符号

替换所有名称
for (var i = activeDocument.variables.length - 1; i >= 0; i -= 1) {
    var variable = activeDocument.variables[i];
    if (variable.kind !== VariableKind.TEXTUAL || !variable.pageItems.length) {
        continue;
    }
    var search = new RegExp('%' + variable.name + '%', 'g');
    var value = variable.pageItems[0].contents;
    for (var j = activeDocument.textFrames.length - 1; j >= 0; j -= 1) {
        var textFrame = activeDocument.textFrames[j];
        textFrame.contents = textFrame.contents.replace(search, value);
    }
}

最新更新