Files
furbadge/兽牌.jsx

223 lines
5.7 KiB
React
Raw Permalink Normal View History

2026-07-14 21:50:46 +08:00
// 主函数
function main() {
if (app.documents.length === 0) {
alert("请先打开AI文件");
return;
}
var doc = app.activeDocument;
var csvFile = File.openDialog("选择兽牌导出.csv文件");
if (!csvFile) {
alert("未选择文件");
return;
}
// 导出目录CSV 同目录下的 pdf_export
var exportFolder = new Folder(csvFile.parent.fsName + "/pdf_export");
if (!exportFolder.exists) {
exportFolder.create();
}
// 读取CSV文件
var data = readCSV(csvFile);
if (data.length === 0) {
alert("CSV文件为空");
return;
}
var exportedCount = 0;
// 遍历每一行数据
for (var i = 0; i < data.length; i++) {
var row = data[i];
if (!row || row.length < 4) {
continue;
}
var id = row[0];
var name = row[1];
var path = row[2];
var type = row[3];
if (type !== "精英") {
continue; // 只处理精英类型
}
// 处理ID格式
var formattedId = formatId(id);
// 创建一份副本,避免连续修改原始模板
// var workDoc = doc.duplicate();
// workDoc.name = "兽牌_" + id + "_" + name;
// 填充id图层
fillLayer(doc, "id", formattedId);
// 填充name图层
fillLayer(doc, "name", name);
// 替换pic图层的图片并嵌入
if (path && path !== "") {
var imageFile = resolveImageFile(csvFile, path);
if (imageFile && imageFile.exists) {
replacePicLayer(doc, "pic", imageFile);
}
}
// 导出PDF
var pdfFileName = createPdfFileName(id, name);
var pdfFile = new File(exportFolder.fsName + "/" + pdfFileName);
exportPdf(doc, pdfFile);
// 关闭副本
// workDoc.close(SaveOptions.DONOTSAVECHANGES);
exportedCount++;
}
alert("已导出 " + exportedCount + " 个 PDF");
}
// 读取CSV文件
function readCSV(file) {
var data = [];
file.open("r");
while (!file.eof) {
var line = file.readln();
if (line) {
var cells = line.split(",");
data.push(cells);
}
}
file.close();
return data;
}
// 格式化ID"1257" -> "00 / 00 / 12 / 57"
function formatId(id) {
id = id.toString();
// 补零至4位
while (id.length < 4) {
id = "0" + id;
}
// 分割为4段每2位一段
var part1 = id.substring(0, 2);
var part2 = id.substring(2, 4);
return "00 / 00 / " + part1 + " / " + part2;
}
// 填充文本图层
function fillLayer(doc, layerName, text) {
for (var i = 0; i < doc.layers.length; i++) {
if (doc.layers[i].name === layerName) {
var layer = doc.layers[i];
for (var j = 0; j < layer.pageItems.length; j++) {
if (layer.pageItems[j].typename === "TextFrame") {
layer.pageItems[j].contents = text;
return;
}
}
}
}
}
// 解析图片路径,支持相对路径和绝对路径
function resolveImageFile(csvFile, pathValue) {
var trimmedPath = pathValue.toString().trim();
if (!trimmedPath) {
return null;
}
var candidate = new File(trimmedPath);
if (candidate.exists) {
return candidate;
}
var relativeCandidate = new File(csvFile.parent.fsName + "/" + trimmedPath);
if (relativeCandidate.exists) {
return relativeCandidate;
}
return null;
}
// 替换图层中的图片,并嵌入
function replacePicLayer(doc, layerName, imageFile) {
for (var i = 0; i < doc.layers.length; i++) {
if (doc.layers[i].name === layerName) {
var layer = doc.layers[i];
for (var j = 0; j < layer.pageItems.length; j++) {
var item = layer.pageItems[j];
if (item.typename === "PlacedItem") {
item.file = imageFile;
try {
item.embed();
} catch (e) {
// 某些版本 Illustrator 对 embed() 的支持可能不同,忽略异常
}
return;
}
}
}
}
}
// 生成 PDF 文件名id_name.pdf
function createPdfFileName(id, name) {
var safeId = id.toString();
var safeName = name.toString();
// safeName = safeName.replace(/[\\/:*?"<>|]/g, "_");
// safeName = safeName.replace(/\s+/g, "_");
// if (!safeName) {
// safeName = "未命名";
// }
return safeId + "_" + safeName + ".pdf";
}
// 导出PDF使用 PDF/X-4:2008 (Japan) 预设,并设置相关选项
function exportPdf(doc, pdfFile) {
var pdfSaveOptions = new PDFSaveOptions();
try {
pdfSaveOptions.presetName = "[PDF/X-4:2008 (Japan)]";
} catch (e) {}
try {
pdfSaveOptions.pdfPreset = "[PDF/X-4:2008 (Japan)]";
} catch (e) {}
try {
pdfSaveOptions.compatibility = PDFCompatibility.PDFX4;
} catch (e) {}
// 常规设置:从顶层图层创建 Acrobat 图层
try {
pdfSaveOptions.acrobatLayers = true;
} catch (e) {}
// 尽量关闭下采样,避免降低像素
try {
pdfSaveOptions.downsampleImages = false;
} catch (e) {}
try {
pdfSaveOptions.downsampleLinkedImages = false;
} catch (e) {}
doc.saveAs(pdfFile, pdfSaveOptions);
}
// 运行脚本
main();