【问题标题】:Input CSV data in to layers with Illustrator Scripting使用 Illustrator 脚本将 CSV 数据输入到图层中
【发布时间】:2021-05-27 22:39:40
【问题描述】:

我是 Illustrator 脚本的新手。如何将 csv 文件中的数据加载到不同的插画文件层? 在插入图层之前,应使用单独的字体样式和大小对数据进行格式化。

CSV 数据示例:

L1,L2,L3,L4,L5,VL5,SewP,Ref,Fname,Old,VL1,VL2,VL3,VL4
2,30,00,DNP,X SHORT,XSHT,T,55L,55L_2_XSHT_T.pdf,55L_WP_SD_S_Data Set 1,UK/AUS/NZ • 2,EUR • 30,CAN/US • 00,
2,30,00,DNP,SHORT,SHT,T,55L,55L_2_SHT_T.pdf,55L_WP_SD_S_Data Set 2,UK/AUS/NZ • 2,EUR • 30,CAN/US • 00,
2,30,00,DNP,REGULAR,REG,T,55L,55L_2_REG_T.pdf,55L_WP_SD_S_Data Set 3,UK/AUS/NZ • 2,EUR • 30,CAN/US • 00,
2,30,00,DNP,MEDIUM,MED,T,55L,55L_2_MED_T.pdf,55L_WP_SD_S_Data Set 4,UK/AUS/NZ • 2,EUR • 30,CAN/US • 00,
2,30,00,DNP,LONG,LNG,T,55L,55L_2_LNG_T.pdf,55L_WP_SD_S_Data Set 5,UK/AUS/NZ • 2,EUR • 30,CAN/US • 00,
2,30,00,DNP,X LONG,XLNG,T,55L,55L_2_XLNG_T.pdf,55L_WP_SD_S_Data Set 6,UK/AUS/NZ • 2,EUR • 30,CAN/US • 00,
2,30,00,DNP,SHORT/REGULAR,SHT_REG,T,55L,55L_2_SHT_REG_T.pdf,55L_WP_SD_S_Data Set 7,UK/AUS/NZ • 2,EUR • 30,CAN/US • 00,
2,30,00,DNP,REGULAR/LONG,REG_LNG,T,55L,55L_2_REG_LNG_T.pdf,55L_WP_SD_S_Data Set 8,UK/AUS/NZ • 2,EUR • 30,CAN/US • 00,
2,30,00,DNP,LONG/X LONG,LNG_XLNG,T,55L,55L_2_LNG_XLNG_T.pdf,55L_WP_SD_S_Data Set 9,UK/AUS/NZ • 2,EUR • 30,CAN/US • 00,
4,32,0,152/176-76-84,X SHORT,XSHT,T,55L,55L_4_XSHT_T.pdf,55L_WP_SD_S_Data Set 10,UK/AUS/NZ • 4,EUR • 32,CAN/US • 0,RU • 152/176-76-84
4,32,0,152/176-76-84,SHORT,SHT,T,55L,55L_4_SHT_T.pdf,55L_WP_SD_S_Data Set 11,UK/AUS/NZ • 4,EUR • 32,CAN/US • 0,RU • 152/176-76-84

最终结果必须填写如下。

【问题讨论】:

  • 他在行动!!!
  • 我不敢相信......你甚至不接受我的回答是正确的。

标签: javascript csv adobe-illustrator windows-scripting


【解决方案1】:
// data -------------------------------------------------------------

var csv = '''L1,L2,L3,L4,L5,VL5,SewP,Ref,Fname,Old,VL1,VL2,VL3,VL4
2,30,00,DNP,X SHORT,XSHT,T,55L,55L_2_XSHT_T.pdf,55L_WP_SD_S_Data Set 1,UK/AUS/NZ • 2,EUR • 30,CAN/US • 00,
2,30,00,DNP,SHORT,SHT,T,55L,55L_2_SHT_T.pdf,55L_WP_SD_S_Data Set 2,UK/AUS/NZ • 2,EUR • 30,CAN/US • 00,
2,30,00,DNP,REGULAR,REG,T,55L,55L_2_REG_T.pdf,55L_WP_SD_S_Data Set 3,UK/AUS/NZ • 2,EUR • 30,CAN/US • 00,
2,30,00,DNP,MEDIUM,MED,T,55L,55L_2_MED_T.pdf,55L_WP_SD_S_Data Set 4,UK/AUS/NZ • 2,EUR • 30,CAN/US • 00,
2,30,00,DNP,LONG,LNG,T,55L,55L_2_LNG_T.pdf,55L_WP_SD_S_Data Set 5,UK/AUS/NZ • 2,EUR • 30,CAN/US • 00,
2,30,00,DNP,X LONG,XLNG,T,55L,55L_2_XLNG_T.pdf,55L_WP_SD_S_Data Set 6,UK/AUS/NZ • 2,EUR • 30,CAN/US • 00,
2,30,00,DNP,SHORT/REGULAR,SHT_REG,T,55L,55L_2_SHT_REG_T.pdf,55L_WP_SD_S_Data Set 7,UK/AUS/NZ • 2,EUR • 30,CAN/US • 00,
2,30,00,DNP,REGULAR/LONG,REG_LNG,T,55L,55L_2_REG_LNG_T.pdf,55L_WP_SD_S_Data Set 8,UK/AUS/NZ • 2,EUR • 30,CAN/US • 00,
2,30,00,DNP,LONG/X LONG,LNG_XLNG,T,55L,55L_2_LNG_XLNG_T.pdf,55L_WP_SD_S_Data Set 9,UK/AUS/NZ • 2,EUR • 30,CAN/US • 00,
4,32,0,152/176-76-84,X SHORT,XSHT,T,55L,55L_4_XSHT_T.pdf,55L_WP_SD_S_Data Set 10,UK/AUS/NZ • 4,EUR • 32,CAN/US • 0,RU • 152/176-76-84
4,32,0,152/176-76-84,SHORT,SHT,T,55L,55L_4_SHT_T.pdf,55L_WP_SD_S_Data Set 11,UK/AUS/NZ • 4,EUR • 32,CAN/US • 0,RU • 152/176-76-84'''

