Заметки кодящего дизайнера

Как автоматизировать подготовку в печать .ai-макетов

Делюсь скриптом, который принимает на вход файлы в формате .ai, разбирает текст на кривые, конвертирует в cmyk и после сохраняет в .ai, .eps и .pdf.

Для работы я создал директорию files-for-print, внутри разместил ещё две папки: _src и result.

Перед началом работы я помещаю макеты в формате .ai в папку _src. Далее скрипт:

  1. открывает каждый файл;
  2. конвертирует его в цветовое пространство CMYK;
  3. разбирает на кривые все текстовые объекты;
  4. создаёт в папке result поддиректорию с именем содержащим текущую дату и время;
  5. сохраняет в созданную папку изменённый файл;
  6. делает копии в форматах .eps и .pdf.

А вот, собственно, сам скрипт со всеми комментариями.

/* Путь к исходной и результирующей папкам */
var srcFolderPath = "/Path/To/files-for-print/_src/";
var destFolderRootPath = "/Path/To/files-for-print/result/";

/* Получение текущей даты и времени для имени папки */
function getCurrentTimestamp() {
  var now = new Date();
  return (
    now.getFullYear() +
    "-" +
    ("0" + (now.getMonth() + 1)).slice(-2) +
    "-" +
    ("0" + now.getDate()).slice(-2) +
    "--" +
    ("0" + now.getHours()).slice(-2) +
    "-" +
    ("0" + now.getMinutes()).slice(-2) +
    "-" +
    ("0" + now.getSeconds()).slice(-2)
  );
}

/* Создание новой папки для сохранения файлов */
function createFolder(path) {
  var folder = new Folder(path);
  if (!folder.exists) {
    folder.create();
  }
  return folder;
}

/* Преобразование текстовых объектов в кривые */
function outlineText(doc) {
  var textFrames = doc.textFrames;
  for (var i = textFrames.length - 1; i >= 0; i--) {
    textFrames[i].createOutline();
  }
}

/* Конвертация цветового пространства в CMYK */
function convertToCMYK(doc) {
  if (doc.documentColorSpace === DocumentColorSpace.RGB) {
    doc.documentColorSpace = DocumentColorSpace.CMYK;
  }
}

/* Обработка файлов */
function processFiles() {
  var srcFolder = new Folder(srcFolderPath);
  if (!srcFolder.exists) {
    alert("Исходная папка не найдена: " + srcFolderPath);
    return;
  }

  var files = srcFolder.getFiles("*.ai");
  if (files.length === 0) {
    alert("В папке нет файлов формата .ai");
    return;
  }

  var destFolderName = getCurrentTimestamp();
  var destFolder = createFolder(destFolderRootPath + destFolderName);

  for (var i = 0; i < files.length; i++) {
    var file = files[i];
    if (!(file instanceof File)) continue;

    var doc = app.open(file);

    /* Конвертация в CMYK и разбивка текста на кривые */
    convertToCMYK(doc);
    outlineText(doc);

    /* Сохранение в форматах AI, EPS, PDF */
    var baseFileName = file.name.replace(/\.ai$/, "");

    /* Сохранение AI */
    var aiOptions = new IllustratorSaveOptions();
    var aiFile = new File(destFolder + "/" + baseFileName + ".ai");
    doc.saveAs(aiFile, aiOptions);

    /* Сохранение EPS */
    var epsOptions = new EPSSaveOptions();
    epsOptions.compatibility = Compatibility.ILLUSTRATOR17;
    epsOptions.embedLinkedFiles = true;
    epsOptions.includeDocumentThumbnails = true;
    epsOptions.overprint = PDFOverprint.PRESERVEPDFOVERPRINT;
    var epsFile = new File(destFolder + "/" + baseFileName + ".eps");
    doc.saveAs(epsFile, epsOptions);

    /* Сохранение PDF */
    var pdfOptions = new PDFSaveOptions();
    pdfOptions.compatibility = PDFCompatibility.ACROBAT8;
    pdfOptions.preserveEditability = false;
    var pdfFile = new File(destFolder + "/" + baseFileName + ".pdf");
    doc.saveAs(pdfFile, pdfOptions);

    /* Закрытие файла без сохранения изменений */
    doc.close(SaveOptions.DONOTSAVECHANGES);
  }

  alert("Обработка завершена! Файлы сохранены в: " + destFolder.fsName);
}

/* Запуск скрипта */
processFiles();