[ID CS4-CS6] Объединение документов из одной книги в один файл

Статус
Закрыто для дальнейших ответов.

Pago_indd

Участник
Топикстартер
Сообщения
6
Реакции
1
Всем привет :)
На текущей работе после верстки номера журнала, все файлы из книги сливаются в один.
Требуется аналогичную работу выполнить скриптом JS.
Руками это решается перетягиванием страниц из файла в файл или через меню Layout -> Pages -> Move Pages...
При написании скрипта столкнулся с проблемой, что скрипт, выполняя аналогичную работу, смещает фреймы на странице на фиксированные величины, кроме фреймов на мастерах, но разные для четных и нечетных полос.
Я решил эту проблему сливая файлы не страницами, а разворотами, но тогда не сохраняются линки между текстовыми фреймами.
Вот упрощенная часть скрипта:

Код:
var myBookContents = app.books[0].bookContents;
app.open(myBookContents[0].fullName, true);
for (var x = 1; x < myBookContents.length; x++) {
    app.open(myBookContents[x].fullName, true);
    var myDoc = app.activeDocument;
    var myGreen = app.documents[1];
    var myPages = myDoc.pages.itemByRange (0, -1);
    //var myPages = myDoc.spreads.itemByRange (0, -1);
    //var myTarget = myGreen.spreads[-1];
    var myTarget = myGreen.pages[-1];
    myPages.duplicate(LocationOptions.AFTER, myTarget);
    document.close();
}
Работает корректно при симметричных полях (внешнее и внутреннее), сохраняется связь всех текстовых фреймов.
Корректно и без смещений работает, если сливать через spreads, но тогда связь между текстовыми фреймами остается только в рамках разворота.

Есть ли скрипт, который сливает файлы не нарушая связи текстовых фреймов и не создавая смещений?
 
Последнее редактирование модератором:

Eugenyus

12 лет на форуме
Сообщения
1 960
Реакции
3 589
скрипт, выполняя аналогичную работу, смещает фреймы на странице на фиксированные величины, кроме фреймов на мастерах, но разные для четных и нечетных полос.
Если это вся проблема, то, возможно, будет проще доработать скрипт, чтобы он выравнивал смещённые фреймы.
Над этой темой бились несколько лет назад, но, по-моему, ничего толкового так и не изобрели.
Комментарий модератора: Для размещения кода используйте тег code.
 

Pago_indd

Участник
Топикстартер
Сообщения
6
Реакции
1
Eugenyus, спасибо за внимание, обязательно учту ваши замечания
С указанной вами темой я ознакомился, но надеялся, что может быть кто-то нашел решение или что-то обновили/пофиксили.
По теме, может быть есть возможность скриптом вызывать меню Layout -> Pages -> Move Pages, это тоже бы ускорило и облегчило работу.

P.S. Решение со смещением фреймов возможно, но снижает надежность работы скрипта, плюс в верстке используются врезки, фото и другие отдельно стоящие элементы
 

Oleg Butrin

20 лет на форуме
Сообщения
1 990
Реакции
1 213
Код:
#target indesign

// Пример скрипта для копирования страниц из одного документа в другой.
// Проверен только на двухстраничных разворотах.

var dest = app.documents[0]; // активный документ, КУДА добавляются страницы
var source = app.documents[1]; // неактивный документ, ОТКУДА берутся страницы

// если конечная страница dest на той же стороне, что первая страница source, добавляем одну страницу в dest
if (dest.pages.lastItem().getElements()[0].side == source.pages[0].getElements()[0].side) {
        dest.pages.add(LocationOptions.AFTER, dest.pages.lastItem())
}
//копирование всех страниц одновременно позволяет не разбивать связанные фреймы
source.pages.everyItem().duplicate(LocationOptions.AFTER, dest.pages.lastItem())
 

Pago_indd

Участник
Топикстартер
Сообщения
6
Реакции
1
Код:
#target indesign
// Пример скрипта для копирования страниц из одного документа в другой.
// Проверен только на двухстраничных разворотах.
Хорошая попытка, но к сожалению у нее есть недостаток — корректно работает только с документами с симметричными полями, иначе дает разное смещение по оси Х вправо для четных и нечетных полос.
Похоже это недостаток метода duplicate.
 

