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