Вставить в индизайн вставить вектор

Обновлено: 04.07.2024

Новичек в InDesign, только вчера открыл первый раз. Есть макет в иллюстраторе. надо его вставить в индизайн. Вставляю copy>paste. Возникают такие вещи - картинки вставляются как встроенные в документ, а хотелось бы что бы они были так же линкованы, как и в иллюстраторском файле; текст слетает весь - ладно если бы он просто шрифт не понимал, а то вставляет другим шрифтом и в кривых. Решил в иллюстраторском файле текст перевести в кривые и так копировать - файл ИнДизайна разрастается до жутких размеров.
Как вообще правильно делать?

Guest

Вообще то Индизайн нормально понимает родной формат Илюстратора. Просто сохрани файл в *.ai и Индизайном открой!

Guest

эээ.. не получается. File>Open не поддерживает файлы .ai ругается и пишет ошибку. Может я чего-то не так делаю ((( мож плагин какой нужен.

vainerman

Пользователь сайта
Guest

а если я хочу, что бы можно было редактировать (хотя бы просто двигать) объекты прямо в InD, а не обращаясь к edit original.

Guest

Сначала надо определиться нужны линки или нет. А то получается слишком много хотите, и чтобы линк, и чтобы не линк, а можно было редактировать.
Нужен линк - линкуй, не нужен линк - не линкуй. Собирай сразу в ИД.
==
говорять, Корел фсё могёт?

Mike Udin

Активный участник
Guest

объясню еще раз - есть странички в иллюстраторе - текст и прилинкованые картинки. Хочется - на страничках в индизайне получить точно такие же странички, то есть если картинки прилинкованы, то пусть будут прилинкованы (хотя это не главное - смогу вставить картинки в инд сам, но не хочется этого делать), если текст - то текст(хотя вроде в мануале прочитал, что так не получиться, все-равно будет в кривых). главное - что бы выглядело также как в иллюстраторе, и чтобы можно было потом двигать объекты с полосы на полосу. Если делать File>Place документ *.ai, то я могу двигать только страницы целиком, а мне надо элементы этих страниц. воот.

Задача - сделать все это с минимальным затратом сил. 144 полосы как никак ж)). где же эта хваленая совместимость иллюстратор - индизайн. я так на нее расчитываю ))

InDesign импортирует векторную графику в форматах EPS, AI, PDF, WMF. С параметрами импортирования форматов EPS и AI вы уже знакомы. Импортированные иллюстрации становятся едиными объектами в InDesign и не редактируются его средствами. Вы можете применять к ним только обычные операции трансформирования: перемещение, поворот, масштабирование и наклон.

Импортирование этих форматов через системный буфер или перетаскивание мышью дает иной результат. Объекты, входящие в иллюстрацию, становятся редактируемыми инструментами рисования InDesign. Хотя такой путь представляется более гибким, следует учитывать неполную совместимость объектов InDesign и программ иллюстрирования, даже Adobe Illustrator. Применять импортирование через буфер обмена и перетаскиванием можно только для объектов, не содержащих градиенты и градиентные сетки. Эти типы заливок не поддерживаются при импортировании через буфер обмена. Особые объекты Adobe Illustrator при импорте через буфер обмена преобразуются в простые:

  • Перетекания (blend) разбиваются на отдельные объекты, как это делает команда Expand в Adobe Illustrator.
  • Художественные кисти (brush) преобразуются в группу объектов со сплошной заливкой.
  • Узорные заливки (pattern) преобразуются в отдельные объекты, как это делает команда Expand в Adobe Illustrator.
  • Текстовые блоки импортируются как обычные объекты. К ним можно применять любые операции трансформирования, но нельзя редактировать ни как текст, ни как контуры.

Аналогичным образом импортируются объекты и из Macromedia Freehand. Единственное отличие состоит в том, что градиентные заливки из Freehand автоматически разбиваются на серию фигур со сплошной заливкой. При импорте объектов с градиентной заливкой из Adobe Illustrator заливка меняется на сплошную черную. Если вы все-таки хотите импортировать градиентную заливку из Adobe Illustrator, то примените к ней предварительно команду Expand.


При импорте векторных иллюстраций все использованные в них цвета тоже импортируются в документ и попадают в палитру Swatches. Подробно об определении цветов рассказывается в главе 4.

В силу указанных выше ограничении применяйте импортирование векторных изображений через буфер обмена, только если собираетесь их редактировать и они достаточно просты. В противном случае удобнее пользоваться командой Place. Тогда вы не сможете редактировать контуры инструментами InDesign, но при импорте не потеряете никакие детали иллюстрации.

