Помощник
Здравствуйте, гость ( Вход | Регистрация )
|
|
9:12:2005, 13:00
|
|
Новенький ![]() Группа: Программист Сообщений: 33 Регистрация: 30:04:2004 Пользователь №: 470 Репутация: 0
|
Можно ли управлять InDesign-ом через OLE?
И другими Adobe-вскими штучками? Сообщение отредактировал alexey - 9:12:2005, 14:24 |
|
Сообщение
#1
|
|
![]() |
|
|
19:12:2007, 10:06
|
|
Новенький ![]() Группа: Программист Сообщений: 2 Регистрация: 19:12:2007 Пользователь №: 14 333 Репутация: 0
|
Можно ли управлять InDesign-ом через OLE? И другими Adobe-вскими штучками? какраз этим сейчас и занимаюсь Код IDApp:=CreateOleObject('Indesign.Application');
IDDoc:= IDApp.Documents.Add; IDText:=IDDoc.pages.item(1).textFrames.add; IDText.geometricBounds:=VarArrayOf([0,72,288,288]); IDText.contents := 'This is some example text.'; |
|
Сообщение
#2
|
|
|
|
19:12:2007, 10:08
|
|
очень злой модератор ![]() ![]() ![]() ![]() ![]() Группа: Lotus team Сообщений: 2 666 Регистрация: 7:08:2006 Из: Украина, Киев Пользователь №: 5 807 Специализация: разработчик всякой хрени Репутация: 46
|
Для: demoded
Очень рад за вас , но не стоит подимать столь старые темы . Цитата(alexey @ 9:12:2005, 15:00 ) 9:12:2005, 15:00 Думаю за 2 года человек уже нашёл рещение своей проблемы ))) |
|
Сообщение
#3
|
|
|
|
14:02:2008, 10:44
|
|
Новенький ![]() Группа: Программист Сообщений: 33 Регистрация: 30:04:2004 Пользователь №: 470 Репутация: 0
|
Для: demoded Очень рад за вас , но не стоит подимать столь старые темы . Думаю за 2 года человек уже нашёл рещение своей проблемы ))) Еще не нашел Если серьезно - то вопрос с автоматизацией отошел на второй план, кроме того было много теории и только сейчас дошли до стадии запуска практики. И опять всплыла та же проблема - передача данных в Indesign. И как раз именно сейчас Самоке смешное - поиск в инете ведет на первой странице на это мое сообщение двухлетней давности, как будто этим больше никто не занимается |
|
Сообщение
#4
|
|
|
|
14:02:2008, 10:58
|
|
Новенький ![]() Группа: Программист Сообщений: 33 Регистрация: 30:04:2004 Пользователь №: 470 Репутация: 0
|
какраз этим сейчас и занимаюсь Код IDApp:=CreateOleObject('Indesign.Application'); IDDoc:= IDApp.Documents.Add; IDText:=IDDoc.pages.item(1).textFrames.add; IDText.geometricBounds:=VarArrayOf([0,72,288,288]); IDText.contents := 'This is some example text.'; Вот-вот - самое оно! А картинку вставить? А ты с шаблоном не разбирался? Т.е. у меня задача такая - есть готовый шаблон, подготовленный дизайнерами, теперь его надо заполнить давными, причем самое сложное - привязаться к сетке - текстовой(кажется так называется). Проблема в том что я Indesign практически не знаю, т.е. смотрю как в нем работают, но это и все.... |
|
Сообщение
#5
|
|
|
|
19:02:2008, 10:32
|
|
Новенький ![]() Группа: Программист Сообщений: 2 Регистрация: 19:12:2007 Пользователь №: 14 333 Репутация: 0
|
Вот-вот - самое оно! А картинку вставить? А ты с шаблоном не разбирался? Т.е. у меня задача такая - есть готовый шаблон, подготовленный дизайнерами, теперь его надо заполнить давными, причем самое сложное - привязаться к сетке - текстовой(кажется так называется). Проблема в том что я Indesign практически не знаю, т.е. смотрю как в нем работают, но это и все.... картинку вставлять не пробовал. все брал из SDK, который свободно доступен на сайте adobe. больше всего пригодилось это InDesign CS2 Scripting Reference.pdf с шаблоном в принципе все просто, пусть дизайнеры в шаблоне заполняемые места подпишут ключевыми словами например %NAME%. ты потом открываешь из программы в этом документе Story и заменяешь все ключевики на то что нужно. в стори представлен только текст из TextFrame. можно и так, через Find/Replace The following script fragment shows how to find a specified string of text and replace it with a different string (for the complete script, see ChangeText): //Clear the find/change preferences. app.findTextPreferences = NothingEnum.nothing; app.changeTextPreferences = NothingEnum.nothing; //Set the find options. app.findChangeTextOptions.caseSensitive = false; app.findChangeTextOptions.includeFootnotes = false; app.findChangeTextOptions.includeHiddenLayers = false; app.findChangeTextOptions.includeLockedLayersForFind = false; app.findChangeTextOptions.includeLockedStoriesForFind = false; app.findChangeTextOptions.includeMasterPages = false; app.findChangeTextOptions.wholeWord = false; //Search the document for the string "copy" and change it to "text". app.findTextPreferences.findWhat = "copy"; app.changeTextPreferences.changeTo = "text"; app.documents.item(0).changeText(); //Clear the find/change preferences after the search. app.findTextPreferences = NothingEnum.nothing; app.changeTextPreferences = NothingEnum.nothing; |
|
Сообщение
#6
|
|
|
|
19:02:2008, 15:14
|
|
Новенький ![]() Группа: Программист Сообщений: 33 Регистрация: 30:04:2004 Пользователь №: 470 Репутация: 0
|
Благодарю, сейчас попробую в действии.
Насчет подписывания мне уже советовали, но пока не использовал. У меня есть файл с описанием структуры объектов Indesign - COM - 3 версии, но описание очень приличное поэтому все никак не могу найти время чтобы его изучить, да и очень уж оно объемное, когда нужно сделать простые вещи. Насчет Script гляну. Мне крайне интересно - можно ли передать картинку через OLE или ее обязательно надо выгружать в файл. |
|
Сообщение
#7
|
|
|
|
7:05:2008, 16:20
|
|
Новенький ![]() Группа: Программист Сообщений: 33 Регистрация: 30:04:2004 Пользователь №: 470 Репутация: 0
|
Решил таки отписаться и заодно задать вопрос.
В общему случае все получилось, причем ничего не надо вручную копировтаь - как и подозревал сам Indesign прекрасно это делает - мастер-шаблон. Все остальное вытягивается из документации. Но вот пришлось с CS3 перейти на CS - т.к. CS3 не умеет правильно создавать PS файлы для типографии, точнее создает но с ошибками. И возникла проблема - элементы из библиотеки не ставятся в нужное место. В CS3 все работает красиво и аккуратно, а в CS1 не выставляется высота элемента, координаты по высоте вообще странно - выбирает минимальное значение по обоим точкам и его берет за берет границу, с шириной вроде нормально, хотя может попадать не на ту страницу. Может кто сталкивался? |
|
Сообщение
#8
|
|
|
|
7:05:2008, 21:54
|
|
Божественный ![]() ![]() ![]() ![]() ![]() Группа: Модеры Сообщений: 899 Регистрация: 19:11:2003 Пользователь №: 133 Репутация: 11
|
Работал с CS2 - все нормально работает.
|
|
Сообщение
#9
|
|
|
|
12:05:2008, 11:27
|
|
Новенький ![]() Группа: Программист Сообщений: 33 Регистрация: 30:04:2004 Пользователь №: 470 Репутация: 0
|
Работал с CS2 - все нормально работает. Вот такой код в CS2 работает или будет работать?: CODE function GetGeometricBounds(Bound:TFRect):Olevariant; begin Result:=VarArrayOf([Bound.Top,Bound.Left,Bound.Bottom,Bound.Right]); end; function GetIndesignLibraryAsset(Indesign:OleVariant; LibraryName, AssetName:string):OleVariant; var lib:OleVariant; i:integer; AName:string; begin Result:=Null; lib := GetIndesignLibrary(Indesign,LibraryName); for i:=1 to Lib.Assets.Count do begin AName:=Lib.Assets[i].Name; if ANSIUpperCase(AName)=ANSIUpperCase(AssetName) then Result:=Lib.Assets[i]; end; end; function PlaceIndesignAsset(Indesign, Document, PlaceTo : OleVariant; page_n:integer; Bound:TFRect; LibraryName, AssetName:string):OleVariant; var Asset:OleVariant; page:OleVariant; p:Olevariant; bounds:OleVariant; begin Asset:=GetIndesignLibraryAsset(Indesign, LibraryName, AssetName); page:=Document.pages[page_n]; Result:=Asset.PlaceAsset(PlaceTo); {$IFDEF CS3} Result.Item[Result.Count].Move(page); p:=VarArrayOf([Bound.Left, Bound.Top]); Result.Item[Result.Count].Move(p); bounds:=GetGeometricBounds(Bound); Result.Item[Result.Count].GeometricBounds:=bounds; {$ENDIF} {$IFDEF CS1} p:=VarArrayOf([Bound.Left, Bound.Top]); Result.Item[Result.Count].Move(page,p); bounds:=GetGeometricBounds(Bound);//правильно, но не работает или bounds:=OleVariant(VarArrayOf([Bound.Bottom,Bound.Left,Bound.Bottom+1,Bound.Righ t]));// неправильно, но зато выставляет нижнюю границу корректно Result.Item[Result.Count].GeometricBounds:=bounds; {$ENDIF} end; Document и PlaceTo - это фактически и есть текущий документ. TFRect - тот же Rect, только поля - типа extended. Это мой вариант функции вставки библиотечного элемента, для CS3 работает без вопросов. В CS1 как описал выше. Правда вариант кода для CS2 я тут не описал, не знаю как там правильно, но можно попробовать оба для CS1({$DEFINE CS1}) или CS3 ({$DEFINE CS3}). Да - сама библиотека должн быть уже открыта. |
|
Сообщение
#10
|
|
|
|
12:05:2008, 16:23
|
|
Божественный ![]() ![]() ![]() ![]() ![]() Группа: Модеры Сообщений: 899 Регистрация: 19:11:2003 Пользователь №: 133 Репутация: 11
|
Припоминаю (давновато было) с VarArrayOf у меня Indesign не хотел корректно работать. Я делал VarArrayCreate([0, 3], varInteger);
|
|
Сообщение
#11
|
|
|
|
Вчера, 21:01
|
|
Новенький ![]() Группа: Программист Сообщений: 33 Регистрация: 30:04:2004 Пользователь №: 470 Репутация: 0
|
Припоминаю (давновато было) с VarArrayOf у меня Indesign не хотел корректно работать. Я делал VarArrayCreate([0, 3], varInteger); Не смог сразу ответить. Попробовал, не помогло, та же картина. А в CS2 дизайнеры не хотят работать, говорят что интерфейс слишком сильно отличается от CS и CS3. Да и не факт что CS2 корректно выдаст PS файлы. |
|
Сообщение
#12
|
|
![]() |
|
Текстовая версия | Сейчас: 17:05:2008 - 06:34 |