Files
furbadge/兽牌.jsx
2026-07-14 21:50:46 +08:00

223 lines
5.7 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// 主函数
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();