Изображения в форматах AI и EPS, помещенные в публикацию командой Place, не показываются на экране непосредственно. Вместо самих контуров вы видите всего лишь точечную миниатюру того, что действительно находится в файле. Как правило, этого вполне достаточно для успешной работы с макетом. Точечная миниатюра, как правило, находится в самом файле с иллюстрацией, но если ее нет, то InDesign автоматически создаст экранное представление иллюстрации при импорте. Кроме удобства размещения изображения, это обеспечивает и возможность распечатки макета на принтере, не поддерживающем язык PostScript.

Формат PDF тоже основан на языке PostScript, но, в отличие от EPS и А1, поддерживает многостраничные документы. Это учитывает фильтр импорта, диалоговое окно которого приведено на рис. 12.6. Кнопки, расположенные под областью предварительного просмотра, позволяют выбрать для размещения в публикации нужную страницу документа PDF. В отличие от фильтра импорта PDF в Photoshop, InDesign умеет самостоятельно генерировать изображение страницы для предварительного просмотра. Поэтому вы можете не беспокоиться о фактическом существовании миниатюр страниц в файле документа PDF. Миниатюры страниц показываются в левой части диалогового окна фильтра импорта.

Рис. 12.6. Диалоговое окно

Список Crop to в области Options позволяет выбрать ту часть страницы, которая должна быть размещена в публикации:

  • Content. Все, что изображено на странице, включая типографские метки.
  • Art. Только та часть страницы, которая определена как размещаемый рисунок средствами Adobe Acrobat 4.x или Acrobat Exchange 3-х.
  • Crop. Часть страницы, ограниченная метками границ иллюстрации. Такие метки (crop marks) можно создать, например, в Adobe Illustrator.
  • Trim. Часть страницы, ограниченная метками обрезки (trim marks). Их также можно создать в Adobe Illustrator.
  • Bleed. Вся площадь, находящаяся внутри меток обрезки, плюс та, что идет навыпуск.
  • Media. Вся физическая страница документа, включая поля.

Если в области Options установлен флажок Transparent Background, то после размещения документа на странице области, не закрытые объектами, будут прозрачными. В противном случае вся страница документа PDF будет иметь в InDesign сплошной белый фон.

Документ PDF может содержать информацию о растрировании. Сохранить ее в InDesign позволяет флажок Preserve Halftone Screens. Разумеется, эта информация имеет смысл только для принтеров, имеющих интерпретатор PostScript.


Текущая версия InDesign не позволяет импортировать документы в формате PDF с возможностью редактирования. Поэтому вместо векторных объектов вы видите на экране точечное изображение, представляющее содержимое документа.

Единственный не основанный на PostScript формат, который способен импортировать InDesign, это метафайлы Windows. Этот формат широко используется для обмена графической информацией между офисными приложениями в среде этой операционной системы. Еще раз напомним, что формат WMF хорош для офисных приложений, но неприменим при подготовке макетов для полиграфии. Он не поддерживает непосредственно кривые Безье, градиентные заливки, именованные цвета, и пр. Тем не менее. если вы намерены, например, разместить в публикации диаграмму Microsoft Excel, то естественнее всего это сделать именно в формате WMF. Только не забывайте при этом, что вы не можете контролировать цвет с помощью системы управления цветом для графики в этом формате. При размещении в публикации метафайлов Windows InDesign создает точечное изображение. позволяющее видеть их содержимое.

DELETED

Тимур Корхов

DELETED

На счет качетва не согласен. если сложный, мелкий вектор то через буфер теряются некторые узлы. так что осторожно с этим. Всегда лучше проверить, после такой операции.

Maria Franka

cs3 все отлично работает с вектором. я обычно копи-пейст делаю, хоть говорят, что это и неправильно, но из иллюстратора делаю только так.

DELETED

а ведь с другой стороны, если там какой-нить значок, какая-нибудь блямбочка, которая в разных местах налеплена, то лучше через файл. так в файлике заменил и везде оно поменялось

Иван Артамонов

Лучше всего делать .eps и ложить в макет. Кстати, можно даже не через буфер (копировать-вставить), а просто перетащив объект из Иллюстратора в InDesign. Как правило, ничего не теряется, даже цвета сохраняются очень хорошо. InDesign конечно не чета илюстратору, поэтому редактировать формы лучше там. Кстати, хорошо работает и обратное перетаскивание. Ни разу не встречал проблем.

