Illustrator变量 - 在自动生成时动态地将两个文本字符串排列在一起

时间:2017-03-07 23:49:34

标签: automation adobe-illustrator

我在Adobe Illustrator中自动生成数千个标签。到目前为止,使用VariableImporter脚本已经很容易了,但现在我遇到了一个难以理解的问题。最初的计划很有效,直到请求一行文本具有粗体文本字符串,然后是正常的权重文本字符串。之前,当字体权重相同时,我可以在将CSV文件中的两个文本字符串加载到图形中之前将它们连接起来,并且它们会出现在彼此相邻的位置。现在已经不再可能了,我想不出一个不是非常繁琐的解决方案。

我不太了解插画家,所以我想我可能只是不知道某个设置会将一个物体贴在另一个物体旁边,即使另一个物体移动。

3 个答案:

答案 0 :(得分:1)

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

但是,在Indesign中这样做容易得多,你不能使用ID来完成任务吗?

答案 1 :(得分:1)

好的,这就是我在Adobe论坛和Vasily的帮助下想出如何做到这一点的方式。

首先,尽可能使用InDesign。它更适合执行数据合并,并且可以在没有脚本的情况下执行此操作。

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

您需要在插图中的某处放置您要放置的变量。建议将它放在一切后面的隐藏层中。

将variable1和variable2替换为在此脚本中调用函数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);

运行脚本

答案 2 :(得分:1)

我从@ 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);
    }
}