(很久没更新了, 毕竟本延毕仙人又绝赞延毕了😂…)
在遇到大量数据的绘图与排版问题时, 借助脚本可以解决许多问题. 目前我主要使用 Matlab 进行数据处理绘图, 使用 Illustrator 进行排版. Illustrator 提供了一个"置入"功能, 能够将许许多多的文件一口气都放进同一个文档中, 但是如果这些文件长得很像, 放进去后分不清怎么办?
因此, 在和 GPT 谈了一会儿心后, 写了这段脚本用于批量导入文件. 这个脚本能够将选定的文件夹内部支持的文件一口气导入到一个新建的 AI 文件中, 同时在上面附上文件名, 方便后续排版. 脚本不长, 直接附在下面了.
将这个文件保存为后缀为 .jsx 的文件, 然后使用文件->脚本->其它脚本运行. 注意下面的字体名称需要是本机有的字体才行, 否则会报错.
此外, 如果需要做批量的裁边和修改文件, 也可以用 PS 的批处理方法解决.
#target illustrator
// 选择文件夹
var folder = Folder.selectDialog("请选择包含图片的文件夹");
if (!folder) exit();
// 支持的文件扩展名
var validExtensions = ['.pdf', '.png', '.tif', '.tiff', '.jpg', '.jpeg'];
// 读取文件
var imageFiles = folder.getFiles(function (f) {
if (!(f instanceof File)) return false;
var ext = f.name.slice(f.name.lastIndexOf('.')).toLowerCase();
for (var j = 0; j < validExtensions.length; j++) {
if (ext === validExtensions[j]) return true;
}
return false;
});
if (imageFiles.length === 0) {
alert("未找到图像文件");
exit();
}
// 网格参数
var columns = 6; // 每行图像数量(可调)
var cellWidth = 595;
var cellHeight = 842;
var spacingX = 50;
var spacingY = 50;
var margin = 40;
var rows = Math.ceil(imageFiles.length / columns);
// 画布尺寸自适应
var artboardWidth = columns * (cellWidth + spacingX);
var artboardHeight = rows * (cellHeight + spacingY);
// 创建文档和图层
var doc = app.documents.add(DocumentColorSpace.RGB);
doc.artboards[0].artboardRect = [0, artboardHeight, artboardWidth, 0];
var labelLayer = doc.layers.add();
labelLayer.name = "Labels";
// 主循环:插图+标注
for (var i = 0; i < imageFiles.length; i++) {
var file = imageFiles[i];
var filename = decodeURI(file.name.replace(/\.[^\.]+$/, "")); // 去除扩展名
// 网格位置
var col = i % columns;
var row = Math.floor(i / columns);
var originX = col * (cellWidth + spacingX);
var originY = artboardHeight - (row + 1) * (cellHeight + spacingY);
// 每个文件单独图层
var layer = doc.layers.add();
layer.name = filename;
doc.activeLayer = layer;
try {
// 插入图像
var placed = doc.placedItems.add();
placed.file = file;
// 缩放
var maxW = cellWidth - 2 * margin;
var maxH = cellHeight - 2 * margin;
var scale = Math.min(maxW / placed.width, maxH / placed.height, 1.0);
placed.width *= scale;
placed.height *= scale;
// 对齐左下角锚点
var posX = originX + (cellWidth - placed.width) / 2;
var posY = originY + (cellHeight - placed.height) / 2;
placed.position = [posX, posY];
placed.embed();
// 添加标签文本
doc.activeLayer = labelLayer;
var text = doc.textFrames.add();
text.contents = filename;
text.textRange.characterAttributes.size = 10;
text.textRange.characterAttributes.textFont = app.textFonts.getByName("Helvetica");
text.paragraphs[0].justification = Justification.LEFT;
// 放置于图像下方
text.position = [posX, posY - 20];
} catch (e) {
alert("处理失败:" + file.name + "\n" + e);
}
}
alert("成功导入 " + imageFiles.length + " 个图像文件!");