var lines = csv.split("\n");


// MAIN -------------------------------------------------------------

// make character styles
var FONT1 = make_style("font1", "ArialMT", 5.5);
var FONT2 = make_style("font2", "Verdana", 5.5);
var FONT3 = make_style("font3", "TimesNewRomanPSMT", 6.3);

// process lines
for (var i=1; i<lines.length; i++) {
    var data = get_data_from(lines[i]);
    make_layer(data.name)
    var text = make_text(data.contents);
    apply_styles(text);
    put_in_center(text);
}

// END

// functions --------------------------------------------------------

function make_style(style_name, font_name, size) {
    // try to add a new style
    try { var style = app.activeDocument.characterStyles.add(style_name) } 
    // or pick a style with the same name if it exists already
    catch(e) { var style = app.activeDocument.characterStyles.getByName(style_name) }
    style.characterAttributes.size = size;
    style.characterAttributes.textFont = textFonts.getByName(font_name);
    return style;
}

function get_data_from(line) {
    var arr = line.split(",");
    var L5    = arr[4];
    var Fname = arr[8].replace(".pdf", "");
    var VL1   = arr[10];
    var VL2   = arr[11];
    var VL3   = arr[12];
    var VL4   = arr[13];
    return {"name":Fname, "contents":[VL1, VL2, VL3, VL4, L5]};
}

function make_layer(layer_name) {
    var new_layer = app.activeDocument.layers.add();
    new_layer.name = layer_name;
}

function make_text(array) {
    var text = app.activeDocument.textFrames.add();
        text.contents = array.join("\n");
    return text;
}

function apply_styles(text) {
    // not the best piece of code, I'm sure it can be done better
    text.textRange.paragraphAttributes.justification = Justification.CENTER;

    FONT1.applyTo(text.textRange);

    var chars = text.textRange.characters;
    for (var i=0; i<chars.length; i++) {
        var ch = chars[i];
        if (ch.contents == "•") {
            FONT2.applyTo(ch);
            i++;
            i++;
            for (var j=i; j<chars.length; j++) {
                ch = chars[j];
                if (ch.contents != "\r") {
                    FONT3.applyTo(ch);
                    continue;
                }
                i=j;
                break;
            }
        }
    }
}

function put_in_center(obj) {
    var rect = app.activeDocument.artboards[0].artboardRect;
    var page_w = rect[2] - rect[0];
    var page_h = rect[1] - rect[3];
    var shift_x = page_w/2 - obj.width/2;
    var shift_y = -page_h/2 + obj.height/2;
    obj.position = [rect[0] + shift_x, rect[1] + shift_y];
}

更新

要从文件中读取 csv 数据,您需要替换这部分:

var csv = '''
...
...
... '''

与:

var csv_file = File("c:/temp/data.csv");  // <-- here is the full path to the csv file
csv_file.open("r")
var csv = csv_file.read();
csv_file.close()

如果您想通过打开对话框选择 csv 文件,也可以使用openDialog() 方法:

var csv_file = File.openDialog();
csv_file.open("r")
var csv = csv_file.read();
csv_file.close()

【讨论】:

  • 据我所知,将所有图层导出为 PDF 并不是那么简单的任务。幸运的是它已经解决了:gist.github.com/TomByrne/7816376
  • 在您回复时,我没有太多声誉将此标记为解决方案。我现在给你投票了。如果您不介意,您可以稍微调整一下代码,以便可以上传外部 csv 文件而不是嵌入文本。
  • 好的。查看我的更新
  • 可能有一些东西在野外。但具体我不知道。我只是通过例子,通过谷歌搜索了解到的。不幸的是,官方的 Adob​​e Illustrator 脚本文档远非出色。实际上,您可以在这里看到的大多数技巧都有些过时了。 Adobe 有一个新的脚本平台,看起来几乎与成熟的网络开发一样:medium.com/adobetech/…
  • 好主意。但是我的英语口语比我的写作英语还要糟糕。所以利基市场太窄了。 ) 但我会考虑的。
【解决方案2】:

据我了解,您无法处理从 .csv 解析数据的 .json 文件。这是 csv2json 的解决方案。不要忘记将此模块导入并添加到您的项目中。

祝你好运!

server.get('/api/v1/graph', async (req, res) => {
  await fs
    .createReadStream(`${__dirname}/data/mydata.csv`) // here is the directory where .csv file is situated
    .pipe(
      csv2json({
        L1: Number,
        L2: Number,
        L3: Number,
        L4: String,
// and so on => graph : Type
      })
    )
    .pipe(fs.createWriteStream('data.json'))
  res.json({ result: 'ok' })
})

【讨论】:

  • 我们不能用 illustrator Scripting 来做吗?导入csv数据并根据格式化规则格式化上述数据并生成图层的机制是什么。
  • 对不起,我想你在转换或绘制数据时遇到了麻烦,并且已经在 illusstarting 上实现了
  • 感谢您的回复。但我需要为图层部分导入和格式化。
  • 有哪位专家可以帮我解决这个问题吗?
猜你喜欢
  • 2020-10-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-30
  • 1970-01-01
  • 1970-01-01
  • 2020-07-24
  • 1970-01-01
相关资源
最近更新 更多