2014-12-06 1 views
1

У меня есть таблица в документе InDesign. Я добавлю встроенное изображение в первую ячейку.Как добавить встроенную графику программно в ячейку таблицы в InDesign

var myPics = File("/c/test.png"), 
myDoc = app.activeDocument, 
myPage = myDoc.pages[0], 
myTable = myDoc.stories.everyItem().tables[0], 
myCell = myTable.cells[0]; 

myCell.contents = myPics; 

Ожидается, что изображение должно быть помещено в ячейку, но вместо этого будет заполнен адрес файла. Что мне делать?

ответ

2

Текстовые объекты contents в InDesign не являются точными эквивалентами фактического отформатированного исходного текста InDesign; они всегда отбрасываются в простые текстовые строки Javascript и из них. Чтение contents отбрасывает все текстовые атрибуты InDesign (например, форматирование текста, гиперссылки, закладки, XML-маркеры и все метаобъекты, такие как изображения); и запись contents заполняет пункт назначения простым текстом, отформатированным по умолчанию форматирования текстового контейнера в месте размещения текста.

Вы не можете сохранить PNG-файл «в» переменной Javascript; а не как объект File (он не будет разбираться в содержимом фактического файла), а не как «изображение» (содержимое будет рассматриваться как текстовая строка, а не «что-то»).

Правильный способ заключается в использовании place, который может работать на InDesign документа в целом, в этом случае файл будет импортирован непосредственно «на» странице, или с помощью текстового расположения с помощью апробированной собственности такой как его insertionPoints:

var myPics = File("/c/test.png"), 
myDoc = app.activeDocument, 
myPage = myDoc.pages[0], 
myTable = myDoc.stories.everyItem().tables[0], 
myCell = myTable.cells[0]; 

myCell.insertionPoints[0].place(myPics); 

Если вы хотите убедиться, что содержимое myCell пуст перед установкой, вы можете добавить

if (myCell.texts[0].length > 0) 
    myCell.texts[0].remove(); 

Предупреждение о вашем использовании everyItem(): при использовании таким образом, это живая коллекция. Коллекция действует как массив, за исключением того, что каждый элемент коллекции «рассматривается» как единственный объект. Таким образом, вы можете сделать что-то вроде

myTable.cells.everyItem().contents = "hello!"; 

и текст будет отображаться в каждой отдельной клетке, из команды everyItem(). Но, так как вы уже создали коллекцию таблиц - myDoc.stories.everyItem().tables[0] будет список «» первой таблицы в все историй текущего документа - вы найдете, к своему удивлению, что все из они внезапно будут содержать hello.

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

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

myTable = myPage.stories[0].tables[0];