Дмитрий Казаков

а в чём собстна проблема редактить в иллюстраторе? один клик на эдит линк и правь, что надо) сэйв-апдейт и все дела)

Тимур Корхов

DELETED

Подскажите пожалуйста. Есть векторный рисунок в Corel DRAW. Как его вставить в InDesign без потери качества? Чтобы и при печати на бумагу он выглядел так же, как в Corel.

Тимур Корхов

Элементарно. Сохраняешь, как иллюстрацию Adobe Illustrator. Открываешь ее в самом Иллюстраторе, проверяешь, что потерялось или изменилось, исправляешь. Потом вставляешь в ИндИз. И в итоге удаляешь Корел Драв.

DELETED

Хм. "проверяешь, что потерялось или изменилось, исправляешь".
А так, чтобы без потерялось, изменилось, исправляешь - нельзя? Я пробовала так делать, у меня, к примеру, искажаются контуры.

Тимур Корхов

Елена Осипова

Создали вектор в ai Перетаскиваю в power point как обычно (в прее работаю с веторами так: открываю в иллюстраторе, дальше мышкой перетаскиваю е в power point, вуаля, получили рисунок Далее нажимаем расгруппировть, вуаля, получили расгруппированные элементы), а рисунок искажается: вместо окружностей деформированные пятиугольники, ничего не расгруппировывается В чем может быть проблема?

Приветствую всех хабражителей!
Сначала небольшое лирическое отступление. Этот пост был написан не мной, а пока еще незахабренным upd: уже захабренным viklequick, и, на мой взгляд, заслуживает вашего внимания со всеми вытекающими. Итак…

image

Однажды в студеную зимнюю пору надоело автору добру молодцу бороться с векторными картинками в формате EPS. И решил он идти в ногу с прогрессом и встраивать графики и диаграммы в документы Adobe InDesign в виде SVG. И тут постигло его разочарование великое, ибо фирма Adobe Systems предпочитает свой Adobe Flash, а в Adobe InDesign поддержка SVG отсутствует на корню. Однако ж у добра молодца накопился знатный опыт создания плагинов под InDesign и решил он применить свою силушку богатырскую и забороть гидру трехглавую. Богатырь сказал – богатырь сделал, а именно — заборол.
О деталях этой борьбы и поведем наш сказ.

Шаг первый, или Изучаем анатомию гидры трехглавой

image

Для начала, необходимо вкратце упомянуть о том, как InDesign работает с картинками.
C точки зрения InDesign картинки — это специальный вид PageItem, который умеет сам себя отрисовывать и печатать. А этот самый PageItem может быть положен на страницу, или как inline во фрейм, или в ячейку таблицы, и все это надо уметь обрабатывать. И еще, отрисовка бывает трех видов — быстрая (рисуется перечеркнутый прямоугольник), оптимальная (растровый proxy image), и полная (медленная). Необходимо все это также поддерживать.
Таким образом, у нас вырисовывается Import Plug-in, Page Item и несколько вспомогательных классов, вот так:

Class
kSVGPlaceProviderBoss,
kInvalidClass,
IID_IK2SERVICEPROVIDER, kImportServiceImpl,
IID_IIMPORTPROVIDER, kSVGPlaceProviderImpl,
IID_IIMPORTPREVIEW, kSVGImportPreviewImpl,
>
>,

И, разумеется, есть еще стандартная шапка на предмет startup / shutdown, которую нет смысла приводить.
Давайте разберемся, что это и зачем.
• IID_ISHAPE — это реализация собственно page item, ведающая отрисовкой.
• IID_IINKRESOURCES — обрабатываем ссылки на внешние файлы (Ink).
• IID_IFLATTENERUSAGE — обрабатываем растеризацию альфа-канала в PDF. Собственно, это одна строчка, явно требующая включения flattener, и не более того.
• IID_IVISITORHELPER — оставляем стандартным, позаимствовав у EPS.
• IID_ISCRIPT — обеспечиваем поддержку нашего элемента через скриптинг. Это тоже очень простая часть, всего лишь корректно задающая тип объекта.
• IID_IK2SERVICEPROVIDER и IID_IIMPORTPROVIDER — добавляем поддержку для команды Place.
• IID_IIMPORTPREVIEW — и обеспечиваем предпросмотр в диалоге выбора файлов (Windows specific).
Наиболее интересным является собственно IID_ISHAPE, это сердце нашего плагина. От него требуется умение рисовать самого себя непосредственно по IGraphicsPort, а также получение растрового proxy image. Забегая вперед, хочу отметить — сюрпризов было в достаточном количестве.

