Основные операции с документом
Создание нового документа
Новый документ создается при помощи метода documents.add()
var myDocument = app.documents.add(); |
Создание нового документа на основе Preset
Как известно, в Индизайне набор свойств открываемого документа можно сохранять в Preset, чтобы потом, при создании нового такого же документа, не вводить снова все данные, а загрузить их одним махом.
Открыть новый документ на основе присета позволяет и скрипт Индизайна.
//Создание нового документа на основе preset. //Замените "myDocumentPreset" во второй строке на тот, который хотите использовать. var myDocument = app.documents.add(true, app.documentPresets.item("myDocumentPreset")); |
Создание скрытого документа
Вы можете создать новый документ без отображения его в окне, так называемый «скрытый, спрятанный» документ, документ без окна. (Hidden document). Заметьте, что скрытый документ, и документ, минимизированный в трэй — это не одно и то же. Особенностью скрытых документов является то, что некоторые скриптовые операции в них выполняются намного быстрее.
//Создание нового документа без отображения его в окне. //Первый параметр (showingWindow) управляет видимостью документа. var myDocument = app.documents.add(false); |
Чтобы потом отобразить документ, сделать его видимым, надо «дать» ему окно.
var myWindow = myDocument.windows.add(); |
Открытие документа
Открытие документа производится при помощи метода open()
app.open(File("c:\myTestDocument.indd")); |
При открытии вы можете предотвратить отображение документа, устанавливая параметр показа окна в методе open в положение «Ложь» (false). По умолчанию это значение равно Истине (True). Для отображения скрытого документа создают новое окно, как показано на скрипте ниже:
//Открытие документа без его отображения. var myDocument = app.open(File("c:/myTestDocument.indd"), false); //После этого вы могли бы что-то еще сделать с документом без показа его в окне. //При этом скрипт будет быстрее выполняться, если окно документа невидимо. //Создём новое окно, когда документ необходимо будет отобразить. var myLayoutWindow = myDocument.windows.add(); |
Сохранение документа
// Если есть несохраненные изменения в документе — сохранить документ: if(app.activeDocument.modified == true) { app.activeDocument.save(); } |
Метод save имеет два необязательных параметра:
первый — это имя файла для сохранения,
второй — признак темплета: устанавливается как True, если надо сохранить файл как темплет (шаблон).
Если активный документ всё ещё не сохранен, сохраняем его. При этом, если документ еще не имеет имени, (т.е. ни разу не сохранялся), то Индизайн отобразит диалоговое окно записи файла.
if(app.activeDocument.saved == false){ app.activeDocument.save(new File("/c/myTestDocument.indd"));} |
Вы можете сохранить документ как темплет (шаблон):
//Сохранить активный документ как темплет. var myFileName; // Если документ был сохранен, то пересохраняем его как темплет: if(app.activeDocument.saved == true) { //Преобразование имени файла в строку. myFileName = app.activeDocument.fullName + ""; //Если имя файла содержит расширение ".indd", изменяем его на ".indt". if(myFileName.indexOf(".indd") != -1) { var myRegularExpression = /.indd/gi myFileName = myFileName.replace(myRegularExpression, ".indt"); } } //Если документ не был сохранен, задаем явно путь/имя файла. else { myFileName = "/c/myTestDocument.indt"; } app.activeDocument.save(File(myFileName), true); |
Закрытие документа
Документ закрывается при помощи метода close
app.activeDocument.close(); |
или можно было написать так:
app.documents.item(0).close(); |
Метод close может содержать два необязательных параметра. Первый параметр, SaveOption, может принимать значения
SaveOptions.yes — для сохранения документа;
SaveOptions.no — для закрытия документа без сохранения;
SaveOptions.ask — для вывода диалога.
Если вы используете SaveOptions.yes то иногда нужно бывает указывать второй параметр о записываемом файле — SavingIn
Пример скрипта:
if(app.activeDocument.saved != true) { app.activeDocument.close(SaveOptions.ask); //Или для записи с указанием имени файла //var myFile = File("/c/myTestDocument.indd"); //app.activeDocument.close(SaveOptions.yes, myFile); } else { //Если файл уже был сохранен под каким-то именем app.activeDocument.close(SaveOptions.yes); } |
Закрыть все открытые документы без сохранения можно при помощи цикла:
for(myCounter = app.documents.length; myCounter > 0; myCounter--){ app.documents.item(myCounter-1).close(SaveOptions.no); } |
Или при помощи этой функциии:
// Saves and closes all open documents. function closeDocuments () { var docs = app.documents; while (docs.lenght > 0) { var doc = docs.firstItem(); doc.close(SaveOptions.YES); } } |
Или еще проще:
app.documents.everyItem().close(SaveOptions.NO); |
Приведем функцию по закрытию документов, которая может работать не только в Индизайне, но и в Фотошопе и Иллюстраторе
/* Close all documents with saving for Photoshop, Illustrator, InDesign */ switch(app.name){ case "Adobe Photoshop": case "Adobe Illustrator": while (app.documents.length > 0){ try { app.activeDocument.close(SaveOptions.SAVECHANGES); // if document has not saved yet, saving dialog appear } catch(e){ // if saving dialog was canceled alert("saving document was canceled by user"); break; } } break; case "Adobe InDesign": while (app.documents.length > 0){ try { app.activeDocument.close(SaveOptions.yes); // if document has not saved yet, saving dialog appear } catch(e){ // if saving dialog was canceled alert("Saving document was canceled by user"); break; } } break; } |
Параметры нового документа
Вы помните, что при создании нового документа требуется задать достаточно большое количество его свойств, таких как размеры страницы, их ориентация, расстояния от текста до краев и т.п. Вот как выглядит диалоговое окно создания нового документа в InDewsign CS5.5:
Эти параметры задаются при помощи настроек documentPreferences
var myDocument = app.documents.add(); with(myDocument.documentPreferences){ // Создавать или не создавать masterTextFrame (основной текстовый фрейм)? masterTextFrame = false; // - не создаем. Если masterTextFrame = true, то он будет создаваться // Создавать документ разворотами? (да/нет) facingPages = true; // при true документ будет создан разворотами, при false - из отдельных страниц // Высота и ширина страницы pageHeight = "800pt"; pageWidth = "600pt"; // Ориентация страниц - книжная или альбомная pageOrientation = PageOrientation.landscape; // или pageOrientation = PageOrientation.portrait; // Число страниц в создаваемом документе pagesPerDocument = 16; // Номер начальной страницы startPageNumber = 1; // Этот параметр лежит в пределах 1-999999. //Предназначение документа: для WEB или для печати (типографии) intent = DocumentIntentOptions.PRINT_INTENT; // или intent = DocumentIntentOptions.WEB_INTENT; } |
Как вариант, можно не задавать высоту и ширину страниц pageHeight и pageWidth, а использовать свойство pageSize
... pageSize = "A4"; ... |
Задание параметров нового документа можно производить и при помощи свойства properties
var d = app.documents.add(); // create a new document d.documentPreferences.properties= {pageWidth:800pt,pageHeight:600pt}; |
Размеры pageHeight и pageWidth можно задавать как числами, так и строками. В отличие от них свойство pageSize может быть только строкой, причем такой, какую «знает» Индизайн. Это A4, A5, Letter, Legal и т.д.
Кроме этих параметров при помощи настроек documentPreferences задаются выпуск за обрез (Bleed) и служебное поле (Slug).
Но сначала несколько слов о свойстве documentBleedUniformSize. Оно может принимать значения true (true установлено по умолчанию) или false. Если оно установлено как true, то нет нужды задавать все четыре параметра выпуска за обрез, достаточно указать только верхний, а остальные три автоматически установятся такими же.
with(myDocument.documentPreferences){ //Bleed documentBleedUniformSize = true; documentBleedTopOffset = "2p"; } |
Если свойство documentBleedUniformSize установлено как false, то в скрипте надо задавать все четыре параметра выпуска за обрез:
var myDocument = app.documents.add(); myDocument.documentPreferences.documentBleedUniformSize = false; myDocument.documentPreferences.documentBleedBottomOffset = "5mm"; // снизу myDocument.documentPreferences.documentBleedTopOffset = "10mm"; // сверху myDocument.documentPreferences.documentBleedInsideOrLeftOffset = "5mm"; // внутренний или левый выпуск myDocument.documentPreferences.documentBleedOutsideOrRightOffset = "5mm"; // внешний или правый выпуск |
В этом примере использован несколько иной способ программирования, без использования оператора with.
Значения выпусков могут задаваться строками (как в примере) и числами.
Вам могут показаться странными названия свойств documentBleedOutsideOrRightOffset (внешний или правый выпуск) и documentBleedInsideOrLeftOffset (внутренний или левый выпуск). А вы откройте а Индизайне диалоговое окно создания нового документа, нажмите кнопку More Option для показа Bleed-параметров и пощелкайте на параметре Facing Pages (Разворот), ставя и убирая птичку и наблюдая изменения в названиях Bleed-параметров. Всё сразу станет на свои места.
Служебное поле (Slug) точно так же как и выпуск за обрез задается четырьмя параметрами — slugTopOffset, slugBottomOffset, slugInsideOrLeftOffset и slugRightOrOutsideOffset. Существует также свойство documentSlugUniformSize, которое действует аналогично свойству documentBleedUniformSize.
Фирма Adobe в своих демонстрационных примерах приводит следующий программный код по установке размеров Bleed- и Slug-областей:
var myDocument = app.documents.add(); //The bleed and slug properties belong to the documentPreferences object. with(myDocument.documentPreferences){ //Bleed documentBleedBottomOffset = "3p"; documentBleedTopOffset = "3p"; documentBleedInsideOrLeftOffset = "3p"; documentBleedOutsideOrRightOffset = "3p"; //Slug slugBottomOffset = "18p"; slugTopOffset = "3p"; slugInsideOrLeftOffset = "3p"; slugRightOrOutsideOffset = "3p"; } |
Экспорт документа
Экспорт документа в IDML
Приведем в качестве примера функцию, которая выполняет экспорт всех открытых документов в IDML или в INX, в зависимости от того, в какой версии работает пользователь
(function(){ var docs = app.documents; if(docs.length===0)return; // цикл по всем открытым документам for(var i=0,len=docs.length;i++){ var idmlFile = new File(docPath.split('.')[0]+'.idml'); doc.exportFile(ExportFormat.INDESIGN_MARKUP,idmlFile); }else{ var idmlFile = new File(docPath.split('.')[0]+'.inx'); doc.exportFile(ExportFormat.INDESIGN_INTERCHANGE,idmlFile); } }; alert('OK'); |
docPath = doc.fullName.absoluteURI — определяется полный путь файла в URI нотификации (Uniform Resource Identifier или унифицированный (единообразный) идентификатор ресурса). Проще говоря, мы получаем полный путь файла в универсальном формате, который не зависит от платформы МАС или РС.
выражением app.version определяется номер версии Индизайна;
parseInt(app.version) — округление номера версии до целого числа
docPath.split(‘.’) — функция split разделяет полный путь по точке, возвращая массив из двух членов. первый член — это путь без расширения файла, второй член — расширение файла. Добавление к этой конструкции [0] позволяет взять первый член массива, путь без расширения.
+ «idml» и + «inx» — к пути и имени файла без расширения прибавляется новое расширение файла.
Наша функция экспорта в idml в большинстве случаев сработает правильно. Но тут есть маленькая засада. Мы предполагаем, что переменная docPath у нас такого типа: \d\Foder1\Folder2\myFileName.indd, т.е. содержит только одну точку и деление split (‘.’) выдаст нам верный результат. Но что, если в пути точек больше одной? Например, \d\V.A.Shirokov\vzitki\viz5.indd. Что произойдёт? Для профессионального результата нам надо делить путь по последней точке. Это можно сделать, например, таким способом:
var idmlFile = new File(docPath.substring(0, docPath.lastIndexOf('.'))+'.idml); |
Еще можно разделить docPath на части по точке (всё тот же split(‘.’)), затем откусить конец массива методом pop() и снова соединить массив в строку методом join(). Варианты есть.
Вот, спасибо! С самого начала. Может начну сам скрипты писать. Продолжайте, пож-та.
Хоть материал и не новый, но реально помог накидать скриптик по смене блида. Спасибо!