上传文件至「/」
This commit is contained in:
223
兽牌.jsx
Normal file
223
兽牌.jsx
Normal file
@@ -0,0 +1,223 @@
|
||||
// 主函数
|
||||
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();
|
||||
Reference in New Issue
Block a user