Шаг второй, или Выбираем меч богатырский

image

Экспресс-гугление, а также просмотр образцов картинок из OpenClipArt навел меня на мысль остановиться на Apache Batik. Сразу скажу, пришлось приложить некоторые усилия для починки самого Batik, но они в итоге оказались незначительны. В основном свелись к «угадай версию SVG по содержимому». Однако появилась задача «как отрисовать батиком картинку по IGraphicsPort», на ней мы и сосредоточимся, как на самой сложной. И будем перемещаться от скучных материй С++ к веселому креативу Java и обратно.
Однако ж менестрели позорные нам скажут – это ты, богатырь, не в ту сказку забрел, и получишь в итоге пять метров колючей проволоки, как всегда и бывает при скрещивании ежа с ужом. Опыт, сын ошибок трудных, нас учит – в данном случае получается нечто более полезное.

image

Шаг третий, или Приступаем к поединку
Как уже упоминалось выше, надо научить Java работать с потоками Индизайна. Собственно, задача очевидна и решается через JNI:

/**
* Class for reading from InDesign IPMStream
*/
public class PMInputStream extends InputStream
/**
* Creates PMInputStream object and attaches it to IPMStream* already
* opened by InDesign.
* @param iPMStreamPtr IPMStream* to attach to
* @throws IOException The stream has no ability to read.
*/
public PMInputStream(long iPMStreamPtr) throws IOException this.ownedStreamPtr = iPMStreamPtr;
this.retain();
>

@Override
public int read() throws IOException return readByte();
>

@Override
public int read(byte b[], int off, int len) throws IOException if (len == 0) return 0;
return readBytes(b, off, len);
>

@Override
public long skip(long n) throws IOException return performSeek(n, SeekFromCurrent);
>

public long seek(long numberOfBytes, int fromHere) throws IOException return performSeek(numberOfBytes, fromHere);
>

@Override
public int available() return availableBytes();
>

// native functions below
.

Реализация строится через native функции, приведем их список. Они самоочевидны и особых комментариев не требуют. Есть только один интересный момент, вот он:

/**
* 'Cause IPMStream is a COM-like object we gotta call AddRef() for it
* if we wanna save pointer in our class.
*/
private native void retain();
/**
* Once we called AddRef() we shouldn't forget calling corresponding
* Release(). Let's do it!
*/
private native void release();

protected native int readByte();
protected native int readBytes(byte b[], int off, int len);
protected native long performSeek(long numberOfBytes, int fromHere);
protected native int availableBytes();

protected native String getFileName();
protected native long getLastModifiedTime();

Две последних функции были добавлены для кэширования элементов непосредственно в Java, чтобы не строить заново DOM-модели на каждую отрисовку. Надо всего лишь отслеживать изменения данных и оперативно перечитывать их при изменении.
И последний штрих — собственно реализация native методов.

class IPMStream; class PMInputStream
private:
IPMStream* fStream;

public:
PMInputStream(IPMStream* stream);

int read() <
unsigned char result;
return read(&result, 1) == 1? result: -1;
>

int read(unsigned char* buffer, int len)< return fStream->XferByte(buffer, len); >
XInt64 seek(XInt64 numberOfBytes, SeekFrom fromHere) <
return fStream->Seek((int32)numberOfBytes, fromHere);
>

public:
enum SeekFrom < SeekFromStart = kSeekFromStart,
SeekFromCurrent = kSeekFromCurrent,
SeekFromEnd = kSeekFromEnd
>;
>;

Мы уже добрались до SVG, но теперь появляется задача получить и нарисовать картинку. Собственно, нарисовав векторную картинку в BufferedImage, мы и получаем наш proxy image. Стандартный пример из батика нам наглядно показывает, каким образом он получен, поэтому для экономии места позволю себе эту портянку тут не приводить. Очевидно также использование PixelGrabber для получения массива байтов в RGB из BufferedImage. Полученный массив мы передаем в AGMImageRecord точно так же, как рассмотрено во второй части статьи.
Интересно, что отрисовка на IGraphicsPort вместо BufferedImage отличается ровно одной строчкой, вместо стандартного offscreen Graphics2D нам надо подставить свою реализацию. Этим мы и займемся.