Oleg Butrin

20 лет на форуме
Сообщения
1 990
Реакции
1 213
Хорошая попытка, но к сожалению у нее есть недостаток — корректно работает только с документами с симметричными полями, иначе дает разное смещение по оси Х вправо для четных и нечетных полос.
Пример -- он для того, чтобы показать, как страницы переносятся без смешивания spread и без обрыва текстовых связей.
Кто мешает творчески развить маленький пример, например, вот так:
Код:
#target indesign

var lbl = 'com.rudtpru.pagemove'

// Пример скрипта для копирования страниц из одного документа в другой.
// Проверен только на двухстраничных разворотах.

function getPIPosition (pi) { //сохраняет позицию pageItem относительно page.margin
    var page = pi.parentPage;
    if (!page) {
        return false;
    }
    var point = [
        page.bounds[0] - page.marginPreferences.top,
        page.bounds[1] - page.marginPreferences.left
    ];
    var bounds = pi.geometricBounds;
    var relative = [ bounds[0] - point[0], bounds[1] - point[1] ];
    pi.insertLabel(lbl, relative.toSource())
}

function setPIPosition (pi) { //восстанавливает позицию pageItem относительно page.margin
    var page = pi.parentPage;
    if (!page) {
        return false;
    }
    var position = eval(pi.extractLabel(lbl));
    if (position == 'undefined' || position.constructor.name != 'Array') {
        return false;
    }
    var point = [
        page.bounds[0] - page.marginPreferences.top,
        page.bounds[1] - page.marginPreferences.left
    ];
    pi.move( [ point[1] + position[1], point[0] + position[0] ] );
}

function savePIPositions (pages) { //сохраняет позицию всех pageItem
    for (var i = 0; i < pages.length; i++) {
        var page = pages[i];
        for (var j = 0; j < page.pageItems.length; j++) {
            getPIPosition(page.pageItems[j]);
        }
    }
}

function restorePIPositions (pages) { //восстанавливает позицию всех pageItem
    for (var i = 0; i < pages.length; i++) {
        var page = pages[i];
        for (var j = 0; j < page.pageItems.length; j++) {
            setPIPosition(page.pageItems[j]);
        }
    }
}

function main () {
    var dest = app.documents[0]; // активный документ, КУДА добавляются страницы
    var source = app.documents[1]; // неактивный документ, ОТКУДА берутся страницы

    savePIPositions(source.pages)

    // если конечная страница dest на той же стороне, что первая страница source, добавляем одну страницу в dest
    if (dest.pages.lastItem().getElements()[0].side == source.pages[0].getElements()[0].side) {
        dest.pages.add(LocationOptions.AFTER, dest.pages.lastItem())
    }
    //копирование всех страниц одновременно позволяет не разбивать связанные фреймы
    var pages = source.pages.everyItem().duplicate(LocationOptions.AFTER, dest.pages.lastItem());

    restorePIPositions(pages);
}

main();
 

Pago_indd

Участник
Топикстартер
Сообщения
6
Реакции
1
Нашел максимально простое решение проблемы, без лишних телодвижений.
Для сохранения линков во фреймах многостраничного документа и переноса всех страниц надо использовать следующий метод:

Код:
var myDoc = app.activeDocument;
var myPages = myDoc.pages.itemByRange (0, -1); //все страницы документа от первой до последней.

Далее для переноса используем метод:
Код:
var myTarget = myGreen.pages[-1]; //последняя страница документа, в который подливаются страницы
                myPages.duplicate(LocationOptions.AFTER, myTarget); //локацию можно поменять на В КОНЕЦ

А теперь секретный ингредиент: перед тем, как собрать страницы в переменную myPages, необходимо поменять размеры полей документа (проще всего задать поля нулевые). При этом правильные значения полей можно сохранить в переменные. И после слияния документов восстановить значения полей. Что в принципе не сложно сделать с помощью метода .marginPreferences.
Если тему в ближайшее время не закроют, а скрипт будет работать корректно, то я его обязательно выложу.
 

Pago_indd

Участник
Топикстартер
Сообщения
6
Реакции
1
Добрый вечер
Для пользователей CS5 (может быть и для CS6)
Представляю скрипт для слияния файлов книги в один файл.

