Избранное »

22.09.2014 – 07:27 | 2 комментария | 8 137 views

Здравствуйте все, кто работает в Индизайне!
Извещаем вас о том, что на youtube.com начал работу канал «InDesign Мастерская вёрстки». Там уже размещены более 60 видео с полным описанием как работать с программой DoTextOK. Другие интересные темы, касающиеся работы …

Читать полностью »
Работа в InDesign

Хитрости и секреты, приемы работы, уроки

Новая версия!

Особенности новой версии Индизайна

Плагины

Описание плагинов, информация о плагинах для работы с Adobe InDesign

Скрипты

Готовые к использованию скрипты для Adobe InDesign

Скриптинг

Описание языка, приёмов и методов программирования для Adobe InDesign

Home » Скриптинг

JavaScript: aвтоматическое добавление страниц

Добавлено на 23.10.2009 – 15:5811 комментариев | 362 views

— Как организовать автоматическое добавление страниц в документ, если текст не помещается во фрейме?

После заполнения текстового фрейма содержимым, например из файла, вызываем эту функцию, которая добавляет новые страницы в конец документа с текстовыми фреймами на них.

Новые страницы с фреймами генерируются до тех пор, пока параметр overset перестанет быть истиной. При помощи функции myGetBounds(doc, pg) рассчитываются координаты и размеры фреймов (текст функции не приводится).

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
function AutoFlowDocument(doc, textFrame)
{
var overset = textFrame.overflows;
var prevFrame = textFrame;
 
while(overset)
{
var pg = doc.pages.add(LocationOptions.AT_END);
var newFrame = pg.textFrames.add();
 
with(newFrame) // задаем размеры и другие нужные нам свойства нового фрейма, например:
{
var myBounds = myGetBounds(doc, pg);
geometricBounds = myBounds;
textFramePreferences.textColumnCount = 3;
textFramePreferences.textColumnGutter = 12;
textFramePreferences.insetSpacing = [12, 0, 12, 0];
}
prevFrame.nextTextFrame = newFrame;
overset = newFrame.overflows;
prevFrame = newFrame;
 
}
}

11 комментариев »

  • ftx:

    ха! как раз функция myGetBounds будет далеко не тривиальна. Было бы гораздо интереснее увидеть именно ее.

    кроме того, проверка только по параметру newFrame.overflows может запросто привести к бесконечному циклу.

  • admin:

    Не могли бы вы привести поправки к приведенной функции или вашу собственную функцию, решающую подобную задачу, лишенную указанного вами недостатка возможного зацикливания?

  • ftx:

    Если говорить о чем-то боле-менее пригодном к практическому использованию, то:
    — newFrame.geometricBounds — координаты фрейма относительно левого верхнего угла _разворота_: для левых страниц, правых с парной левой и единственной правой надо рассчитывать разное смещение.
    — нужно учитывать, что пользователи ожидают симметричных полей относительно корешка, еще лучше если они будут совпадать с установками «Margins & Columns»;
    — если pg.marginPreferences.columnCount больше единицы неплохо бы добавлять на полосу не один, а соответствующее количество фреймов.

    Что касается зацикливания. При выходе из цикла надо обязательно проверять есть ли в последнем фрейме вообще что-нибудь:

    overset = newFrame.overflows && newFrame.contents.length;

    возможно, он оказался слишком мал для размещения очередного элемента!

  • rdomino:

    У меня не срабатывает скрипт этот в CS4, попробовал уже и с 3мя фреймами связанными и с одним большим на странице.
    Хочу сделать следующее: На странице имеется 3 колонки связанного текста (фреймов) при переполнении их добавлялась новая страница с тремя фреймами и тд.

  • admin:

    Надо смотреть конкретно как вы там всё делаете. Присылайте свой ф-л индизайна и скрипт. Почему 3 колонки на странице, а не один трехколоночный фрейм? Это чем-то обусловлено?

  • rdomino:

    Я еще не знаю всех тонкостей индиза) Сделал так: разметку на Мастер пейдже (3 колонки, поля и тд), новая страница сразу идет с полями. Затем разместил фрейм текстовый в одну колонку и так в две других. Справочник делаю. И связал эти три фрейма. Пока все без циклов и прочего, просто создать разметку мастер пейджа, создать 3 фрейма, связать, импортировать текст.

  • admin:

    Думаю, легче и быстрее верстать будет с одним трехколоночным фреймом.Да и тот кусок скрипта рассчитан на один фрейм на странице.

  • rdomino:

    Спасибо. Узнал, что текст. фреймы разбиваются на колонки) А как прописать в скрипте разбитие? (свойства текстовых фреймов) Я так создавал фрейм:
    var myTextFrameA = myDocument.pages.item(0).textFrames.add();
    myTextFrameA.geometricBounds = [Y1, X1, Y2, X2];

    Можете подсказать литературу по скриптам, только не Борисова — скрипты в индиз для лен…. Кроме нее ничего не находит) А в ней половина не работает. (у меня cs4)

  • rdomino:

    Всё, сделал разбиение) вопрос отпадает) Остается про литературу, и как заставить скрипт выше сработать, чтобы увидеть его функциональность? (создать фрейм и тп?)

  • admin:

    Литературы, кроме известного Борисова, на русском языке больше не издавалось. Ищите в интернете по языку JavaScript уроки и учебники. Их много. По программированию в Индизайне выходила книга на английском Питера Карела (Peter Kahrel). Хорошо также будет найти «Уроки Бутрина». Они есть в интернете, и сейчас уже бесплатные. Проработайте также те материалы (pdf), которые поставляются вместе с Индизайном — ScriptingGuide,ScriptingTutorial,JavaScriptToolsGuide. Объектную модель Индизайна можно скачать отсюда: http://www.jongware.com/idjshelp.html. Очень полезно читать форум по скриптингу на ruDTP.ru. Ну и разбирать по косточкам написанные мастерами скрипты.

  • admin:

    Ну примерно так
    var StartPage = 2;
    var myDoc = app.activeDocument;
    // Создаем текстовый фрейм на странице, задаем его св-ва
    var myPage = myDoc.pages.item(StartPage);
    var myTextFrame = myPage.textFrames.add();
    var myTFBounds = myGetBounds(myDoc, myPage);
    with(myTextFrame)
    {
    geometricBounds = myTFBounds;
    textFramePreferences.textColumnCount = 3;
    textFramePreferences.textColumnGutter = 12;
    textFramePreferences.insetSpacing = [0, 0, 0, 0];
    }
    var myFile = getFile(); // выбираем ф-л для импорта
    // Помещаем внешний файл myTextFrame.parentStory.insertionPoints.item(-1).place(myFile, false, {autoflowing:true, retainingFormatting:true});
    AutoFlowDocument(myDoc, myTextFrame);

Оставить комментарий!

Вы должны быть в системе чтобы оставить комментарий.