Illustrator 变量 - 在自动生成时动态地将两个文本字符串并排排列
Illustrator variables - dynamically line up two text strings next to each other when autogenerating
我正在 Adobe Illustrator 中自动生成数千个标签。到目前为止,VariableImporter 脚本的使用使它的工作变得很容易,但现在我遇到了一个让我感到困惑的问题。最初的计划运作良好,直到要求一行文本具有粗体文本字符串,然后是正常重量文本字符串的权力。以前,当字体粗细相同时,我可以在将 CSV 文件中的两个文本字符串加载到绘图中之前将它们连接起来,并且它们会紧挨着出现。现在这不再可能了,我想不出一个不是非常挑剔的解决方案。
我不太了解插画家,所以我想我可能只是不知道某些设置会在另一个对象移动时将对象粘在另一个对象旁边。
有一种方法可以通过让脚本在批处理输出过程中进行一些处理来完成此操作,并且组织系统会为您的文件增加一些开销,例如添加更多文本框和可能的额外内容图层到您的文档。但是 - 这是您可以拥有的:一个隐藏层,其中包含所有变量,位于单独的单点文本对象中,以及一个包含常规模板对象(例如任何点文本或区域文本对象)的层。您的艺术文本对象将需要重新处理以包含具有多个变量占位符的字符串,如下所示:"Hello, <FirstName> <LastName>"
。占位符可以设置样式,然后处理脚本需要用您的实际变量值替换 <placeholder>
单词。变量值在哪里?它们将填充到具有单独文本对象的隐藏层中,脚本需要读取每个对象的内容以放入 <placeholders>
。 ~~那些相同的文本字段可以根据需要设置样式,并且当在主文本正文中替换文本时,脚本可以将相同的样式应用于您的文本。~~ - 实际上,这不是您的例程备份所必需的带有占位符的原始文本框架,因此保留了样式,但如果您打算使用外部文本文件来保留原始文本,则可能有必要。当然,它需要备份包含所有 <placeholders>
的原始文本,以便在批处理过程中为每个新数据集重置文本。
然而,这在 Indesign 中更容易完成,您可以不使用 ID 来完成您的任务吗?
好的,这就是我在 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);
运行 脚本
我根据@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);
}
}
我正在 Adobe Illustrator 中自动生成数千个标签。到目前为止,VariableImporter 脚本的使用使它的工作变得很容易,但现在我遇到了一个让我感到困惑的问题。最初的计划运作良好,直到要求一行文本具有粗体文本字符串,然后是正常重量文本字符串的权力。以前,当字体粗细相同时,我可以在将 CSV 文件中的两个文本字符串加载到绘图中之前将它们连接起来,并且它们会紧挨着出现。现在这不再可能了,我想不出一个不是非常挑剔的解决方案。
我不太了解插画家,所以我想我可能只是不知道某些设置会在另一个对象移动时将对象粘在另一个对象旁边。
有一种方法可以通过让脚本在批处理输出过程中进行一些处理来完成此操作,并且组织系统会为您的文件增加一些开销,例如添加更多文本框和可能的额外内容图层到您的文档。但是 - 这是您可以拥有的:一个隐藏层,其中包含所有变量,位于单独的单点文本对象中,以及一个包含常规模板对象(例如任何点文本或区域文本对象)的层。您的艺术文本对象将需要重新处理以包含具有多个变量占位符的字符串,如下所示:"Hello, <FirstName> <LastName>"
。占位符可以设置样式,然后处理脚本需要用您的实际变量值替换 <placeholder>
单词。变量值在哪里?它们将填充到具有单独文本对象的隐藏层中,脚本需要读取每个对象的内容以放入 <placeholders>
。 ~~那些相同的文本字段可以根据需要设置样式,并且当在主文本正文中替换文本时,脚本可以将相同的样式应用于您的文本。~~ - 实际上,这不是您的例程备份所必需的带有占位符的原始文本框架,因此保留了样式,但如果您打算使用外部文本文件来保留原始文本,则可能有必要。当然,它需要备份包含所有 <placeholders>
的原始文本,以便在批处理过程中为每个新数据集重置文本。
然而,这在 Indesign 中更容易完成,您可以不使用 ID 来完成您的任务吗?
好的,这就是我在 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);
运行 脚本
我根据@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);
}
}