Принцип работы
1. Запустите программу и откройте файл книги, запустите скрипт.
2. Скрипт откроет первый файл книги и сохранит его в туже директорию используя имя файла книги. (убедитесь, что у вас нет файла с именем книги и расширением indd, иначе скрип перезапишет файл без вопросов). Если измените код, то можно будет вручную выбрать директорию и имя файла.
3. Далее скрипт запомнит установки полей первого документа.
4. Далее последовательно будут открываться файлы из книги, изменяться поля, страницы переносится в новый файл.
5. На заключительном этапе, поля во всем файле будут изменены согласно полям из первого файла.

Ошибки
Если в издании используются нестандартные значения колонок, то они слетят. Это можно исправить, если индивидуализировать скрипт.

P.S. Если кто воспользуется моим способом слияния файлов книги, буду признателен за комментарии и замечания. Особенно, за обнаруженные ошибки.

Скрипт
Код:
if (app.documents.length == 0 && app.books.length != 0) {
    var myBookContents = app.books[0].bookContents;
    if (myBookContents.length > 0) {
        app.open(myBookContents[0].fullName, true);
        //сохранение файла с использованием имени файла книги
        var myFileNewName = app.books[0].fullName + "";
        if (myFileNewName.indexOf(".indb") != -1) {
            var myRegularExpression = /.indb/gi;
            myFileNewName = myFileNewName.replace(myRegularExpression, ".indd");
        }
        app.activeDocument.save(File(myFileNewName), true);
        //сохраняем значения полей
        var myMarginTop = app.activeDocument.pages.item(0).marginPreferences.top;
        var myMarginLeft = app.activeDocument.pages.item(0).marginPreferences.left;
        var myMarginRight = app.activeDocument.pages.item(0).marginPreferences.right;
        var myMarginBottom = app.activeDocument.pages.item(0).marginPreferences.bottom;
        //подлив файлов из книги
        for (var x = 1; x < myBookContents.length; x++) {
            app.open(myBookContents[x].fullName, true);
            var myDoc = app.activeDocument;
            var myGreen = app.documents[1];
            if (myDoc.pages.length > 0) {
                for (var z = 0; z < myDoc.pages.length; z++) {
                    var myMarginZero = myDoc.pages[z];
                    myMarginZero.marginPreferences.top = 0;
                    myMarginZero.marginPreferences.left = 0;
                    myMarginZero.marginPreferences.right = 0;
                    myMarginZero.marginPreferences.bottom = 0;
                }
            }
            var myPages = myDoc.pages.itemByRange(0, -1);
            var myTarget = myGreen.pages[-1];
            myPages.duplicate(LocationOptions.AFTER, myTarget);
            document.close(SaveOptions.NO);
        }
        //восстановление значений полей в общем файле
        var myDoc = app.activeDocument;
        if (myDoc.pages.length > 0) {
            for (var m = 0; m < myDoc.pages.length; m++) {
                var myNewMargin = myDoc.pages[m];
                myNewMargin.marginPreferences.top = myMarginTop;
                myNewMargin.marginPreferences.left = myMarginLeft;
                myNewMargin.marginPreferences.right = myMarginRight;
                myNewMargin.marginPreferences.bottom = myMarginBottom;
            }
        }
        alert ("ГОТОВО");
    }
} else if (app.documents.length && app.books.length != 0) {
    alert("Закройте все документы, кроме файла книги");
} else if (app.documents.length != 0 && app.books.length == 0) {
    alert("Закройте все документы и откройте файл книги");
} else {
    alert("Откройте файл книги");
}
 
Последнее редактирование:
  • Спасибо
Реакции: Eugenyus

Pago_indd

Участник
Топикстартер
Сообщения
6
Реакции
1
@Eugenyus, привет
А можно ли мой последний пост со скриптом перенести на место первого?
Заранее спрасибо
 

Eugenyus

12 лет на форуме
Сообщения
1 960
Реакции
3 589
Последнее редактирование:

George

I wish I was a monster you think I am
15 лет на форуме
Сообщения
17 323
Реакции
7 870
Статус
Закрыто для дальнейших ответов.