Как заменить графику данным файлом в 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 и сравнивать идентификаторы?


person Josef says Reinstate Monica    schedule 11.08.2015    source источник


Ответы (2)


itemByID — это метод, доступный для всех pageItems, а textFrames и rectangles являются подклассами pageItem. Таким образом, у вас есть доступ к этому методу из обоих, и он даст тот же результат. Вы также должны иметь возможность использовать doc.rectangles.itemByID. См.: http://www.indesignjs.de/extendscriptAPI/indesign11/#Rectangles.html#d1e201999__d1e202138

Но вы правы, что описание немного сбивает с толку, там сказано:

Возвращает TextFrame с указанным идентификатором.

что явно не так. Если у вас уже есть идентификаторы, на которые вы хотите настроить таргетинг, вы можете использовать doc.pageItems.itemByID, что, возможно, менее запутанно, поскольку в основном вы ищете pageItems при использовании itemByID.

Что касается fitting options, они являются свойством вашего прямоугольного объекта, поэтому размещение нового изображения не должно изменять параметры подгонки. Если вы хотите сохранить то же самое, просто удалите вызовы fit(). См. в списке свойств Rectangle, frameFittingOptions: http://www.indesignjs.de/extendscriptAPI/indesign11/#Rectangle.html

person Julien Grégoire    schedule 12.08.2015
comment
как узнать ID изображения, которое нужно изменить? Или как мы можем определить это? - person pimguilherme; 05.11.2019

Йозеф,

У меня была такая же проблема с 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);
    }
}
person Crispy    schedule 13.08.2015