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

Тема в разделе "Delphi - СОМ", создана пользователем alexey, 9 дек 2005.

Статус темы:
Закрыта.
  1. alexey

    alexey Гость

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

    demoded Гость

    какраз этим сейчас и занимаюсь
    Код (Text):
    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.';
     
  3. morpheus

    morpheus скриптописец

    Регистрация:
    7 авг 2006
    Сообщения:
    3.927
    Симпатии:
    0
    Для: 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 года человек уже нашёл рещение своей проблемы )))
     
  4. alexey

    alexey Гость

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

    alexey Гость

    Вот-вот - самое оно!
    А картинку вставить?
    А ты с шаблоном не разбирался? Т.е. у меня задача такая - есть готовый шаблон, подготовленный дизайнерами, теперь его надо заполнить давными, причем самое сложное - привязаться к сетке - текстовой(кажется так называется). Проблема в том что я Indesign практически не знаю, т.е. смотрю как в нем работают, но это и все.... :) А автоматизировать нужно.....
     
  6. demoded

    demoded Гость

    картинку вставлять не пробовал. все брал из 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;
     
  7. alexey

    alexey Гость

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

    alexey Гость

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

    zubr Гость

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

    alexey Гость

    Вот такой код в 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}).
    Да - сама библиотека должн быть уже открыта.
     
  11. zubr

    zubr Гость

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

    alexey Гость

    Не смог сразу ответить.
    Попробовал, не помогло, та же картина.
    А в CS2 дизайнеры не хотят работать, говорят что интерфейс слишком сильно отличается от CS и CS3. Да и не факт что CS2 корректно выдаст PS файлы.
     
Загрузка...
Статус темы:
Закрыта.

Поделиться этой страницей