Шаг четвертый, или Коварно подключаем к мечу электроток, чтобы искры летели
Объем кода для грамотного наследования Graphics2D велик, зануден, но очевиден, и его легко можно подсмотреть у того же Apache Batik. Поэтому мы сосредоточимся на наиболее интересных частях, а вот целую пачку геттеров и сеттеров а-ля Paint getPaint() < return paint; >опустим.
Отмечу лишь, что в общем можно смело вставлять заглушки такого вида:

public void fillRect(int x, int y, int w, int h)

В результате таких вот упрощений и изничтожения дубликатов, у нас реальных функций получается вот сколько:

public void draw(Shape s);
public void fill(Shape s);
public boolean drawImage(Image img, int x, int y, int width, int height, Color bgcolor, ImageObserver observer);

public void drawString(String str, float x, float y);
public void drawString(AttributedCharacterIterator iterator, float x, float y);

Можно пойти дальше, использовав StrokeTextPainter, и этот набор сократится до трех функций, что радует.
Теперь подойдем с другой стороны, и посмотрим что нам надо от IGraphicsPort:

private native void newpath();
private native void moveto(float x, float y);
private native void lineto(float x, float y);
private native void curveto(float x1, float y1, float x2, float y2, float x3, float y3);
private native void curvetov(float x2, float y2, float x3, float y3);
private native void closepath();

private native void gsave();
private native void grestore();

private native void setlinewidth(float width);
private native void setdash(int len, float[] dashArray, float offset);
private native void setopacity(float opacity, boolean bIsAlphaShape); // from 0 to 1.0
private native void setrgbcolor(float r, float g, float b);

private native void fill();
private native void eofill();
private native void stroke();

private native void image(int[] buffer, int x, int y, int width, int height, double[] transformMatrix);

private native void clip();
private native void eoclip();

Опытным взглядом можно заметить явное отсутствие таких средств отрисовки, как градиенты. Увы, документация на эту часть API у Adobe настолько скудна, что мне так и не удалось воспользоваться наличествующими функциями, пришлось шаманить, как будет рассмотрено ниже.
Как видно, надо нам немного. Однако возникает новая задача: нам надо как-то все это дело теперь совместить. Начнем с простого — с геометрических фигур.
Самое сложное здесь — это развернуть shape из Java в набор native функций. Для этого воспользуемся стандартным PathIterator, ну и при этом не забываем про трансформации, ибо Batik использует AffineTransform весьма активно:

private void applyPath(PathIterator pi, int kind) float[] coord = new float[6];
int retSeg;

newpath();
while(!pi.isDone()) retSeg = pi.currentSegment(coord);
switch (retSeg) case SEG_LINETO:
lineto(coord[0], coord[1]);
break;
case SEG_CUBICTO:
curveto(coord[0], coord[1], coord[2], coord[3], coord[4], coord[5]);
break;
case SEG_MOVETO:
moveto(coord[0], coord[1]);
break;
case SEG_QUADTO:
curvetov(coord[0], coord[1], coord[2], coord[3]);
break;
case SEG_CLOSE:
closepath();
break;
>
pi.next();
>

if(kind == PATH_FILL) if(pi.getWindingRule() == PathIterator.WIND_EVEN_ODD) eofill();
else fill();
>
else if(kind == PATH_STROKE) stroke();
else if(kind == PATH_CLIP) if(pi.getWindingRule() == PathIterator.WIND_EVEN_ODD) eoclip();
else clip();
>
>

Теперь мы можем легко рисовать примитивы:

image

public void draw(Shape s) PathIterator pi = s.getPathIterator(getTransform());
applyClip(getClip());
applyStroke(s);
applyStyles();
applyPath(pi, PATH_STROKE);
restoreClip();
>

Пока что не будем акцентироваться на всяческих apply*, они рассмотрены далее. Собственно говоря, fill() выглядит точно так же, если не считать некоторых трудностей с градиентами. Как нетрудно догадаться, applyClip() также реализуется аналогично:

private void applyClip(Shape xclip) gsave();
if(xclip != null) PathIterator pi = xclip.getPathIterator(getTransform());
applyPath(pi, PATH_CLIP);
>
>

Реальный код чуть сложнее, приходится учитывать особенности реализации flattener в IGraphicsPort, и по мере необходимости обход переворачивать, чтобы обход пути шел против часовой стрелки. И, как и упоминалось ранее, Batik прекрасно умеет текст векторизовать в набор глифов, поэтому о работе со шрифтами можно не беспокоиться. Так что текст у нас неизбежно становится набором геометрических фигур.

Читайте также: