Является ли Indesign Ole-сервером?

  • Автор темы alexey
  • Дата начала
Статус
Закрыто для дальнейших ответов.
A

alexey

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

demoded

Можно ли управлять 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.';
 
M

morpheus

Для: demoded
Очень рад за вас , но не стоит подимать столь старые темы . <!--QuoteBegin-alexey+9:12:2005, 15:00 -->
<span class="vbquote">(alexey @ 9:12:2005, 15:00 )</span><!--QuoteEBegin-->9:12:2005, 15:00[/quote]
Думаю за 2 года человек уже нашёл рещение своей проблемы )))
 
A

alexey

Для: demoded
Очень рад за вас , но не стоит подимать столь старые темы .
Думаю за 2 года человек уже нашёл рещение своей проблемы )))
:lol:
Еще не нашел :D
Если серьезно - то вопрос с автоматизацией отошел на второй план, кроме того было много теории и только сейчас дошли до стадии запуска практики. И опять всплыла та же проблема - передача данных в Indesign. И как раз именно сейчас :)
Самоке смешное - поиск в инете ведет на первой странице на это мое сообщение двухлетней давности, как будто этим больше никто не занимается :)
 
A

alexey

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

demoded

Вот-вот - самое оно!
А картинку вставить?
А ты с шаблоном не разбирался? Т.е. у меня задача такая - есть готовый шаблон, подготовленный дизайнерами, теперь его надо заполнить давными, причем самое сложное - привязаться к сетке - текстовой(кажется так называется). Проблема в том что я 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;
 
A

alexey

Благодарю, сейчас попробую в действии.
Насчет подписывания мне уже советовали, но пока не использовал.
У меня есть файл с описанием структуры объектов Indesign - COM - 3 версии, но описание очень приличное поэтому все никак не могу найти время чтобы его изучить, да и очень уж оно объемное, когда нужно сделать простые вещи.
Насчет Script гляну. Мне крайне интересно - можно ли передать картинку через OLE или ее обязательно надо выгружать в файл.
 
A

alexey

Решил таки отписаться и заодно задать вопрос.
В общему случае все получилось, причем ничего не надо вручную копировтаь - как и подозревал сам Indesign прекрасно это делает - мастер-шаблон. Все остальное вытягивается из документации.
Но вот пришлось с CS3 перейти на CS - т.к. CS3 не умеет правильно создавать PS файлы для типографии, точнее создает но с ошибками.
И возникла проблема - элементы из библиотеки не ставятся в нужное место. В CS3 все работает красиво и аккуратно, а в CS1 не выставляется высота элемента, координаты по высоте вообще странно - выбирает минимальное значение по обоим точкам и его берет за берет границу, с шириной вроде нормально, хотя может попадать не на ту страницу. Может кто сталкивался?
 
Z

zubr

Работал с CS2 - все нормально работает.
 
A

alexey

Работал с CS2 - все нормально работает.
Вот такой код в CS2 работает или будет работать?:

[codebox]
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.Name;
if ANSIUpperCase(AName)=ANSIUpperCase(AssetName)
then Result:=Lib.Assets;
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;
[/codebox]
Document и PlaceTo - это фактически и есть текущий документ. TFRect - тот же Rect, только поля - типа extended.
Это мой вариант функции вставки библиотечного элемента, для CS3 работает без вопросов. В CS1 как описал выше. Правда вариант кода для CS2 я тут не описал, не знаю как там правильно, но можно попробовать оба для CS1({$DEFINE CS1}) или CS3 ({$DEFINE CS3}).
Да - сама библиотека должн быть уже открыта.
 
Z

zubr

Припоминаю (давновато было) с VarArrayOf у меня Indesign не хотел корректно работать. Я делал VarArrayCreate([0, 3], varInteger);
 
A

alexey

Припоминаю (давновато было) с VarArrayOf у меня Indesign не хотел корректно работать. Я делал VarArrayCreate([0, 3], varInteger);
Не смог сразу ответить.
Попробовал, не помогло, та же картина.
А в CS2 дизайнеры не хотят работать, говорят что интерфейс слишком сильно отличается от CS и CS3. Да и не факт что CS2 корректно выдаст PS файлы.
 
Статус
Закрыто для дальнейших ответов.
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!