223 lines
5.7 KiB
JavaScript
223 lines
5.7 KiB
JavaScript
// 主函数
|
||
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(); |