JavaScript: aвтоматическое добавление страниц
— Как организовать автоматическое добавление страниц в документ, если текст не помещается во фрейме?
После заполнения текстового фрейма содержимым, например из файла, вызываем эту функцию, которая добавляет новые страницы в конец документа с текстовыми фреймами на них.
Новые страницы с фреймами генерируются до тех пор, пока параметр 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; } } |
ха! как раз функция myGetBounds будет далеко не тривиальна. Было бы гораздо интереснее увидеть именно ее.
кроме того, проверка только по параметру newFrame.overflows может запросто привести к бесконечному циклу.
Не могли бы вы привести поправки к приведенной функции или вашу собственную функцию, решающую подобную задачу, лишенную указанного вами недостатка возможного зацикливания?
Если говорить о чем-то боле-менее пригодном к практическому использованию, то:
— newFrame.geometricBounds — координаты фрейма относительно левого верхнего угла _разворота_: для левых страниц, правых с парной левой и единственной правой надо рассчитывать разное смещение.
— нужно учитывать, что пользователи ожидают симметричных полей относительно корешка, еще лучше если они будут совпадать с установками «Margins & Columns»;
— если pg.marginPreferences.columnCount больше единицы неплохо бы добавлять на полосу не один, а соответствующее количество фреймов.
Что касается зацикливания. При выходе из цикла надо обязательно проверять есть ли в последнем фрейме вообще что-нибудь:
overset = newFrame.overflows && newFrame.contents.length;
возможно, он оказался слишком мал для размещения очередного элемента!
У меня не срабатывает скрипт этот в CS4, попробовал уже и с 3мя фреймами связанными и с одним большим на странице.
Хочу сделать следующее: На странице имеется 3 колонки связанного текста (фреймов) при переполнении их добавлялась новая страница с тремя фреймами и тд.
Надо смотреть конкретно как вы там всё делаете. Присылайте свой ф-л индизайна и скрипт. Почему 3 колонки на странице, а не один трехколоночный фрейм? Это чем-то обусловлено?
Я еще не знаю всех тонкостей индиза) Сделал так: разметку на Мастер пейдже (3 колонки, поля и тд), новая страница сразу идет с полями. Затем разместил фрейм текстовый в одну колонку и так в две других. Справочник делаю. И связал эти три фрейма. Пока все без циклов и прочего, просто создать разметку мастер пейджа, создать 3 фрейма, связать, импортировать текст.
Думаю, легче и быстрее верстать будет с одним трехколоночным фреймом.Да и тот кусок скрипта рассчитан на один фрейм на странице.
Спасибо. Узнал, что текст. фреймы разбиваются на колонки) А как прописать в скрипте разбитие? (свойства текстовых фреймов) Я так создавал фрейм:
var myTextFrameA = myDocument.pages.item(0).textFrames.add();
myTextFrameA.geometricBounds = [Y1, X1, Y2, X2];
Можете подсказать литературу по скриптам, только не Борисова — скрипты в индиз для лен…. Кроме нее ничего не находит) А в ней половина не работает. (у меня cs4)
Всё, сделал разбиение) вопрос отпадает) Остается про литературу, и как заставить скрипт выше сработать, чтобы увидеть его функциональность? (создать фрейм и тп?)
Литературы, кроме известного Борисова, на русском языке больше не издавалось. Ищите в интернете по языку JavaScript уроки и учебники. Их много. По программированию в Индизайне выходила книга на английском Питера Карела (Peter Kahrel). Хорошо также будет найти «Уроки Бутрина». Они есть в интернете, и сейчас уже бесплатные. Проработайте также те материалы (pdf), которые поставляются вместе с Индизайном — ScriptingGuide,ScriptingTutorial,JavaScriptToolsGuide. Объектную модель Индизайна можно скачать отсюда: http://www.jongware.com/idjshelp.html. Очень полезно читать форум по скриптингу на ruDTP.ru. Ну и разбирать по косточкам написанные мастерами скрипты.
Ну примерно так
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);