Как заменить изображение с данным файлом в InDesign через скрипт?
Мне нужно заменить некоторые изображения в документе InDesign на данный файл. Это происходит с использованием сервера InDesign, но сценарии практически такие же, как и в обычном InDesign, за исключением того, что взаимодействие с пользователем невозможно.
У меня есть документ InDesign, идентификатор прямоугольника, содержащего некоторое изображение, и путь к новому изображению, которое должно заменить изображение.
Изображение должно быть заменено, но настройки, такие как FitOptions и т. Д., Должны оставаться такими же. Кроме того, новый файл должен быть встроен в документ InDesign. Уже есть код, который работает:
function changeImages(doc) {
var arrayLength = changeImage.length;
for (var i = 0; i < arrayLength; i++) {
var fr = doc.textFrames.itemByID(1 * changeImage[i].id);
if (!fr)
continue;
var file = File(imagePath + changeImage[i].file);
fr.place(file);
fr.fit (FitOptions.CONTENT_TO_FRAME);
fr.fit (FitOptions.PROPORTIONALLY);
fr.fit (FitOptions.CENTER_CONTENT);
}
}
Это не кажется правильным. Почему он использует doc.textFrames
когда объект представляет собой прямоугольник? Я на самом деле запутался, это даже работает.
Также он просто устанавливает некоторые FitOptions, но я хочу сохранить существующие.
Я очень плохо знаком со сценариями InDesign, поэтому я заблудился здесь. Я читаю документы и другие ресурсы, но я в замешательстве. например, почему там doc.textFrames.itemByID
но ничего подобного для других фреймов? Должен ли я повторить doc.allPageItems
и сравнить идентификаторы?
2 ответа
itemByID
метод доступен для всех pageItems
и оба textFrames
а также rectangles
являются подклассом pageItem. Таким образом, у вас есть доступ к этому методу из обоих, и он даст тот же результат. Вы должны быть в состоянии использовать doc.rectangles.itemByID
также. См.: http://www.indesignjs.de/extendscriptAPI/indesign11/.
Но вы правы, что описание немного сбивает с толку, оно говорит:
Возвращает TextFrame с указанным идентификатором.
что, очевидно, не так. Если у вас уже есть идентификаторы, на которые вы хотите настроить таргетинг, вы можете использовать doc.pageItems.itemByID
что может быть менее запутанным, так как в основном вы ищете pageItems
при использовании itemByID.
Что касается fitting options
они являются свойством вашего прямоугольного объекта, поэтому размещение нового изображения не должно изменять параметры подгонки. Если вы хотите сохранить то же самое, просто удалите вызовы fit()
, Смотрите в списке свойств Rectangle
, frameFittingOptions
: http://www.indesignjs.de/extendscriptAPI/indesign11/
Josef,
У меня была такая же проблема с InDesign CS4 с сохранением оригинальных FitOptions. Я так и не смог понять, как получить настройки, используемые в настоящее время в InDesign CS4.
Чтобы обойти проблему, я установил значение в " Подгонка пустого фрейма" в параметрах "Подгонка фрейма" в документе InDesign.
Затем в коде я использовал эту настройку, что-то вроде этого:
changeImages (app.activeDocument);
function changeImages(doc)
{
with(doc)
{
var rec = doc.rectangles.itemByID(207);
var file = new File("c:\\new_image.png");
rec.place(file);
rec.fit(rec.frameFittingOptions.fittingOnEmptyFrame);
}
}