Версия для печати темы
Форум программистов _ Delphi - СОМ _ Является ли Indesign Ole-сервером?
Автор: alexey 9:12:2005, 13:00
Можно ли управлять InDesign-ом через OLE?
И другими Adobe-вскими штучками?
- пока разбирался с PageMakerom выяснилось что от него уже почти отказались - переходим на InDesign
Автор: demoded 19:12:2007, 10:06
Цитата(alexey @ 9:12:2005, 19:00 )

Можно ли управлять InDesign-ом через OLE?
И другими Adobe-вскими штучками?

- пока разбирался с PageMakerom выяснилось что от него уже почти отказались - переходим на InDesign
какраз этим сейчас и занимаюсь
Код
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.';
Автор: Morpheus 19:12:2007, 10:08
Для: demoded
Очень рад за вас , но не стоит подимать столь старые темы .
Цитата(alexey @ 9:12:2005, 15:00 )
9:12:2005, 15:00
Думаю за 2 года человек уже нашёл рещение своей проблемы )))
Автор: alexey 14:02:2008, 10:44
Цитата(Morpheus @ 19:12:2007, 12:08 )

Для: demoded
Очень рад за вас , но не стоит подимать столь старые темы .
Думаю за 2 года человек уже нашёл рещение своей проблемы )))
Еще не нашел

Если серьезно - то вопрос с автоматизацией отошел на второй план, кроме того было много теории и только сейчас дошли до стадии запуска практики. И опять всплыла та же проблема - передача данных в Indesign. И как раз именно сейчас
Самоке смешное - поиск в инете ведет на первой странице на это мое сообщение двухлетней давности, как будто этим больше никто не занимается
Автор: alexey 14:02:2008, 10:58
Цитата(demoded @ 19:12:2007, 12:06 )

какраз этим сейчас и занимаюсь
Код
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 практически не знаю, т.е. смотрю как в нем работают, но это и все....

А автоматизировать нужно.....
Автор: demoded 19:02:2008, 10:32
Цитата(alexey @ 14:02:2008, 16:58 )

Вот-вот - самое оно!
А картинку вставить?
А ты с шаблоном не разбирался? Т.е. у меня задача такая - есть готовый шаблон, подготовленный дизайнерами, теперь его надо заполнить давными, причем самое сложное - привязаться к сетке - текстовой(кажется так называется). Проблема в том что я 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;
Автор: alexey 19:02:2008, 15:14
Благодарю, сейчас попробую в действии.
Насчет подписывания мне уже советовали, но пока не использовал.
У меня есть файл с описанием структуры объектов Indesign - COM - 3 версии, но описание очень приличное поэтому все никак не могу найти время чтобы его изучить, да и очень уж оно объемное, когда нужно сделать простые вещи.
Насчет Script гляну. Мне крайне интересно - можно ли передать картинку через OLE или ее обязательно надо выгружать в файл.
Автор: alexey 7:05:2008, 16:20
Решил таки отписаться и заодно задать вопрос.
В общему случае все получилось, причем ничего не надо вручную копировтаь - как и подозревал сам Indesign прекрасно это делает - мастер-шаблон. Все остальное вытягивается из документации.
Но вот пришлось с CS3 перейти на CS - т.к. CS3 не умеет правильно создавать PS файлы для типографии, точнее создает но с ошибками.
И возникла проблема - элементы из библиотеки не ставятся в нужное место. В CS3 все работает красиво и аккуратно, а в CS1 не выставляется высота элемента, координаты по высоте вообще странно - выбирает минимальное значение по обоим точкам и его берет за берет границу, с шириной вроде нормально, хотя может попадать не на ту страницу. Может кто сталкивался?
Автор: zubr 7:05:2008, 21:54
Работал с CS2 - все нормально работает.
Автор: alexey 12:05:2008, 11:27
Цитата(zubr @ 7:05:2008, 23:54 )

Работал с 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}).
Да - сама библиотека должн быть уже открыта.
Автор: zubr 12:05:2008, 16:23
Припоминаю (давновато было) с VarArrayOf у меня Indesign не хотел корректно работать. Я делал VarArrayCreate([0, 3], varInteger);
Автор: alexey 16:05:2008, 21:01
Цитата(zubr @ 12:05:2008, 18:23 )

Припоминаю (давновато было) с VarArrayOf у меня Indesign не хотел корректно работать. Я делал VarArrayCreate([0, 3], varInteger);
Не смог сразу ответить.
Попробовал, не помогло, та же картина.
А в CS2 дизайнеры не хотят работать, говорят что интерфейс слишком сильно отличается от CS и CS3. Да и не факт что CS2 корректно выдаст PS файлы.
Русская версия Invision Power Board (http://www.nulled.ws)
© Invision Power Services (http://www.nulled.ws)